Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据搜索文本获取列位置&;移动_Vba_Excel_Excel 2013 - Fatal编程技术网

Vba 根据搜索文本获取列位置&;移动

Vba 根据搜索文本获取列位置&;移动,vba,excel,excel-2013,Vba,Excel,Excel 2013,我需要始终确保名称在C列,而地址在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

我需要始终确保
名称
在C列,而
地址
在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
Sub-SearchForText()
Dim STREARCH作为字符串,aCell作为范围,STREARC1作为字符串
Dim aCell1作为范围,namecolumn作为Int,addresscolumn作为Int
strearch=“Name”
设置aCell=Sheet1.Rows(1).Find(What:=strearch,LookIn:=xlValues_
查看:=xlother,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
GetColumnName(aCell.Column)
namecolumn=GetColumnName()
strearch1=“地址”
设置aCell=Sheet1.Rows(1).Find(What:=strearch1,LookIn:=xlValues_
查看:=xlother,搜索顺序:=xlByRows,搜索方向:=xlNext_
MatchCase:=False,SearchFormat:=False)
GetColumnName(aCell1.Column)
addresscolumn=GetColumnName()
如果是第3列,那么
'如何将列复制到位置3?
如果结束
如果地址为第4列,则
'如何将列复制到位置4?
如果结束
端接头
函数GetColumnName(colNum为整数)为字符串
作为整数的Dim d
将m作为整数
将名称设置为字符串
d=colNum
name=“”
执行时(d>0)
m=(d-1)模26
name=Chr(65+m)+name
d=Int((d-m)/26)
环
GetColumnName=name
端函数

基本上,您需要的是:-

With aCell
    Sheet1.Cells(1, 3).Value = .Value
    .Value = ""
End With
因为Find函数在aCell中找到了“Name”,所以上面的代码将aCell复制到第3列(“C”),并将其删除到原来的位置。请注意,单元格始终定义为单元格([行]、[列])。列属性首选数字,但字母也适用

顺便说一句,不要费心将列号转换为列名,因为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
子测试()
Dim colIndex等长
带工作表(“表1”)
检查列。行(1),“名称”,3
检查列。行(1),“地址”,4
以
端接头
子检查列(rngHeaderRow作为范围,colName作为字符串,refColumnIndex作为长度)
暗列索引与长列索引相同
与rngHeaderRow.Parent一起
如果是GetColumnIndex(rngHeaderRow、colName、columnIndex),如果是columnIndex refColumnIndex,则是MoveValues.Columns(columnIndex),.Columns(refColumnIndex)
以
端接头
函数GetColumnIndex(rngHeaderRow作为范围,colName作为字符串,columnIndex作为长度)作为布尔值
变暗rng As范围
设置rng=rngHeaderRow.Find(What:=colName,LookIn:=xlValues,lookat:=xlWhole)
如果不是,那么rng什么都不是
columnIndex=rng.Column
GetColumnIndex=True
如果结束
端函数
子移动值(COLTOMOVEROM As Range、COLTOMOVERO As Range)
作为变体的Dim-arr
尺寸与长度相同
调整列COLTOMOVEROM的大小
调整列大小
maxSize=WorksheetFunction.Max(coltomovfrom.Count、coltomovoint.Count)
使用coltomovfrom.Parent.UsedRange
arr=Application.Transpose(coltomovfrom.Resize(maxSize))
coltomovfrom.Resize(maxSize).Value=coltomovore.Resize(maxSize).Value
coltomovive.Resize(maxSize).Value=Application.Transpose(arr)
以
端接头
子大小列(rng As范围)
与rng.Parent一起
设置rng=.Range(rng.Cells(1,1),.Cells(.Rows.Count,rng.Column).End(xlUp))
以
端接头

在您的代码中,您的注释是“如何将列复制到位置4?”,因此我假设您希望移动整个列—不仅仅是标题?有点长—但按其应该的方式进行操作。实际上,代码长度主要是由于通过将每个任务拆分为特定的任务来实现一定程度的可重用性和可维护性函数/子函数,每个函数都非常短。我可以提出一个较短的,但这是一个一次性的代码。最后,您应该将其长度与另一个功能代码进行比较。。。