Как я могу получить полное возвращаемое значение из адресного метода?

#excel #vba #string #string-length

#excel #vba #строка #длина строки

Вопрос:

У меня есть столбец данных на листе 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 символов, как я могу получить полный список ячеек, которые мне нужно исключить из моего столбца времени, чтобы иметь непрерывный столбец данных?

Комментарии:

1. Зачем вообще использовать адрес? У вас уже есть объект Range, поэтому просто просмотрите его коллекцию Areas и удалите диапазон смещения для каждой области.

2. @Rory — Это хороший намек. Спасибо!

Ответ №1:

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

 For Each cell In Range("B2:B" amp; Cells(Rows.Count, "B").End(xlUp).Row)
    If cell = "" Then
        cell.Offset(, -1).Clear
    End If
Next cell
  

Комментарии:

1. Итак, с подсказкой от @rory я получил следующий код: Set rngDeleteCells = sht . Неуклюжие (n). Специальные ячейки (xlTypeBlanks) Для каждого delRange в rngDeleteCells. Области destSht.Range(delRange. Смещение (0, n-1). Адрес). Очистить Nest delRange

Ответ №2:

Вы можете сделать это с 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
  

Ответ №3:

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

 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 за их помощь.