Arrays 将用户选择的范围传递到数组中,然后传递到userform文本框中
我试图让我的代码提示用户选择3宽度和可变长度的数据范围。只有30个值,其中一些行为空。我想将这30个值填充到我的userform中的30个文本框中,这样就不必手动输入值。我环顾四周,发现我的路线应该是Apple .InPosibox,然后将它传递到一个数组中。但我不知道如何将用户选择的表传递到2D数组中Arrays 将用户选择的范围传递到数组中,然后传递到userform文本框中,arrays,vba,excel,textbox,user-input,Arrays,Vba,Excel,Textbox,User Input,我试图让我的代码提示用户选择3宽度和可变长度的数据范围。只有30个值,其中一些行为空。我想将这30个值填充到我的userform中的30个文本框中,这样就不必手动输入值。我环顾四周,发现我的路线应该是Apple .InPosibox,然后将它传递到一个数组中。但我不知道如何将用户选择的表传递到2D数组中 Sub selectRange() Dim r(1 To 14, 1 To 3) As Variant, ran As Range, calB(1 To 30) As Long, i As In
Sub selectRange()
Dim r(1 To 14, 1 To 3) As Variant, ran As Range, calB(1 To 30) As Long, i As Integer, j As Integer, k As Integer, l As Integer
dozerCal.Hide
Set r = Application.InputBox("Select the Cal B table.", Type:=8)
For j = 1 To 14
For i = 1 To 3
If Abs(r(j, i)) > 0 Then
calB(l) = r(j, i)
l = l + 1
End If
Next
Next
lx = calB(1)
ly = calB(2)
lz = calB(3)
rx = calB(4)
ry = calB(5)
rz = calB(6)
ix = calB(7)
iy = calB(8)
iz = calB(9)
sx = calB(10)
sy = calB(11)
sz = calB(12)
p1x = calB(13)
p1y = calB(14)
p1z = calB(15)
p2x = calB(16)
p2y = calB(17)
p2z = calB(18)
lfx = calB(19)
lfy = calB(20)
lfz = calB(21)
lrx = calB(22)
lry = calB(23)
lrz = calB(24)
rfx = calB(25)
rfy = calB(26)
rfz = calB(27)
rrx = calB(28)
rry = calB(29)
rrz = calB(30)
ActiveWorkbook.Close
dozercall.Show
End Sub
提前感谢大家的帮助。编辑:我错过了您使用输入框的错误,但是我将留下这个答案,因为它提供了一种方法,可以将用户输入的可变范围从多维数组折叠为单个维数组
这应该让你开始。基本上,它将读取用户的输入,动态创建大小正确的行*列的一维数组,并读取用户选择的该一维数组范围内的所有值。然后它将在一维数组中循环,并将值打印回窗口
我想这就是你想要的,但如果你需要进一步的澄清,我可以补充一些。我添加了注释,以便您可以看到每个部分都在做什么
Option Explicit
Private Sub TestArrays()
Dim calBTemp() As Variant, calB() As Variant
Dim i As Long, j As Long, x As Long
Dim rngInput As Range
Set rngInput = Application.InputBox("Select the Cal B table.", "Select Range", Type:=8)
'Read the user input, check for empty input
'If empty input, exit the subroutine
If Not rngInput Is Nothing Then
calBTemp = rngInput
Else
Exit Sub
End If
'Create the one-dimensional array dynamically based on user selection
ReDim calB((UBound(calBTemp, 1) - LBound(calBTemp, 1) + 1) * (UBound(calBTemp, 2) - LBound(calBTemp, 2) + 1))
'Loop through our multidimensional array
For i = LBound(calBTemp, 1) To UBound(calBTemp, 1)
For j = LBound(calBTemp, 2) To UBound(calBTemp, 2)
'Assign the value to our one dimensional array
calB(x) = calBTemp(i, j)
x = x + 1
Next j
Next i
'Loop through our one dimensional array
For i = LBound(calB) To UBound(calB)
Debug.Print calB(i)
Next i
End Sub
所以我没有使用应用程序。输入框正确。如果将其作为一个范围返回,它将配置为适当大小的2D数组,您可以从中调用/操作数据。这是一艘正在工作的潜艇
Sub selectRange()
Dim ran As Range, calB(1 To 30) As Double, i As Integer, j As Integer, k As Integer, l As Integer
dozerCal.Hide
Set ran = Application.InputBox("Select the Cal B table.", Type:=8)
l = 1
For j = 1 To 14
For i = 1 To 3
If Abs(ran(j, i)) > 0 Then
calB(l) = ran(j, i)
l = l + 1
End If
Next
Next
lx = calB(1)
ly = calB(2)
lz = calB(3)
rx = calB(4)
ry = calB(5)
rz = calB(6)
ix = calB(7)
iy = calB(8)
iz = calB(9)
sx = calB(10)
sy = calB(11)
sz = calB(12)
p1x = calB(13)
p1y = calB(14)
p1z = calB(15)
p2x = calB(16)
p2y = calB(17)
p2z = calB(18)
lfx = calB(19)
lfy = calB(20)
lfz = calB(21)
lrx = calB(22)
lry = calB(23)
lrz = calB(24)
rfx = calB(25)
rfy = calB(26)
rfz = calB(27)
rrx = calB(28)
rry = calB(29)
rrz = calB(30)
ActiveWorkbook.Close
dozerCal.Show
End Sub
此代码将执行此操作,并强制用户选择3列14行:
Sub selectRange()
Dim selectedRange As Range
Dim errorMessage As String
errorMessage = vbNullString
Dim ran As Range, calB(1 To 30) As Long, i As Integer, j As Integer, k As Integer, l As Integer
Do
'doesn't handle cancel event
Set selectedRange = Application.InputBox("Select the Cal B table.", _
Type:=8, Title:="Please select 14 rows and 3 columns" & errorMessage)
errorMessage = "; previous selection was invalid"
Loop While selectedRange.Columns.Count <> 3 Or selectedRange.Rows.Count <> 14
For j = 1 To 14
For i = 1 To 3
If Abs(selectedRange.Cells(j, i)) > 0 Then
calB(l) = selectedRange.Cells(j, i)
l = l + 1
End If
Next
Next
...rest of your code
可变长度,但30是您将拥有的最大值?也就是说,最大值将是一个3列10行的表格?用于输入回文本框是的,但表格的读数通常是3乘14,有4个空白行,因此是剔除部分。我解决了我的问题,我已经发布了我的答案,如果你想看看是否有任何问题,但对我来说,代码运行得很好。