Excel vba для чередования значений ячеек - PullRequest
0 голосов
/ 14 марта 2020

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

Sub MergeColumnsAlternating()
  Dim total, i, rowNum As Integer

  total = 4 '' whatever number of rows you need to merge.
  i = 1

  For rowNum = 1 To total
    Range("D" & i) = Range("A" & rowNum)
    i = i + 1
    Range("D" & i) = Range("B" & rowNum)
    i = i + 1
    Range("D" & i) = Range("C" & rowNum)
    i = i + 1
  Next rowNum
End Sub

Спасибо

1 Ответ

0 голосов
/ 15 марта 2020

A Range - это коллекция Cells. Самая маленькая коллекция состоит из одного предмета. Следовательно, одиночный Cell также является `Range '.

Вы можете определить Range по его адресу, по заданному имени или по адресу его первого и последнего Cell s. A1: D4 использует этот последний метод. VBA принимает этот метод адресации и может обрабатывать его как имя, например Range("A1:D4"). Тот же синтаксис может быть использован для определения одного диапазона ячеек, например Range("A1"), и именно здесь начинаются ваши проблемы.

Определяя Cell как Range, вы отказываетесь от преимущества, предлагаемого VBA. в обмен на воспринимаемую простоту обработки ячеек и диапазонов, как в Excel. В итоге вы получаете смесь типа Range("A" & i) и, логически неизбежный, вопрос о том, как вы можете поместить столбец в переменную. Конечно, это тоже можно сделать. Но гораздо более простой способ - обращаться к ячейкам как к ячейкам, а не как к диапазонам.

A Cell является членом коллекции Cells. Такая коллекция включает в себя все клетки в определенном диапазоне. Worksheets("Sheet1").Cells определяет коллекцию всех ячеек в Worksheet ("Sheet1") . Просто Cells определяет коллекцию всех ячеек в ActiveSheet. Внутри коллекции ячейка определяется своими координатами: Cells([Row], [Column]). Это отличается от ссылки на ячейку по имени диапазона на уровне листа, где столбец определяется первым. Cells(4, 1) указывает на ячейку A4. Поэтому это альтернатива Range("A" & 4). Это точнее, быстрее обрабатывать, и обе координаты полностью заменяемы для вычисляемых переменных. Например, выясните, какие ячейки определены здесь: -

Dim R As Long
Dim MyCell As Range
R = 8
Set myCell = Cells(R, Cells(4, 1).Value)
' or
Dim Temp As Variant
Temp = Cells(R, Cells(4, 1).Value).Value

В обоих случаях строка ячейки определяется переменной R (обычно счетчик al oop, когда вы go через столбец значений), в то время как столбец определяется значением A4. Вы можете видеть, что Cells(4, 1) также может быть определено переменными. Следует отметить, что A4 может содержать номер столбца или буквы, определяющие столбец (например, «A» или «AB»). И я обращаю ваше особое внимание на тот факт, что первый пример определяет ячейку - диапазон - в то время как второй просто принимает Value этого диапазона. Это очень распространенная, иногда противоречивая тема, о которой вам полезно знать.

Ваш код Range("D" & i) = Range("A" & rowNum) прыгает прямо в середине этого противоречия. Диапазон в столбце D сделан равным диапазону в столбце A, и вопрос заключается в том, означает ли это, что одна ячейка будет равна другой или одна ячейка принимает просто Value от другой. Value является свойством по умолчанию Range (то есть VBA будет предполагать его, если он опущен), и VBA обычно определяет вероятное значение в зависимости от типа данных принимающей переменной. В этом случае получатель является Range объектом. Поэтому весь объект Range должен быть скопирован, и очевидный вопрос заключается в том, почему не использовался метод Copy. (Фактически, чтобы назначить объект объекту, требуется инструкция Set. Поскольку в вашем коде она опущена, вполне вероятно, что будет скопировано только Value. Код неоднозначен, и разные версии Excel могут выполнить его в другими способами.)

Теперь, как присвоение всех свойств (или его Value) одного диапазона другому может привести к "MergeColumnAlternating", выше моего уровня оплаты. Но, возможно, приведенный выше ответ на ваш вопрос позволит вам разобраться в своем коде. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...