gpt4 book ai didi

vba - 我怎样才能扭转这个偏移属性?

转载 作者:行者123 更新时间:2023-12-04 20:04:44 26 4
gpt4 key购买 nike

我有要移动到模板中的数据,并且我正在尝试重新调整我使用的 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

最佳答案

如果我正确理解你的问题...

Dest.Offset(a, j)

表示使用 RangeRange Object 引用调用 Dest , 然后从那里偏移 a行(正数位于电子表格下方,负数位于电子表格上方)和 j列(右侧为正,左侧为负)。

如果你只想把数据放在 RangeDest 指向, 然后简单地省略 .Offset()像这样的部分:
Dest.value2 = Data(i,k).value2

注: .Value是当您通过仅引用 Dest 将其关闭时引用的默认成员.最好指定而不是让 VBA 来弄清楚你的意思。为什么使用 .Value2而不仅仅是 .Value ?阅读本文 SO question and the accepted answer .

由于 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

您会看到这就是它们当前的使用方式,并且您想要做的是交换 destRowdestCol .

用新的变量名重写该代码会给你:
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

您会看到循环现在正在递增源和目标列。现在您只需要更改外部循环中的增量器以同步更新行,您应该会很好。

这是 很棒对象教训为什么代码“事物”的好名字非常有值(value)。一旦我整理出 a , i , j & k ,这很明显。看来您不是此代码的原始作者,但即使您是,也没关系。我们大多数人一开始都是用可怕的名字命名的,然后随着时间的推移慢慢地了解好名字的值(value)。重构代码以改进这些名称和其他名称是非常值得的。

Rubberduck plugin 的快速无耻插头对于 VBE。我是一个 super 粉丝,也开始为这个项目做出贡献。它将允许您通过智能地重命名变量来重构代码。可以想象,搜索和替换 isourceRow w sourceRow ll g sourceRow给你一些服务 sourceRow严重损坏的代码! Rubberduck 将避免这个问题并添加许多更多功能,您很快就会想知道如果没有这些功能您将如何生活!

关于vba - 我怎样才能扭转这个偏移属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52666342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com