复制到其他工作表时单元格保持空白
Cell Remains Blank When Copying to Other Worksheet
我正在将数据从 Worksheet1 和 Worksheet2 复制到 Worksheet3。
代码遍历工作表 1 中的所需范围,找到 X 并将 X 右侧第 9 行的列的值复制到工作表 3。然后它在 Worksheet2 上做同样的事情。
Dim WrkSht As Worksheet
Dim WrkShtCol As Sheets
Dim cl As range
Dim rw As range
Sub CopyFromSheetsToOtherSheet()
Set WrkShtCol = Worksheets(Array("Worksheet1", "Worksheet"))
For Each WrkSht In WrkShtCol
For Each rw In WrkSht.range(Antwortrange).Rows 'Reihen durchlaufen innerhalb der Antwortrange
For Each cl In rw.Cells
If LCase(cl.Value) = "x" Then
cl.Offset(0, 9).Copy Sheets("Worksheet3").range("A" & Rows.Count).End(xlUp).Offset(1) 'Jede Zelle mit Value "x" 9 Spalten nach rechts auswählen (Handlungsempfehlung), weitergeben
End If
Next cl
Next rw
代码从单元格 A2 开始复制到 Worksheet3,然后是 A3、A4 等等。
我希望它从 A1 开始。第一步为什么不复制到A1?
我稍后使用函数查找空白,因此单元格 A1 中不能有空白。
我确定有更简洁的方法来执行此操作,但首先想到的是在最后一行计算中添加一些条件检查 (lr
)
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Worksheet3")
'For Each cl...
lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1).Row
If lr = 2 And ws.Range("A1") = "" Then lr = 1
cl.Offset(0, 9).Copy ws.Range("A" & lr)
'Next cl...
在这种情况下使用 Offset(1)
时,您将得到两次 lr = 2
。首先是当列为空时,然后是仅使用 A1
时。要解决这个问题,您可以在 lr = 2
时添加一个条件语句来确定要使用的范围
Sheets("Worksheet3").range("A" & Rows.Count).End(xlUp).Offset(1)
如果第一个空白单元格是 A1
,那么由于 Offset(1)
,A1
将始终被跳过。
也许使用这样的辅助函数:
Private Function GetNextAvailableCell( _
ByVal ws As Worksheet, _
ByVal colNumber As Long _
) As Range
With ws
Dim tempRng As Range
Set tempRng = .Cells(.Rows.Count, colNumber).End(xlUp)
End With
If Not IsEmpty(tempRng) Then
Set tempRng = tempRng.Offset(1)
End If
Set GetNextAvailableCell = tempRng
End Function
然后像这样使用它:
cl.Offset(0, 9).Copy GetNextAvailableCell(Sheets("Worksheet3"), 1)
我正在将数据从 Worksheet1 和 Worksheet2 复制到 Worksheet3。
代码遍历工作表 1 中的所需范围,找到 X 并将 X 右侧第 9 行的列的值复制到工作表 3。然后它在 Worksheet2 上做同样的事情。
Dim WrkSht As Worksheet
Dim WrkShtCol As Sheets
Dim cl As range
Dim rw As range
Sub CopyFromSheetsToOtherSheet()
Set WrkShtCol = Worksheets(Array("Worksheet1", "Worksheet"))
For Each WrkSht In WrkShtCol
For Each rw In WrkSht.range(Antwortrange).Rows 'Reihen durchlaufen innerhalb der Antwortrange
For Each cl In rw.Cells
If LCase(cl.Value) = "x" Then
cl.Offset(0, 9).Copy Sheets("Worksheet3").range("A" & Rows.Count).End(xlUp).Offset(1) 'Jede Zelle mit Value "x" 9 Spalten nach rechts auswählen (Handlungsempfehlung), weitergeben
End If
Next cl
Next rw
代码从单元格 A2 开始复制到 Worksheet3,然后是 A3、A4 等等。
我希望它从 A1 开始。第一步为什么不复制到A1?
我稍后使用函数查找空白,因此单元格 A1 中不能有空白。
我确定有更简洁的方法来执行此操作,但首先想到的是在最后一行计算中添加一些条件检查 (lr
)
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Worksheet3")
'For Each cl...
lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1).Row
If lr = 2 And ws.Range("A1") = "" Then lr = 1
cl.Offset(0, 9).Copy ws.Range("A" & lr)
'Next cl...
在这种情况下使用 Offset(1)
时,您将得到两次 lr = 2
。首先是当列为空时,然后是仅使用 A1
时。要解决这个问题,您可以在 lr = 2
时添加一个条件语句来确定要使用的范围
Sheets("Worksheet3").range("A" & Rows.Count).End(xlUp).Offset(1)
如果第一个空白单元格是 A1
,那么由于 Offset(1)
,A1
将始终被跳过。
也许使用这样的辅助函数:
Private Function GetNextAvailableCell( _
ByVal ws As Worksheet, _
ByVal colNumber As Long _
) As Range
With ws
Dim tempRng As Range
Set tempRng = .Cells(.Rows.Count, colNumber).End(xlUp)
End With
If Not IsEmpty(tempRng) Then
Set tempRng = tempRng.Offset(1)
End If
Set GetNextAvailableCell = tempRng
End Function
然后像这样使用它:
cl.Offset(0, 9).Copy GetNextAvailableCell(Sheets("Worksheet3"), 1)