Как я могу изменить это свойство смещения? - PullRequest
0 голосов
/ 05 октября 2018

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

'Write the employee data into the template
a = 0
For k = 2 To UBound(Data, 2)
  Dest.Offset(a, j) = Data(i, k)
  a = a + 1
Next

Я предполагаю, что именно свойство dest.offset является причиной транспонирования, как бы я изменил это, чтобы просто перемещать массив нормально без транспонирования?

Остальная часть сценария:

Option Explicit

Sub Main()
  Dim Wb As Workbook
  Dim Data, Last
  Dim i As Long, j As Long, k As Long, a As Long
  Dim Dest As Range

  'Refer to the template
  Set Wb = Workbooks("ValidationTemplate.xlsx")
  'Refer to the destination cell
  Set Dest = Wb.Sheets("Employee Core Skills").Range("B3")
  'Read in all data
  With ThisWorkbook.Sheets("Sheet1")
    Data = .Range("DO2", .Range("A" & Rows.Count).End(xlUp))
  End With
  Wb.Activate
  Application.ScreenUpdating = False

  'Process the data
  For i = 1 To UBound(Data)
    'Manager changes?
    If Data(i, 1) <> Last Then
      'Skip the first
      If i > 1 Then
        'Scroll into the view
        Dest.Select
        'Save a copy
        Wb.SaveCopyAs ThisWorkbook.Path & Application.PathSeparator & _
          ValidFileName(Last & "_Assessment.xlsx")
      End If
      'Clear the employees
      Dest.Resize(, Columns.Count - Dest.Column).EntireColumn.ClearContents
      'Remember this manager
      Last = Data(i, 1)
      'Start the next round
      j = 0
    End If
    'Write the employee data into the template
    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
  Next
End Sub

1 Ответ

0 голосов
/ 05 октября 2018

Если я правильно понимаю ваш вопрос ...

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

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