Excel Range менее неуклюжий - PullRequest
       1

Excel Range менее неуклюжий

0 голосов
/ 08 декабря 2018

Будучи старой собакой (73 года), изучающей новые трюки (Excel VBA), я вполне доволен написанием кода ниже.Но я думаю, что это может быть чище.Как бы вы это закодировали?

Dim thisDate As Double  'start timestamp
thisDate = Now()
With Sheets("Pressure Log")
    lastRow = .Range("B" & .Rows.Count).End(xlUp).Row     'populate next row with date/time
    .Range("B" & lastRow + 1 & ":G" & lastRow + 1).Borders.LineStyle = xlContinuous
    .Range("B" & lastRow).Offset(1) = Format(thisDate, "dddd")
    .Range("B" & lastRow).Offset(1, 1) = Format(thisDate, "mm/dd/yyyy")
    .Range("B" & lastRow).Offset(1, 2) = Format(thisDate, "hh:mm AM/PM")
    .Range("B" & lastRow).Offset(1, 3).Select 'position for data    
End With
End Sub

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018
Option Explicit
Private Const SHEET_NAME As String = "Pressure Log"
' Or change sheet name in Properties window from Sheet1 to wksPressureLog,
' otherwise any sheet renaming will result in code crash
'
' Another optimization - is to assign column positions to constants
' for example column B here is used 3 times, if you'll decide to modify
' table - you'll have to find and change all these 3 instances, and in big 
' scripts it will be hard enough to understand what each number means

' Execute only once
Sub FormatColumns()
    With Sheets(SHEET_NAME)
        .Cells(1, 2).EntireColumn.NumberFormat = "dddd"
        .Cells(1, 3).EntireColumn.NumberFormat = "mm/dd/yyyy"
        .Cells(1, 4).EntireColumn.NumberFormat = "hh:mm AM/PM"
    End With
End Sub

Sub InsertData()
    With Sheets(SHEET_NAME)
        With .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row + 1, 2)
            .Resize(1, 5).Borders.LineStyle = xlContinuous
            .Resize(1, 3) = Now()
            .Offset(0, 3).Select 'position for data
        End With
    End With
End Sub
0 голосов
/ 08 декабря 2018

Я думаю, что вопросы такого рода предназначены для CodeReview.Вы можете получить лучший ответ там.

Я не уверен, что моя версия обязательно лучше:

Option Explicit

Private Sub AddCurrentDateTimeAfterLastRow()
    Dim thisDate As Double
    thisDate = Now()

    With ThisWorkbook.Worksheets("Pressure Log")
        Dim lastRow As Long
        lastRow = .Range("B" & .Rows.Count).End(xlUp).Row

        Dim outputArray() As Variant
        ReDim outputArray(1 To 3)

        outputArray(1) = Format(thisDate, "dddd")
        outputArray(2) = Format(thisDate, "mm/dd/yyyy")
        outputArray(3) = Format(thisDate, "hh:mm AM/PM")

        With .Cells(lastRow + 1, "B").Resize(1, UBound(outputArray))
            .Borders.LineStyle = xlContinuous
            .FormulaLocal = outputArray
            .Parent.Parent.Activate
            .Parent.Activate
            .Cells(1, 3).Select
        End With
    End With
End Sub
  • Поставьте Option Explicit перед вашим кодом, чтобы гарантировать, что все переменные объявлены,(Возможно, у вас уже было это, я не знаю. Кажется, отсутствует начало вашего кода.)
  • Квалифицируйте рабочую книгу (например, Thisworkbook или Set ссылка на нее), в противном случае этопредполагается, что он активен во время выполнения кода.
  • Насколько я понимаю, Sheets может относиться к обычным рабочим листам и диаграммам, тогда как Worksheets может относиться только к рабочим листам.Поэтому было бы хорошо, если бы вы были явными и просто использовали Worksheets.
  • Поскольку вы хотите, чтобы макрос (в конце) выбирал ячейку, важно, чтобы рабочая таблица и рабочая книга (которые содержат эту ячейку)активны во время выбора.В противном случае вы рискуете получить ошибку.
  • Я поместил ваш день, дату и время в массив, а затем записал указанный массив на лист.Я просто думал, что назначения элементов массива были короче и чище (для чтения и обслуживания).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...