2017-03-17 72 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