【问题标题】:Excel Macro Repetitive IF and ElseExcel 宏重复 IF 和 Else
【发布时间】:2013-09-20 04:08:41
【问题描述】:

我目前正在编写一个 Excel VBA 宏脚本,其中将对活动单元格进行简单的 TRUE 或 False 测试。我的问题是,直到列表末尾我才能使它工作。它只运行一次并结束程序。我需要这个 VB 脚本来执行列表底部的 IF 和 ELSE 测试。

问题描述:

假设我有一个从 A1 到 A9999 的日期列表,并且在它旁边 (F1:F9999) 还有一个包含文本的列表。 F1:F9999 列表仅包含两个值。 (a) 相同的日期和 (b) 不同的日期。

  1. 在列表 F1:F9999 中执行真假测试。

  2. 如果活动单元格的值等于文本“SAME DATE” (TRUE),它将忽略并移至列表中的下一项,然后再次执行编号 1。

  3. 如果活动单元格值等于文本“SAME DATE”(FALSE),它将在其上方插入一行,然后移动到列表中的下一项,然后再次执行编号 1
  4. TRUE 或 FALSE 测试将一直运行到列表末尾。
  5. TRUE 或 FALSE 测试在到达列表底部时将停止运行。
  6. 顺便说一下,列表中的项目数不一致。我只是将 F1:F9999 放在那里作为示例。

这是我的代码!

Sub IFandElseTest()
If ActiveCell.Value = "Same Date" Then
Range(Selection, Cells(ActiveCell.Row, 1)).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.Offset(1, 0).Select
Else:
ActiveCell.Offset(1, 0).Select
Range(Selection, Cells(ActiveCell.Row, 1)).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If


End Sub

如果你能在这方面帮助我,不胜感激。

【问题讨论】:

  • 不要使用.Select,而是使用反向循环。即使用 for 循环并从下向上移动(9999 到 1)
  • 如果你能对它进行编码@SiddharthRout 那就太好了,这样 Kareen 就可以对其进行测试。我认为她缺乏知识。 :) 只是说..
  • @BenMichaelOracion:是的,我可以编写代码(实际上代码已经准备好了),但我希望 Kareen 先尝试一下 :)
  • 说实话,我真的不知道该怎么做@SiddharthRout。我所能做的就是 IF 和 Else 语句。被困在这里3小时。但重复它直到 IF 和其他直到列表的最后一项是我不知道的。顺便说一下,列表中的项目数并不一致。我只是把 E1:E9999 放在那里作为示例。

标签: excel vba


【解决方案1】:

试试这个。

说明:

  1. 您应该避免使用.Select/ActiveCell 等。您可能希望看到这个LINK
  2. 使用最后一行时,最好不要硬编码值,而是动态查找最后一行。你可能想看看这个LINK
  3. 使用对象,如果当前工作表不是您要使用的工作表怎么办?
  4. 下面的 FOR 循环将从下面遍历行并向上移动。

代码:

Sub Sample()
    Dim ws As Worksheet
    Dim LRow As Long, i As Long
    Dim insertRange As Range

    '~~> Chnage this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    '~~> Work with the relevant sheet
    With ws
        '~~> Get the last row of the desired column
        LRow = .Range("E" & .Rows.Count).End(xlUp).Row

        '~~> Loop from last row up
        For i = LRow To 1 Step -1
            '~~> Check for the condition
            '~~> UCASE changes to Upper case
            '~~> TRIM removes unwanted space from before and after
            If UCase(Trim(.Range("E" & i).Value)) = "SAME DATE" Then
                '~~> Insert the rows
                .Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            End If
        Next i
    End With
End Sub

截图:

评论跟进

真的成功了!但是,最后的修改。在您的代码中: Set ws = ThisWorkbook.Sheets("Sheet1") 您是否可以将 WS 设置为活动工作表。原因是工作表的名称唯一且不一致。

就像我提到的,在上面的第一个链接以及评论中,不要使用Activesheet。使用不改变的工作表的CodeNames。请参阅下面的屏幕截图。

Blah Blah 是您在工作表选项卡中看到的工作表名称,但 Sheet1 是不会更改的 CodeName。即您可以将工作表的名称从Blah Blah 更改为Kareen,但在VBA 编辑器中,您会注意到Codename 不会更改:)

修改代码

Set ws = ThisWorkbook.Sheets("Sheet1")

'~~> Replace Sheet1 with the relevant Code Name
Set ws = [Sheet1]

【讨论】:

  • 真的有效!但是,最后的修改。在您的代码中: Set ws = ThisWorkbook.Sheets("Sheet1") 您是否可以将 WS 设置为活动工作表。这样做的原因是因为工作表的名称唯一且不一致。
  • 不需要。找到了答案!我将其更改为 Set ws = ActiveSheet。非常感谢。你很有帮助。
  • 然后使用工作表的代码名....再次我的建议,请不要使用Activesheet
  • 我知道。但我认为在我的情况下使用活动表是合适的。而且,这是最简单的出路。 :) 谢谢!
  • 嗯……你说得有道理!我完全同意你的看法。不幸的是,我的 excel 宏项目包括将新工作表添加到 Sheet99。您编写的代码将在新创建的工作表中运行。如果我将 ws 设置为 Sheet1,它将运行因为工作表的名称为 Sheet46(示例)。我希望你能理解,但你有一个很好的观点!
【解决方案2】:

编辑

如果您省略 r.copy 行,它或多或少与 Siddharth Rout 的解决方案完全相同

Sub insrow()
  Dim v, r As Range
  Set r = [d1:e1]
  v = r.Columns(1).Value
  Do
   ' r.copy
   If v = "Same Date" Then r.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   Set r = r.Offset(1)
   v = r.Columns(1).Value
  Loop Until v = ""
End Sub

如果行超过第 9999 行,这还不包括结束条件,但这应该很容易添加...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多