复制值
Replicating values
这里需要一点帮助。
在 "Data" 选项卡中,我想复制 "c2:c1000" 列中的值并粘贴到另一个选项卡的 "a1" 列中。
这是我目前所拥有的,
Dim x As Long
Dim lastRow As Long
lastRow = Worksheet("Data").Cells(3, Columns.Count).End(xlUp).Column
For x = 1 To lastRow
If Worksheets("Sheet2").Cells(2, "A") = "" Then
Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Range(1, "A")
Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss")
Else
Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Cells(2,
Columns.Count).End(xlToLeft).Offset(, 1)
'Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss") --> can't figure how to increment this as this will need to be on the subsequent empty column
End If
Next
End Sub
非常感谢您的帮助!
谢谢。
与源 sheet 的 LastRow
* 变量非常相似,为目标 sheet 创建一个 LastColumn
变量,它将发现最后使用的列相同您找到上次使用的行的方式。
像这样:
Dim LastColumn As Long
LastColumn = Sheets("Audit").Cells(1, Columns.Count).End(xlToLeft).Column
然后像这样使用变量:
Destination:= Worksheets("Audit").Cells(1, LastColumn)
您的代码似乎也与您的问题相矛盾,在您的问题中,您解释说数据将写入第 1 行的审计 sheet,每次都使用下一列,但您的代码在If
语句中的第 2 行:
If Worksheets("Audit").Cells(2, "A") = "" Then
等同于 If Worksheets("Audit").Range("A2") = "" Then
。
如果您要检查第一行,请将 2
更改为 1
。
求助:
(另请参阅该问题中的 link 至 'how to avoid select'):
你可以在不使用 'copy' 和 'paste' 方法的情况下实现 'copy/paste',方法是将一个范围的值分配给另一个范围,例如,如下所示:
Worksheets("Audit").Cells(1, LastColumn).Resize(999, 1) = Worksheets("Data").Range("c2:c1000").Value
注意: 更改 Resize Property 行以适合源范围(在这种情况下,您要移动 C2:C1000 中的值)。
*LastRow
变量有点混乱,因为它正在查找第 3 行中最后使用的列。
如果要查找列,请考虑重命名它以避免以后在调试时混淆。
如果要查找最后一行,请这样尝试:
LastRow = Worksheet("Data").Cells(Rows.Count, 1).End(xlUp).Row
首先将值粘贴到 A1 范围内,然后向下粘贴,然后下一次粘贴到单元格 B1 等等,不会为 A1、B1 等的时间戳留下 space。因此,我假设您想粘贴第 2 行的随机值。因此单元格 A1、B1、... 留作时间戳。
在 With 语句中,我们可以引用 wsAudit 的属性,这样我们就可以替换 "Worksheets("Audit")."仅使用“.”进行引用。
column.count 表达式只检查工作sheet 中的列数。
表达式 .Cells(2, Columns.Count) 仅指向第 2 行中的最后一个单元格。
.End(xlToLeft).Column 然后从该列向左查找,应该找到该行的最后一个非空单元格。这与在 Excel 的 sheet 中您将转到单元格 XDF2 并从键盘按 CTRL+Arrow Left 基本相同。
但不是激活单元格,我们只想获取列索引号,然后加 1(新列)并将其保存到变量中。现在新列是已知的。
表达式 Range(.Cells(2, newColAudit), .Cells(1000, newColAudit)).Value 与例如Range("B2:B1000"),但我们可以使用行和列索引号代替。这在列号变化时很有用。
正如 Samuel 指出的那样,可以通过将区域设置为相等来避免复制粘贴操作。
Dim wsAudit As Worksheet
Dim newColAudit As Long
Set wsAudit = Worksheets("Audit")
With wsAudit
newColAudit = .Cells(2, Columns.Count).End(xlToLeft).Column + 1
Range(.Cells(2, newColAudit), .Cells(1000, newColAudit)).Value = Worksheets("Data").Range("C2:C1000").Value
.Cells(1, newColAudit).Value = Format(Now, "mm/dd/yyyy HH:mm:ss")
End With
这里需要一点帮助。
在 "Data" 选项卡中,我想复制 "c2:c1000" 列中的值并粘贴到另一个选项卡的 "a1" 列中。
这是我目前所拥有的,
Dim x As Long
Dim lastRow As Long
lastRow = Worksheet("Data").Cells(3, Columns.Count).End(xlUp).Column
For x = 1 To lastRow
If Worksheets("Sheet2").Cells(2, "A") = "" Then
Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Range(1, "A")
Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss")
Else
Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Cells(2,
Columns.Count).End(xlToLeft).Offset(, 1)
'Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss") --> can't figure how to increment this as this will need to be on the subsequent empty column
End If
Next
End Sub
非常感谢您的帮助! 谢谢。
与源 sheet 的 LastRow
* 变量非常相似,为目标 sheet 创建一个 LastColumn
变量,它将发现最后使用的列相同您找到上次使用的行的方式。
像这样:
Dim LastColumn As Long
LastColumn = Sheets("Audit").Cells(1, Columns.Count).End(xlToLeft).Column
然后像这样使用变量:
Destination:= Worksheets("Audit").Cells(1, LastColumn)
您的代码似乎也与您的问题相矛盾,在您的问题中,您解释说数据将写入第 1 行的审计 sheet,每次都使用下一列,但您的代码在If
语句中的第 2 行:
If Worksheets("Audit").Cells(2, "A") = "" Then
等同于 If Worksheets("Audit").Range("A2") = "" Then
。
如果您要检查第一行,请将 2
更改为 1
。
求助:
(另请参阅该问题中的 link 至 'how to avoid select'):
你可以在不使用 'copy' 和 'paste' 方法的情况下实现 'copy/paste',方法是将一个范围的值分配给另一个范围,例如,如下所示:
Worksheets("Audit").Cells(1, LastColumn).Resize(999, 1) = Worksheets("Data").Range("c2:c1000").Value
注意: 更改 Resize Property 行以适合源范围(在这种情况下,您要移动 C2:C1000 中的值)。
*LastRow
变量有点混乱,因为它正在查找第 3 行中最后使用的列。
如果要查找列,请考虑重命名它以避免以后在调试时混淆。
如果要查找最后一行,请这样尝试:
LastRow = Worksheet("Data").Cells(Rows.Count, 1).End(xlUp).Row
首先将值粘贴到 A1 范围内,然后向下粘贴,然后下一次粘贴到单元格 B1 等等,不会为 A1、B1 等的时间戳留下 space。因此,我假设您想粘贴第 2 行的随机值。因此单元格 A1、B1、... 留作时间戳。
在 With 语句中,我们可以引用 wsAudit 的属性,这样我们就可以替换 "Worksheets("Audit")."仅使用“.”进行引用。
column.count 表达式只检查工作sheet 中的列数。 表达式 .Cells(2, Columns.Count) 仅指向第 2 行中的最后一个单元格。 .End(xlToLeft).Column 然后从该列向左查找,应该找到该行的最后一个非空单元格。这与在 Excel 的 sheet 中您将转到单元格 XDF2 并从键盘按 CTRL+Arrow Left 基本相同。 但不是激活单元格,我们只想获取列索引号,然后加 1(新列)并将其保存到变量中。现在新列是已知的。 表达式 Range(.Cells(2, newColAudit), .Cells(1000, newColAudit)).Value 与例如Range("B2:B1000"),但我们可以使用行和列索引号代替。这在列号变化时很有用。
正如 Samuel 指出的那样,可以通过将区域设置为相等来避免复制粘贴操作。
Dim wsAudit As Worksheet
Dim newColAudit As Long
Set wsAudit = Worksheets("Audit")
With wsAudit
newColAudit = .Cells(2, Columns.Count).End(xlToLeft).Column + 1
Range(.Cells(2, newColAudit), .Cells(1000, newColAudit)).Value = Worksheets("Data").Range("C2:C1000").Value
.Cells(1, newColAudit).Value = Format(Now, "mm/dd/yyyy HH:mm:ss")
End With