根据搜索文本获取列位置并移动

Get Column Position Based Off Search Text & Move

我需要始终确保 name 在 C 列中,address 在 D 列中。我使用下面的语法来扫描 header 文本并确定每个 header 所在的列位置,但如果 header 文本不符合强制位置,将其移动到正确位置的语法是什么?

Sub SearchForText()
    Dim strSearch As String,  aCell As Range, strSearch1 As String
    Dim aCell1 As Range, namecolumn As Int, addresscolumn As Int

    strSearch = "Name"  

    Set aCell = Sheet1.Rows(1).Find(What:=strSearch, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    GetColumnName(aCell.Column)
    namecolumn = GetColumnName()

    strSearch1 = "Address"

    Set aCell = Sheet1.Rows(1).Find(What:=strSearch1, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

    GetColumnName(aCell1.Column)
    addresscolumn = GetColumnName()

    if namecolumn <> 3 THEN
        'How to copy column to be position 3?
    end if

    if addresscolumn <> 4 THEN
        'How to copy column to be position 4?
    end if
End Sub
Function GetColumnName(colNum As Integer) As String
    Dim d As Integer
    Dim m As Integer
    Dim name As String
    d = colNum
    name = ""
    Do While (d > 0)
        m = (d - 1) Mod 26
        name = Chr(65 + m) + name
        d = Int((d - m) / 26)
    Loop
    GetColumnName = name
End Function

基本上,你需要的是:-

With aCell
    Sheet1.Cells(1, 3).Value = .Value
    .Value = ""
End With

因为您的 Find 函数在 aCell 中找到了 "Name",所以上面的代码从 aCell 复制到第 3 列 ("C") 并将其删除。请注意,Cell 始终定义为 Cells([Row], [Column])。列 属性 首选数字,但字母也可以。

顺便说一句,不要费心将列号转换为列名,因为 Excel 只理解数字并将您的名称转换回数字。

Columns("AL").Column    ' returns the column number of column "AL"
Columns(155).Address     ' returns $EY:$EY

我会简单地移动值,如下所示:

Sub Test()
    Dim colIndex As Long

    With Worksheets("Sheet1")
        CheckColumn .Rows(1), "Name", 3
        CheckColumn .Rows(1), "Address", 4
    End With
End Sub

Sub CheckColumn(rngHeaderRow As Range, colName As String, refColumnIndex As Long)
    Dim columnIndex As Long
    With rngHeaderRow.Parent
        If GetColumnIndex(rngHeaderRow, colName, columnIndex) Then If columnIndex <> refColumnIndex Then MoveValues .Columns(columnIndex), .Columns(refColumnIndex)
    End With
End Sub

Function GetColumnIndex(rngHeaderRow As Range, colName As String, columnIndex As Long) As Boolean
    Dim rng As Range

    Set rng = rngHeaderRow.Find(What:=colName, LookIn:=xlValues, lookat:=xlWhole)
    If Not rng Is Nothing Then
        columnIndex = rng.Column
        GetColumnIndex = True
    End If
End Function

Sub MoveValues(colToMoveFrom As Range, colToMoveTo As Range)
    Dim arr As Variant
    Dim maxSize As Long

    ResizeColumn colToMoveFrom
    ResizeColumn colToMoveTo
    maxSize = WorksheetFunction.Max(colToMoveFrom.Count, colToMoveTo.Count)
    With colToMoveFrom.Parent.UsedRange
        arr = Application.Transpose(colToMoveFrom.Resize(maxSize))
        colToMoveFrom.Resize(maxSize).Value = colToMoveTo.Resize(maxSize).Value
        colToMoveTo.Resize(maxSize).Value = Application.Transpose(arr)
    End With
End Sub

Sub ResizeColumn(rng As Range)
    With rng.Parent
        Set rng = .Range(rng.Cells(1, 1), .Cells(.Rows.Count, rng.Column).End(xlUp))
    End With
End Sub