Если я правильно понимаю ваш вопрос ...
Dest.Offset(a, j)
Значит использовать Range
, на который указывает Range Object
, называемый Dest
, затем смещение оттуда a
строк(положительный - вниз по электронной таблице, отрицательный - вверх по электронной таблице) и столбцы j
(положительные справа, отрицательные слева).
Если вы просто хотите поместить данные в Range
на Dest
, затем просто пропустите часть .Offset()
следующим образом:
Dest.value2 = Data(i,k).value2
Примечание: .Value
является элементом по умолчанию, на который ссылаются при выходе из неговыкл, ссылаясь только на Dest
.Всегда лучше указывать, а не оставлять на усмотрение VBA, чтобы понять, что вы имеете в виду.Зачем использовать .Value2
вместо .Value
?Прочитайте этот ТАК вопрос и принятый ответ .
Транспозиция происходит здесь из-за порядка a
и j
.
a = 0
For k = 2 To UBound(Data, 2)
Dest.Offset(a, j) = Data(i, k)
a = a + 1
Next
End If
'Next column
j = j + 1
Это действительнотрудно сказать из-за неясных имен переменных.
Если вы переименуете свои переменные следующим образом:
Dim I as Long --> Dim sourceRow as Long
Dim K as Long --> Dim sourceCol as Long
Dim A as Long --> Dim destRow as Long
Dim J as Long --> Dim destCol as Long
Вы увидите, как они используются в настоящее время, и что вы хотите сделать, это поменять destRow
наdestCol
.
Переписав этот код с новыми именами переменных, вы получите:
destRow = 0
For sourceCol = 2 To UBound(Data, 2)
Dest.Offset(destRow, destCol) = Data(sourceRow, sourceCol)
destRow = destRow + 1
Next
End If
'Next column
destCol = destCol + 1
, и теперь вы можете гораздо легче увидеть, что ваш цикл увеличивает ваш sourceCol
и ваш destRow
.Если вы теперь измените это на:
destRow = 0
For sourceCol = 2 To UBound(Data, 2)
Dest.Offset(destRow, destCol).Value2 = Data(sourceRow, sourceCol).Value2
destCol = destCol + 1
Next
End If
'Next column
destRow = destRow + 1
Вы увидите, что цикл теперь увеличивает оба столбца source и dest.Теперь вам просто нужно изменить инкременты во внешнем цикле, чтобы обновить строки в синхронизации, и вы должны быть хорошими.
Это замечательный объектный урок о том, почему хорошие имена для кода "вещи"невероятно ценны.Как только я разобрался с a
, i
, j
& k
, это стало очевидным.Похоже, вы не оригинальный автор этого кода, но даже если это так, все в порядке.Большинство из нас начинают с ужасных названий вещей, а затем постепенно узнают, насколько ценны хорошие имена.Стоит реорганизовать код для улучшения этих и других имен.
Быстрый бесстыдный плагин для плагина Rubberduck для VBE.Я большой поклонник и начинаю вносить свой вклад в проект.Это позволит вам рефакторинг вашего кода путем интеллектуального переименования переменных.Как вы можете себе представить, выполняя поиск и замену i
на sourceRow
w sourceRow
ll g sourceRow
ve вам какой-то серьёзно sourceRow
зловредный код!Rubberduck избежит этой проблемы и добавит множество многих дополнительных функций, которые вы скоро удивитесь, как вы раньше жили без