【问题标题】:Cell Remains Blank When Copying to Other Worksheet复制到其他工作表时单元格保持空白
【发布时间】:2023-04-11 02:48:01
【问题描述】:

我正在将 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 中有空白。

【问题讨论】:

  • Sheets("Worksheet3").range("A" & Rows.Count).End(xlUp).Offset(1) - Offset(1) 表示如果A1 是第一个单元格,A2 将是复制到的单元格。
  • 嗯 好的,但问题是我需要 Offset(1) 以便在每一行被填满后,下一行被填满,依此类推。我怎样才能在仍然从 Cell A1 开始的同时保持这个?
  • 你可以测试End(xlUp).Row的结果是否=1。
  • 好吧,我明白了,但是我在哪里测试它,如果它是/不是 1,我该怎么办?如果它是 1,那么删除第一个单元格,将下面的单元格向上移动,这样我就可以删除空单元格 A1 并使所有内容都向上移动一行?我不确定

标签: excel vba loops worksheet copying


【解决方案1】:
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)

【讨论】:

  • 谢谢,已经使用了 urdearboys 的答案,但这是相同的方法,可能也可以!请参阅我对他的评论的回答以了解后续问题,但已经感谢,原始问题已解决! :)
  • @Leon - 对于您的后续问题,您可以使用上面的辅助函数,然后在调用时使用变量而不是 1。然后在Next cl 之后将该变量加一。或者在 urdearboy 的回答中使用 Cells 而不是 Range
  • 所以对于 urdearboys 来说,你的意思是 Range 而不是 Cell,所以 lr = ws.range("A" & ws.Rows.Count).End(xlUp).Offset(1).Row 但是在复制一个工作表后如何进入下一列?对不起,我有点困惑,但我不能感谢你花时间帮助我:)
  • lr = ws.Cells(ws.Rows.Count, 1).End(xlUp) - 使用Cells,而不是RangeCells 接受列索引。使用变量而不是 1
  • 我明白了,我已经这样做了,但是完成所有复制的主线是cl.Offset(0, 9).Copy Sheets("Handlungsempfehlungen").range("A" & lr),我必须通过下一列“B”替换“A”等等,对吗?无法将其更改为新变量/数字,而不是列的字符串“A”、“B”等?
【解决方案2】:

我确信有一种更简洁的方法可以做到这一点,但首先想到的是在最后一行计算中添加一些条件检查 (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 时添加条件语句来确定要使用的范围

【讨论】:

  • 就是这样,非常感谢。空白消失了,我每次都可以使用 lr 查找最后一行。非常感谢,老实说!一件小事:您知道如何在粘贴 Worksheet1 后,使 Worksheet 2 进入下一列吗?我想我必须将第一行中的“A”替换为下一行显示为 B 的字符串,依此类推(循环遍历字母表),但这似乎并不理想。有什么办法可以用数字做到这一点?由于列是字母,这对我来说似乎很难,因为行你可以只做 +1(数字)......不过非常感谢,原来的问题解决了!
  • 您可以使用Cells( Row #, Column #) 或使用Offset ( Rows, Columns) 按索引迭代列
  • 我实际上会修改它以隔离If lr = 2 语句。 lr <> 2 时无需测试ws.Range("A1") = ''。也许效率更高一点。另外,请注意较短的解决方案并不总是最好的。我更喜欢 bigbens 解决方案
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2013-07-02
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多