vba - 如何简化此 VBA switch 语句而不重复这么多代码?

标签 vba excel switch-statement

我正在编写一个 Excel 宏,用于从 1 个工作表复制信息并将其粘贴到另一个工作表。它必须搜索特定的文本字符串来标识要复制的正确列,并且我使用 switch 语句来浏览各个列。它一直到 Z,所以它是一个非常长的宏。我还需要将其用于多个搜索词,这使得宏太大。

以下是代码摘录:

Select Case True
  Case Range("A1").Value = "SearchTerm1"
    Sheets("ExportSheet").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Template").Select
    Range("L2").Select
    ActiveSheet.Paste
  Case Range("B1").Value = "SearchTerm1"
    Sheets("ExportSheet").Select
    Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Template").Select
    Range("L2").Select
    ActiveSheet.Paste
  Case Range("C1").Value = "SearchTerm1"
    Sheets("ExportSheet").Select
    Range("C2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Template").Select
    Range("L2").Select
    ActiveSheet.Paste
  Case Range("D1").Value = "SearchTerm1"
    Sheets("ExportSheet").Select
    Range("D2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Template").Select
    Range("L2").Select
    ActiveSheet.Paste
  Case Range("E1").Value = "SearchTerm1"
    Sheets("ExportSheet").Select
    Range("E2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Template").Select
    Range("L2").Select
    ActiveSheet.Paste

它会逐一检查列,看看它是否包含特定的搜索词。如果是,它会复制其下方的所有内容,并将其从单元格 L2 开始粘贴到单独的工作表上。这只是一个很长的宏,我正在尝试简化它。 For 循环可以工作吗?

最佳答案

  1. 如果您喜欢此方法,您的变体已更新

With Sheets("ExportSheet")
Select Case True
    Case .[A1].Value = "SearchTerm1"
        .Range("A2:A" & Cells(.Rows.Count, "A").End(xlUp).Row).Copy Sheets("Template").[L2]
    Case .[B1].Value = "SearchTerm1"
        .Range("B2:B" & Cells(.Rows.Count, "B").End(xlUp).Row).Copy Sheets("Template").[L2]
    Case .[C1].Value = "SearchTerm1"
        .Range("C2:C" & Cells(.Rows.Count, "C").End(xlUp).Row).Copy Sheets("Template").[L2]
    ' and so on
End Select
End With

End Sub
  • 最佳变体恕我直言是Find方法
  • Sub test2()
    Dim x&, y&
    On Error GoTo errorhandler
        With Sheets("ExportSheet")
            y = .Rows(1).Find("SearchTerm1").Column
            x = .Cells(Rows.Count, y).End(xlUp).Row
            .Range(.Cells(2, y), .Cells(x, y)).Copy Sheets("Template").[L2]
        End With
    Exit Sub
    errorhandler:
        MsgBox "There is no 'SearchTerm1' in 'ExportSheet'!"
    End Sub
    
  • 对于每个循环遍历单元格范围我认为也是最佳的
  • Sub test3()
    Dim Cl As Range
    For Each Cl In Sheets("ExportSheet").[A1:E1]
        If Cl.Value = "SearchTerm1" Then
            Sheets("ExportSheet").Range(Cl.Offset(1, 0).Address(0, 0), _
                Cells(Rows.Count, Cl.Column).End(xlUp).Address(0, 0)).Copy _
            Sheets("Template").[L2]
            Exit For
        End If
    Next
    End Sub
    

    关于vba - 如何简化此 VBA switch 语句而不重复这么多代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959018/

    相关文章:

    excel - 打开多个文件并对所有打开的文件执行宏

    VBA输入框不会关闭

    excel - 在排序宏中使用 VBA 函数

    vba - 使用 VBA 将 Excel xlsm 文件上传到 php 脚本

    excel - 从一本工作簿复制并粘贴到另一工作簿中

    java - 有人不同意 : "using switch is bad OOP style"? 的说法吗

    VBA 循环根据相邻单元格更改单元格值(正/负)和字体颜色

    node.js - 如何在 Node js 中迭代行并打印 excel 中的对象值?

    java - 在java中切换类型

    java - 将枚举值与类字段匹配