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

基本的に、あなたが必要なものはこれです: - あなたの検索機能がaCellから3列( "C")に、aCellに上記のコードのコピーを "Name" を見つけているので

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

とそれが以前の場所で削除されます。 Cellは常にCells([Row]、[Column])として定義されます。 Columnプロパティでは数値が優先されますが、文字も機能します。

ところで、Excelは数字だけを理解して名前に変換するので、列番号を列名に変換するのは面倒ではありません。

Columns("AL").Column ' returns the column number of column "AL" 
Columns(155).Address  ' returns $EY:$EY 
関連する問題