【问题标题】:VBA - Find lastColumn and Check if First Row Is EmptyVBA - 查找 lastColumn 并检查第一行是否为空
【发布时间】:2018-05-10 18:19:45
【问题描述】:

我不太确定应该如何解决这个问题,但有两种方法对我来说很有意义..

我的工作簿中的某些工作表没有标题,所以我使用下面的代码插入一个空白行并将标题分配给 A 列 - 我知道 A 列将始终是员工编号。

Sub insertRow()

    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim wkbk1 As Workbook

    Set wkbk1 = Workbooks("testWorkbook.xlsm")

    'Set sheets to be used in each workbook
    Set ws1 = wkbk1.Sheets("mySheet")
    Set ws2 = wkbk1.Sheets("hisSheet")
    Set ws3 = wkbk1.Sheets("herSheet")

    wkbk1.Activate

    ws1.Range("A1").EntireRow.Insert
    ws1.Range("A1").Value = "Employee Number"

    ws2.Range("A1").EntireRow.Insert
    ws2.Range("A1").Value = "Employee Number"

    ws3.Range("A1").EntireRow.Insert
    ws3.Range("A1").Value = "Employee Number"

End Sub

以下代码根据标题名称删除列。

Sub ManipulateSheets()

    Dim a As Long, w As Long
    Dim keepCols As Variant
    Dim wkbk1 As Workbook

    Set wkbk1 = Workbooks("testWorkbook.xlsm")

    keepCols = Array("Employee Number", "Status")

    wkbk1.Activate

    With wkbk1

        For w = 1 To .Worksheets.count

            With Worksheets(w)

                For a = .Columns.count To 1 Step -1

                    If UBound(Filter(keepCols, .Cells(1, a), True, vbTextCompare)) < 0 Then _
                            .Columns(a).EntireColumn.Delete

                Next a

            End With

        Next w

    End With

End Sub

问题是这样的:

我插入一行并将 A 列的列标题设置为员工编号的 3 张工作表,该行的其余部分仍然有空标题。所以当我运行上面的代码删除列时,没有任何反应在这 3 张纸上,因为标题中没有可比较的数据。

所以我认为可行的两个选项是:

  1. 找到lastColumn并将文本插入A列和lastColumn之间的单元格

  2. 找到 lastColumn 并在 if 语句中包含一个条件,用于查找空白单元格以及不匹配的标题

我得到了在这里找到lastColumn的代码:

Excel VBA- Finding the last column with data

Sub findColumn()

    Dim rLastCell As Range
    Dim i As Long
    Dim MyVar As Variant
    Dim ws1 As Worksheet
    Dim wkbk1 As Workbook
    i = 2

    Set wkbk1 = Workbooks("testWorkbook.xlsm")

    Set ws2 = wkbk1.Sheets("ws1")

    Set rLastCell = ws2.Cells.Find(What:="*", After:=ws2.Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)

End Sub

我正在考虑一个 Do While 循环,如下所示:

Do While (MyVar1 >= 2 And MyVar1 < rLastCell.Column)



Loop

【问题讨论】:

  • 您是否也尝试删除该范围内的空列?
  • @QHarr 不,不是空列。我需要删除所有不包含标题“员工编号”或“状态”的列。但是这 3 个工作表不包含标题,因此即使应该删除一些列,也不会删除任何列。
  • 如果没有标题,如何在这些工作表中确定要删除的正确列?
  • @QHarr 这就是问题所在。这就是为什么我在考虑一些代码来确定包含数据的 lastColumn,然后扫描第 1 行直到 lastColumn,如果第 1 行中的单元格为空,我插入一些文本,当我运行代码删除列时,它会有要比较的文本。
  • 如果标题位置不固定,您将如何确定将文本添加到哪些列?相反,如果它们是固定的,您可以将数组修改为要保留的列号。

标签: vba excel


【解决方案1】:

您可以将条件更改为

IsError(Application.Match(rng.Value, keepCols, 0)) 

这会拾取所有不匹配的项目。

注意:

For Each rng In Intersect(.Rows(1), .UsedRange)

上面将循环遍历所选工作表中第 1 行的使用范围。

循环多张工作表可能类似于:

Option Explicit

Sub test()

    Dim keepCols()
    keepCols = Array("Employee Number", "Status")

    Dim unionRng As Range, rng As Range, ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        With ws
            If Application.WorksheetFunction.CountA(.Rows(1)) > 0 Then
                For Each rng In Intersect(.Rows(1), .UsedRange)
                    If IsError(Application.Match(rng.Value, keepCols, 0)) Then
                        If Not unionRng Is Nothing Then
                            Set unionRng = Union(unionRng, rng)
                        Else
                            Set unionRng = rng
                        End If
                    End If
                Next rng
                If Not unionRng Is Nothing Then 
                    Debug.Print unionRng.EntireColumn.Address 'unionRng.EntireColumn.Delete '.  ''<== Swop when ready to delete
                    Set unionRng = Nothing
                End If
            End If
        End With
    Next ws
End Sub

【讨论】:

  • 啊,你看,我知道你知道我想做什么!非常感谢:)
  • 我似乎遇到了问题。我稍微更改了代码,使其不特定于一张纸,而是循环遍历它们,我似乎遇到了错误。我用那个错误更新了我的问题..
  • 当工作表第一行没有任何内容时是否会抛出?请参阅答案的底部版本。
  • 我完全使用了你的代码,我得到错误:'object'_Global'的方法'union'在这一行失败 Set unionRng = Union(unionRng, rng)。但是,当您发布原始答案时,代码运行良好。
  • 是的,非常感谢! :) 我不得不提早离开,所以我没有再联系你。
猜你喜欢
  • 2011-03-20
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-12-15
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多