2017-03-17 75 views
1

我需要始终确保name在列C和address在列D.我用下面synatx扫描标题,并确定列位置的每个标题是在,但如果标题文本不符合强制性位置,那么将其移动到正确位置的语法是什么?获取基于关列位置搜索文本和移动

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

在你的代码的注释''如何复制列是4位'所以我假设你要搬家?整个专栏 - 不只是标题? –

回答

1

我想通过简单的移动值去,如下:

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

有点冗长 - 但做它应该的工作。 – BellHopByDayAmetuerCoderByNigh

+1

实际上,代码长度主要是由于通过将每个任务分解为特定的函数/子集来实现的可重用性和可维护性的某种程度,其中每个任务都非常短。我可以提出一个更短的代码,但它只是一次性代码。最后,你应该将它的长度与另一个功能代码进行比较...... – user3598756

0

基本上,你需要的是这样的: -

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

由于您的查找功能找到的 “名称” 中aCell,从aCell上面的代码拷贝到3列( “C”)和将其删除之前的位置。请注意,单元总是被定义为单元([Row],[Column])。 Column属性首选数字,但字母也可以使用。

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

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