Как я могу получить полное возвращаемое значение из метода адреса? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть столбец данных на листе Excel, в котором распределены пустые ячейки.У меня есть соответствующий столбец информации о дате / времени, в котором нет пустых ячеек.Мне нужно удалить из столбца даты / времени те элементы, которые соответствуют пустым ячейкам в столбце данных.например, мне нужно удалить элементы времени для 5 и 9.

Time Data
   1    1
   2    2
   3    3
   4    4
   5
   6    5
   7    6
   8    7
   9
  10    8   
  11    9
  12   10

Используя VBA, я сгенерировал список пустых ячеек в столбце данных с этим кодом:

deleteCells = sht.Columns(n).SpecialCells(xlCellTypeBlanks).Address _
    RowAbsolute:=False, ColumnAbsolute:=False

и затем я удаляю сопутствующие элементы столбца времени со следующим кодом.

destSht.Range(deleteCells).Offset(0, n - 1).Clear
destSht.Columns(2*n-1).SpecialCells(xlCellTypeConstants).Copy _
    Destination:=destSht.Columns(tempcol)
destSht.Columns(tempcol).Copy Destination:=destSht.Columns(2*n-1)`

(Смещение означает удаление одного столбца слева от заданной ссылки, следующие две строки затем копируют данные ввременно и в процессе закройте пробелы, созданные в столбце, затем скопируйте его обратно.)

Но возвращаемая строка для deleteCells усекается до 256 символов (Len (deleteCells) => 256).Это не охватывает все ссылки на ячейки, которые мне нужно удалить.

Как получить адрес, чтобы он возвращал более длинную строку?Если при этом не будет возвращено более 256 символов, как я могу получить полный список ячеек, которые мне нужно исключить из моего столбца Time, чтобы иметь непрерывный столбец Data?

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

@ Рори предлагает вам сделать что-то вроде этого ... Измените значение смещения буквы столбца по мере необходимости.Примечание. Если вы используете отрицательное число, которое сместится за пределы поля A, вы получите ошибку.

For Each cell In Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    If cell = "" Then
        cell.Offset(, -1).Clear
    End If
Next cell
0 голосов
/ 11 апреля 2019

Я отправляю «Ответ», чтобы получить правильное форматирование и выложить свое окончательное решение:

rngDeleteCells = sht.Columns(n).SpecialCells(xlCellTypeBlanks)
For Each delRange In rngDeleteCells.Areas
    destSht.Range(delRange.Offset(0, n - 1).Address).Clear
Next delRange

Я должен использовать .Address для каждого delRange, чтобы я мог затемсмещение в другой столбец на другом листе для удаления.

Спасибо @rory и @GMalc за помощь.

0 голосов
/ 10 апреля 2019

Это можно сделать с помощью метода AutoFilter и SpecialCells:

Возможно, вам придется изменить таблицу и ссылки на ячейки в коде в зависимости от того, где находится ваша таблица:

Option Explicit
Sub delRowsWithBlanks()
    Dim R As Range, WS As Worksheet
    Dim rArea As Range, lrowCount As Long

Set WS = Worksheets("sheet3")
With WS
    Set R = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(columnsize:=2)
End With

R.AutoFilter field:=2, Criteria1:="="
lrowCount = 0
    For Each rArea In R.SpecialCells(xlCellTypeVisible).Areas
        lrowCount = lrowCount + rArea.Rows.Count
    Next rArea

If lrowCount > 1 Then 'assumes header row
    R.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If

R.AutoFilter

End Sub
...