使用Excel VBA

时间:2017-02-24 13:35:40

标签: excel excel-vba vba

我有一个定期更新的电子表格。因此,列标题位置会定期更改。例如。今天"用户名"是K列,但明天"用户名"可能是列L.我需要在"用户名"的右边添加一个新列。但它改变的地方我不能称为单元格/列引用。

到目前为止,我有:

Dim rngUsernameHeader As Range
Dim rngHeaders As Range
Set rngHeaders = Range("1:1") 'Looks in entire first row.
Set rngUsernameHeader = rngHeaders.Find("Username")

当我在其右侧添加新列时,我选择该行但它会返回到单元格/列引用...

Columns("K:K").Select
Selection.Insert Shift:=xlToRight
Range("K1").Select
ActiveCell.FormulaR1C1 = "Role"

如何使用宏执行此步骤?

编辑我认为需要为该列提供一个标题名称并开始使用数据填充该行 - 每次我都会开始我希望尽可能避免的单元格引用。

非常感谢提前。

4 个答案:

答案 0 :(得分:2)

怎么样:

Sub qwerty()
    Dim rngUsernameHeader As Range
    Dim rngHeaders As Range

    Set rngHeaders = Range("1:1") 'Looks in entire first row.
    Set rngUsernameHeader = rngHeaders.Find(what:="Username", After:=Cells(1, 1))

    rngUsernameHeader.Offset(0, 1).EntireColumn.Insert
    rngUsernameHeader.Offset(0, 1).Value = "role"
End Sub

答案 1 :(得分:1)

Sub AddColumn
    Dim cl as Range

    For each cl in Range("1:1")
        If cl = "username" Then
           cl.EntireColumn.Insert Shift:= xlToRight
        End If

        cl.Offset(0, 1) = "role"
    Next cl
End Sub

未经测试的代码不在我的桌面

答案 2 :(得分:0)

这样的事情应该有效。我们的想法是找到列,然后插入到右侧。这就是+1TestMe的原因。函数l_locate_value_col返回列,找到值。如果需要,您可以更改可选参数l_row,具体取决于您要查找的行。

Option Explicit

Public Sub TestMe()

    Dim lngColumn         As Long

    lngColumn = l_locate_value_col("Username", ActiveSheet)
    Cells(1, lngColumn + 1).EntireColumn.Insert

End Sub

Public Function l_locate_value_col(target As String, _
                                    ByRef target_sheet As Worksheet, _
                                    Optional l_row As Long = 1)

    Dim cell_to_find                As Range
    Dim r_local_range               As Range
    Dim my_cell                     As Range

    Set r_local_range = target_sheet.Range(target_sheet.Cells(l_row, 1), target_sheet.Cells(l_row, Columns.Count))

    For Each my_cell In r_local_range
        If target = Trim(my_cell) Then
            l_locate_value_col = my_cell.Column
            Exit Function
        End If
    Next my_cell

    l_locate_value_col = -1

End Function

答案 3 :(得分:0)

您可以命名您的范围:

Sub Test()

    Dim rngUsernameHeader As Range
    'UserName is in column F at the moment.
    Set rngUsernameHeader = Range("UserName")
    Debug.Print rngUsernameHeader.Address 'Returns $F$1
    ThisWorkbook.Worksheets("Sheet2").Range("E:E").Insert Shift:=xlToRight
    Debug.Print rngUsernameHeader.Address 'Returns $G$1

End Sub

修改 已重写,因此它会在您的命名列之后插入一列并返回该引用:

Sub Test()

    Dim rngUsernameHeader As Range
    Dim rngMyNewColumn As Range

    Set rngUsernameHeader = Range("UserName")
    rngUsernameHeader.Offset(, 1).Insert Shift:=xlToRight

    'You'll need to check the named range doesn't exist first.
    ThisWorkbook.Names.Add Name:="MyNewRange", _
        RefersTo:="='" & rngUsernameHeader.Parent.Name & "'!" & _
                         rngUsernameHeader.Offset(, 1).Address

    Set rngMyNewColumn = Range("MyNewRange")
    MsgBox rngMyNewColumn.Address

End Sub