2016-06-07 32 views
1

这是我的第一篇文章......查找列标题名称,并选择下面列标题(Excel的VBA)的所有数据

我试图创建一个宏做到以下几点:

  1. 按名称搜索电子表格列标题。
  2. 从所选列中选择除列标题外的所有数据。
  3. 以文本号码的形式存储&转换为数字。

    • 转换为数字以用于VLookup。

例如:

视觉电子表格示例:

enter image description here

我发现下面的代码在线:

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 

不过,我仍然遇到一些问题,a非常感谢您的帮助。

回答

1

试试看。只需将想要查找的所有列标题名称添加到集合中即可。我假设你没有超过200列,如果你只是更新为i = 1到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 
+0

嗨@Ryan Wildry, 谢谢您的帮助。这个解决方案往往帮助最大。由于它是一个长循环,我没有一步一步做。但是,它完成了这项任务。感谢您的帮助。 –

-1

好的,下面是实现您的目标的简要方法。首先,找到包含员工ID的列。那么只需将整个列设置为数字而不是文本格式?

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 
+0

这只是改变了格式,而不是值。例如,你不能将这些数字加在一起。 –

+0

这是一个员工ID - 为什么你会想把它们加在一起? – Dave

+0

您的解决方案没有解决问题。特别要求转换。可能还有其他列将被转换,如果这更明智。不是为了我们说。 –

-1

添加昏花,您想要的范围:

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 
+0

这只是改变了格式,而不是数值,例如,你不能将数字加在一起 –

+0

对不起,你到底想要做什么呢?把所有员工ID加起来?统计有多少人在数据列表中显示工作人员ID?统计工作人员ID?在需要帮助之前,需要更多的细目以供参考... –

+0

我没有问这个问题。问他们想把它转换成一个数字,可能会在某处的某一列上滚动一下 –

3

避免循环所有单元格是很好的做法。如果数据集增长,宏可能变得太慢。使用特殊单元格并粘贴乘以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 
+0

Hi @dra_red, 感谢您的协助。我相信这会将数据正确转换为数字。不幸的是,列标题变成了带有未折叠字体的白色背景。这不是什么大问题。我想我可以重画它。就逻辑而言,我使用F8来逐步完成代码。不知道为什么创建一个临时表格以及它做了什么。如果你能解释,我会非常感激。只是为了我自己的理解。再次感谢您的帮助。 –

+0

Hi @Laissez,要将'pastespecial'与'multiply'操作一起使用,您需要首先复制要乘以的值。有几种方法可以解决这个问题,但为了避免各种各样的复杂情况,我在复制之前将其放在一张新纸上。值被复制并且操作完成后,工作表被删除。 此操作不应以您描述的方式影响格式。我不能说没有看到工作簿,为什么会发生这种情况。 这种方法的好处是它的效率。如果您需要在更大的数据集上操作,它会带来好处... –

相关问题