必需:引用列表中的列值。
一个工作表中有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
答案 0 :(得分:5)
使用Range.Address property和 external:= 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
答案 1 :(得分:5)
使用代码时,您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
答案 2 :(得分: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
答案 3 :(得分:1)
这是我的解决方案。 我在另一个内部生成一个循环,以处理代码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
答案 4 :(得分:0)
使用模数算术也可以为大于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