这是我的第一篇文章...
我正在尝试创建宏来执行以下操作:
- 按名称搜索电子表格列标题。
- 从所选列中选择所有数据,包括列标题。
- 将所选列移动到第一列。
我在电子表格中有大约 100 列,这些列可能在每个时期以不同的顺序生成。
我想在前面搜索并移动 10 个彼此相邻的特定列,以便于参考。任何帮助将不胜感激。
试试这个(未测试):
Dim wb as Workbook, ws as Worksheet
Dim column_header as String 'Name of the header to be found
Set wb = ActiveWorkbook
Set ws = wb.Sheets(1) 'Set corresponding sheet
column_header = "test_header"
Dim column_range as Range 'Cell of the header of interest
Set column_range = ws.Rows(1).Find(column_header, LookIn:=xlValues)
Columns(column_range.Column).Cut 'Cut column with the right header
Columns("A").Insert Shift:=xlToRight
有很多方法可以解决您在 Excel 中遇到的问题。这可能不是最好的,但它应该可以工作:
对于 1:
如果您的表格有大约 100 列并假设它从单元格 A1 开始,您可以使用
intColNr = Application.WorksheetFunction.Match(HeaderToSearch,Worksheets("MyWorksheet").Range("A1:DZ1"),0)
获取您搜索的列(A:DZ 是 130 列 => 应该满足您的需求)。
对于 2/3:
假设您的表不超过 100.000 行:首先在 A 列中插入一个新列:
Columns("A:A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
然后复制/粘贴您在步骤 1 中找到的列:
Worksheets("MyWorksheet").Range(Worksheets("MyWorksheet").cells(1,intColNr),Worksheets("MyWorksheet").cells(100000,intColNr)).copy
Worksheets("MyWorksheet").Range("A1").pastespecial xlPasteAll
如果您不希望列重复,则应删除在步骤 1 中找到的列(因为我们在前面插入了一个新列,其列号增加 1):
Worksheets("Sheet1").range(Worksheets("Sheet1").cells(1,intColNr + 1),Worksheets("Sheet1").cells(1,intColNr + 1)).entirecolumn.delete
将上面的所有内容放在 Sub 中,例如 subMoveColumn(varHeader as Variant) 并将要搜索的标题放在一个范围内,例如 Worksheets("Someworksheet").Range("A1:A10") 并循环遍历该范围:
Set rngHeaders = Worksheets("Someworksheet").Range("A1:A10")
For varHeader in rngHeaders
subMoveColumn(varHeader)
Next
这不是一个现成的解决方案,但我希望它有所帮助。
尝试:
Option Explicit
Sub test()
Dim LastColumn As Long, LastRow As Long
Dim Position As Range
Dim strHeader As String
strHeader = "Marios"
With ThisWorkbook.Worksheets("Sheet1") '<- Change sheet name if needed
LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column '<- Find the last column of row 1
Set Position = .Range(.Cells(1, 1), .Cells(1, LastColumn)).Find(strHeader) '<- Search from column 1 to last column of row 1 for the header
If Position Is Nothing Then '<- If header does not excist throw a message box
MsgBox "Header was not found."
Else '<- If header does excist
LastRow = .Cells(.Rows.Count, Position.Column).End(xlUp).Row '<- Find the last row of the column that header found
.Range(.Cells(1, Position.Column), .Cells(LastRow, Position.Column)).Cut '<- Cut the column that found from row to last row
.Columns("A:A").Insert Shift:=xlToRight '<- Move ate column A
End If
End With
End Sub