【问题标题】:edited-- if statement vba -- how to skip a cell if it has a value已编辑——if 语句 vba——如果单元格有值,如何跳过它
【发布时间】:2015-06-26 03:16:50
【问题描述】:

我已经编辑了我的原始帖子,并为您提供了更多详细信息。基本上我有这个代码:

For x = 1 To 1000
If track.Cells(x, 1) = Date Then
    If track.Cells(x, 2) = "EU" Then
        If track.Cells(x, 3) = "ABCDE" Then
           ST.Range("ABCDE").Copy
           EU.Cells(41, 2).PasteSpecial
           Call ActivateSheet
           track.Range(Cells(x, 4), Cells(x, 9)).Copy
               **For i = 42 To 1000
                  If EU.Cells(42 + i, 2) Then
                     EU.Cells(42 + 1, 2).PasteSpecial
                  End If
               Next i**
        End If
    End If    
End If Next x

我在代码的这个特定部分遇到了问题:

For i = 42 To 1000
                  If EU.Cells(42 + i, 2) Then
                     EU.Cells(42 + 1, 2).PasteSpecial
                  End If
               Next i

这基本上是从同一工作簿上的另一个工作表复制一系列单元格,并将其放在另一个工作表上。现在,我遇到问题的代码会发生什么,我希望它在粘贴第一个之后粘贴到下面的行。还有其他方法可以实现吗?我才刚刚开始自学 VBA 编码。任何建议将不胜感激。

【问题讨论】:

  • 有一个“字符串值”而不是一个“数值”,或者你的意思是跳过任何包含任何类型值的单元格?
  • @JGreenwell 我的错,我的意思是跳过包含任何类型值的单元格。
  • For i = 1 To 1000 If sheet.Cells(42 + 1, 2) = blank Then sheet.Cells(i + 1, 2).PasteSpecial Else Next i End If
  • 请不要将 [宏] 用于 MS Office 或 VBA。 macros tag wiki

标签: vba excel if-statement skip


【解决方案1】:

你不需要循环值来找到最下面一行,你可以简单地从下往上一次。

替换这个:

**For i = 42 To 1000
   If EU.Cells(42 + i, 2) Then
      EU.Cells(42 + 1, 2).PasteSpecial
   End If
Next i**

有了这个:

Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial

它是如何工作的:

Cells(rows.count,2) 是工作表和第 2 列中的最后一行(现在的 B1048576 或过去的 B65536)

.End(XLup) 告诉它向上直到数据,就像 Excel 中的 CTRL-UP 一样

这告诉我们最后一行包含数据,我们不想在这里粘贴,因为你会覆盖你的最后一行:

.offset(1,0) 告诉它从原来的位置移开 1 行和 0 列。

这已经算出你需要粘贴的地址了,然后我们专门粘贴。

希望有帮助

要真正了解它是如何工作的,请使用 CTRL-G 转到 VB 编辑器中的即时窗口并粘贴以下代码:

?Cells(Rows.Count, 2).address
?Cells(Rows.Count, 2).End(xlUp).address
?Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).address

在每一行后按回车键,您将看到添加到该行的每个代码部分如何改变结果

【讨论】:

  • 很高兴为您提供帮助,如果您认为我的答案是正确的,请标记我的答案是正确的 :)
  • 我这样做了,它给出了运行时错误:应用程序定义或对象定义错误'For x = 1 To 1000 If track.Cells(x, 1) = Date Then If track .Cells(x, 2) = "EU" Then If track.Cells(x, 3) = "ABCDE" Then ST.Range("ABCDE").Copy EU.Cells(41, 2).PasteSpecial 调用 ActivateSheet 轨道。 Range(Cells(x, 4), Cells(x, 9)).Copy EU.Cells(Rows.Count, 2).End(x1Up).Offset(1,0).PasteSpecial End If End If End If End If Next x '
  • 把这个放在 PasteSpecial xlPasteAll 之后
  • 你不能把代码放在 cmets 中,编辑你的原始帖子并将它放在帖子的底部:)
  • 大声笑感谢有关以代码形式发布的提示大声笑。不管怎样,我想我知道我做错了什么。
【解决方案2】:

如果您的意思是您只想更改 空 的单元格,您可以使用IsEmpty(),例如:

For Each cell In rng
    If IsEmpty(cell) Then 'To alter cells containing value use If Not IsEmpty...
    ' Do something
    End If
Next

或者如果它们是单元格值包含空格的可能性,您可以使用

If trim(cell & vbnullstring) = vbnullstring Then
' Do something
End If

要跳过 value 类型为 Text 的单元格,请使用 IsText

If Not Application.IsText(cell) Then
' Do Something
End If

要仅更改 仅包含数字的 值,请使用 IsNumeric

If IsNumeric(cell) Then
' Do something
End If

【讨论】:

  • 哇,谢谢!我几乎开始学习 VBA,这些示例可能对我的学习过程很有帮助。基本上我需要做的是,如果该单元格中有任何类型的值,我希望宏跳过它并继续将一系列单元格粘贴到下一行单元格中。
  • pasting a range of cella into the next row of cells------粘贴什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多