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