【问题标题】:Find Column Header By Name And Select All Data Below Column Header (Excel-VBA)按名称查找列标题并选择列标题下的所有数据(Excel-VBA)
【发布时间】:2016-06-07 18:36:04
【问题描述】:

我正在尝试创建一个宏来执行以下操作:

  1. 按名称搜索电子表格列标题。
  2. 选择所选列中的所有数据,列标题除外。
  3. 将数字存储为文本并转换为数字。
  • 转换为数字以用于 VLookup。

例如:

可视化电子表格示例:

我在网上发现了以下代码:

With ActiveSheet.UsedRange

Set c = .Find("Employee ID", LookIn:=xlValues)

If Not c Is Nothing Then

    ActiveSheet.Range(c.Address).Offset(1, 0).Select
End If

End With

但是,我仍然遇到一些问题。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    最好避免循环遍历所有单元格。如果数据集增长,宏可能会变得太慢。使用特殊的单元格和粘贴乘以 1 的特殊操作是完成任务的有效方法。

    这行得通...

    Dim SelRange As Range
    Dim ColNum As Integer
    Dim CWS As Worksheet, TmpWS As Worksheet
    
    'Find the column number where the column header is
    Set CWS = ActiveSheet
    ColNum = Application.WorksheetFunction.Match("Employee ID", CWS.Rows(1), 0)
    
    'Set the column range to work with
    Set SelRange = CWS.Columns(ColNum)
    
    'Add a worksheet to put '1' onto the clipboard, ensures no issues on activesheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
        Set TmpWS = ThisWorkbook.Worksheets.Add
        With TmpWS
            .Cells(1, 1) = 1
            .Cells(1, 1).Copy
        End With
    
        'Select none blank cells using special cells...much faster than looping through all cells
        Set SelRange = SelRange.SpecialCells(xlCellTypeConstants, 23)
        SelRange.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply
        TmpWS.Delete
        CWS.Select
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    

    【讨论】:

    • 嗨@dra_red,感谢您的帮助。我相信这可以正确地将数据转换为数字。不幸的是,列标题变为带有非粗体字体的白色背景。这没什么大不了的。我想我可以重新粉刷它。就逻辑而言,我使用 F8 逐步完成代码。不知道为什么要创建临时工作表以及它的作用。如果你能解释一下,我将不胜感激。只是为了我自己的理解。再次感谢您的帮助。
    • 嗨@Laissez,要将“pastespecial”与“乘”操作一起使用,您需要先复制要乘以的值。有几种方法可以解决这个问题,但为了避免各种复杂情况,我在复制之前将值放在一张新纸上。复制值并完成操作后,将删除工作表。此操作不应影响您描述的格式。如果不看工作簿,我无法说出为什么会这样。这种方法的好处是它的效率。如果您需要对更大的数据集进行操作,它会带来回报......
    • 是否可以这样做,但在前 20 行中搜索“员工 ID”以允许标题行移动?
    【解决方案2】:

    我只是偶然发现了这一点,对我来说答案非常简单,无论如何如果您正在处理 ListObject 那么这就是要走的路:

    YOURLISTOBJECT.HeaderRowRange.Cells.Find("A_VALUE").Column
    

    【讨论】:

    【解决方案3】:

    试试这个。只需将要查找的所有列标题名称添加到集合中。我假设您没有超过 200 列,如果您只是将 for i = 1 to 200 部分更新为更大的数字。

    Public Sub FindAndConvert()
        Dim i           As Integer
        Dim lastRow     As Long
        Dim myRng       As Range
        Dim mycell      As Range
        Dim MyColl      As Collection
        Dim myIterator  As Variant
    
        Set MyColl = New Collection
    
        MyColl.Add "Some Value"
        MyColl.Add "Another Value"
    
        lastRow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    
        For i = 1 To 200
            For Each myIterator In MyColl
                If Cells(1, i) = myIterator Then
                    Set myRng = Range(Cells(2, i), Cells(lastRow, i))
                    For Each mycell In myRng
                        mycell.Value = Val(mycell.Value)
                    Next
                End If
            Next
        Next
    End Sub
    

    【讨论】:

    • 嗨@Ryan Wildry,感谢您的帮助。这种解决方案往往最有帮助。我没有做一步一步的过程,因为它是一个很长的循环。但是,它完成了任务。感谢您的帮助。
    【解决方案4】:

    好的,这是实现目标的简单方法。首先,找到包含员工 ID 的列。然后只需将整个 Column 设置为 Number 而不是 Text 格式?

    With Worksheets(1)  ' Change this sheet to the one you are using if not the first sheet
        Set c = .Find("Employee ID", LookIn:=xlValues)
    
        If Not c Is Nothing Then
            ' The column we want is c's Column.
            Columns(c.Column).NumberFormat = 0
        End If
    End With
    

    【讨论】:

    • 这只是改变格式,而不是值。例如,您不能将数字相加。
    • 这是一个员工 ID - 你到底为什么要将它们加在一起?
    • 您的解决方案没有解决问题。专门要求转换。可能还有其他列将被转换,这更明智。不由我们说。
    • 大家好,感谢您的快速回复。我没想到有人能这么快做出反应。我稍后的目的是将它们用于 VLookup。如果出于我的特定目的,ID 不是数字格式,则 VLookup 将无法正常工作。就这段代码而言,非常感谢您的帮助,不幸的是我无法让这段代码正常运行。 : (
    【解决方案5】:

    为您想要的范围添加一个暗淡:

    Dim MyRng, RngStart, RngEnd as Range
    

    然后改变:

    ActiveSheet.Range(c.Address).Offset(1, 0).Select
    

    到下面,以便找到该列中的所有数据。

    set RngStart = ActiveSheet.Cells(1, c.column)
    set RngEnd = ActiveSheet.Cells(rows.count, c.column).end(xlup)
    set MyRng = ActiveSheet.Range(RngStart & ":" & RngEnd)
    

    现在您可以处理数据了。如果您想将其粘贴到格式化为数字的位置:

    MyRng.copy
    Sheets("Wherever").Range("Wherever").pastespecial xlvalues
    

    如果您想更改现在找到的单元格格式 (How to format column to number format in Excel sheet?),即整数格式,如果您想要小数点,请使用“数字”而不是“0”:

    MyRng.NumberFormat = "0"
    

    或新的目的地:

    Sheets("Wherever").Range("Wherever").NumberFormat = "0"
    

    与转换为数字功能完全匹配的一般格式:

    MyRng.NumberFormat = "General"
    MyRng.Value = MyRng.Value
    

    【讨论】:

    • 这只是改变格式,而不是值。例如,您不能将数字相加。
    • 对不起,你到底想做什么?把所有员工的身份证加起来?计算一个员工 ID 在数据列表中出现了多少次?计算员工身份证?在我可以提供帮助之前,您需要对您正在尝试做的事情进行更多细分......
    • 我没有问这个问题。从询问中可以清楚地看出,他们希望将其转换为数字,可能是在其中某处的列上进行某种排序。
    • 但是转换成数字正是上面做的?
    • 此外,一旦你有了范围,你就可以用它做各种事情。 Dim Total as long for each cell in MyRng total = total + cell.value next cell 只是一个例子。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 2018-05-04
    • 2012-11-08
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多