【问题标题】:Increment excel column reference using vba? Z to AA, AA to AB使用vba增加excel列引用? Z 到 AA,AA 到 AB
【发布时间】:2016-09-25 08:24:15
【问题描述】:

必需:引用列表中的列值。

一张表中有 n 行,每个单元格都有一个列表,该列表从另一张表中的列值引用。我创建了以下代码,但它在 Z 之后中断,因为 ASCII 值不适用于 AA、AB、...

如何使用 VBA 为所有行创建列表?

Sub createList()
'creating custom list referencing cells from another sheet

Sheets("Checklist").Select
Dim i As Integer

For i = 1 To 100

    Dim k As String
    k = "='Parameter Options'!$" & Chr(64 + i) & "$1:$" & Chr(64 + i) & "$10"

    'Parameter Options is the sheet i am taking list values from

    Range("A" & i & ":C" & i).Select

    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=k
    End With

Next i
End Sub

【问题讨论】:

标签: vba excel


【解决方案1】:

使用Range.Address propertyexternal:=true 来捕获工作表名称以及单元格区域地址。 Range.Offset property 会随着循环的递增而错开您的选择。

Sub createList()
    'don't declare your vars inside a loop!!!
    Dim k As String, i As Long

    For i = 1 To 100

        With Worksheet("Parameter Options")
            k = "=" & .Range("A1:A10").Offset(0, i - 1).Address(external:=True)
            'debug.print k
        End With

        'Parameter Options is the sheet i am taking list values from
        With Worksheets("Checklist").Range("A" & i & ":C" & i).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                Operator:=xlBetween, Formula1:=k
        End With

    Next i
End Sub

【讨论】:

    【解决方案2】:

    您在使用代码时 don't need column letters

    Sub createList()
      'creating custom list referencing cells from another sheet
    
      Dim i As Long
    
      For i = 1 To 100
        Dim k As String
        k = "='Parameter Options'!R1C" & i & ":R10C" & i
    
        With Worksheets("Checklist").Range("A" & i & ":C" & i).Validation
          .Delete
          .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Application.ConvertFormula(k, xlR1C1, xlA1)
        End With
      Next i
    
    End Sub
    

    【讨论】:

    【解决方案3】:

    使用您的代码,如果您添加此修改,它将正确转换双字母列,但如注释中所述,您最好使用列号,更直接。

    但是,对于一个简单快速的解决方案,这样做可以:

    Dim i As Integer
    
        Dim k As String
        Dim col As String
    
    For i = 1 To 100
    
        If i < 27 Then
            col = Chr(64 + i)
        Else
            col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
        End If
    
        k = "='Parameter Options'!$" & col & "$1:$" & col & "$10"
    
        'Parameter Options is the sheet i am taking list values from
    
        Range("A" & i & ":C" & i).Select
    
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=k
        End With
    
    Next i
    

    【讨论】:

    • 三字母列是否应该有第三种可能性?
    • @Jeeped - 我在 Excel2003 中测试过,2 个字母都可以,但如果在更高版本中不是这种情况,我可以添加。但根据 OP,1 到 100 取决于 DD,而不是更多。
    【解决方案4】:

    这是我的解决方案。 我在另一个循环中生成一个循环,以处理代码 ASCII 中 Z 发生的值。

    希望对您有所帮助:

    For i = 0 To RecordSet.Fields.Count - 1 'This is my data source
        If Ascii > 90 Then
            Ascii = 65
            For y = i To RecordSet.Fields.Count - 1
                Hoja1.Range("A" & Chr(Ascii) & 3).Value = RecordSet.Fields(y).Name
                Ascii = Ascii + 1
            Next
        Else
            Hoja1.Range(Chr(Ascii) & 3).Value = RecordSet.Fields(i).Name
            Ascii = Ascii + 1
        End If
    Next
    

    【讨论】:

      【解决方案5】:

      一种使用模运算也可以为大于 702(= 三个字母)的列找到列字母的解决方案。注意:它不检查有效性。

      代码

      Function colChar(colNo As Long) As String
      If colNo < 1 Then Exit Function
      Dim n As Long
      Dim c As Byte
      Dim s As String
      
      n = colNo
      Do
          c = ((n - 1) Mod 26)    ' locate within A-Z
          s = Chr(c + 65) & s     ' combine characters
          n = (n - c) \ 26        ' check the rest
      Loop While n > 0
      colChar = s                 ' return character(s)
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2013-09-28
        • 2020-09-19
        • 2022-11-18
        • 2018-09-07
        • 2017-12-20
        相关资源
        最近更新 更多