【问题标题】:How do I assign inputbox input to variable for each vba excel如何将输入框输入分配给每个 vba excel 的变量
【发布时间】:2017-10-20 03:58:28
【问题描述】:

我在 VBA 脚本中有一个 for 语句,它遍历一个范围内的每个单元格(范围内的单元格数是可变的,基于用户输入 - 可能是三个单元格,可能是 100)。 for 循环的每个实例都调用一个输入框。如何将来自 for 循环的每个实例的用户输入分配给一个变量以供以后使用? 这是带有输入框的for:

For Each cell In MyQCData
text_string = cell.Value
WrdArray() = split(text_string, ",")
    For i = LBound(WrdArray) To UBound(WrdArray)
        strg = strg & vbNewLine & "Part No. " & i & " - " & WrdArray(i)
    Next i
        InputBox ("This part requires a " & WrdArray(0) & " measurement of the " & _  
        WrdArray(1) & vbNewLine & vbNewLine _
        & "The range for this is input is " & vbNewLine & vbNewLine & "Lower Control Limit     " _
        & WrdArray(2) & vbNewLine & "Upper Control Limit     " & WrdArray(3))
        Erase WrdArray()
Next cell

【问题讨论】:

    标签: excel vba variables for-loop inputbox


    【解决方案1】:

    如果没有其余代码,这有点难以分辨,但我认为MyQCDataRange。试试下面的。我用k 来“蛮力”输入框的外观,仅供参考。

    Dim k As Long
    k = 0
    Dim inputArr() As Variant
    ReDim inputArr(myqcdData.Cells.Count)
    For Each cell In MyQCData
        text_string = cell.Value
    
        WrdArray() = Split(text_string, ",")
        For i = LBound(WrdArray) To UBound(WrdArray)
            strg = strg & vbNewLine & "Part No. " & i & " - " & WrdArray(i)
        Next i
        inputArr(k) = InputBox("This part requires a " & WrdArray(0) & " measurement of the " & _
                               WrdArray(1) & vbNewLine & vbNewLine _
                               & "The range for this is input is " & vbNewLine & vbNewLine & "Lower Control Limit     " _
                               & WrdArray(2) & vbNewLine & "Upper Control Limit     " & WrdArray(3))
        k = k + 1
        Erase WrdArray()
    Next cell
    
    'Check each value in the array. This is optional and can be removed/commented out
    For k = LBound(inputArr) To UBound(inputArr)
        Debug.Print inputArr(k)
    Next k
    

    根据@Yow 的精明评论编辑

    【讨论】:

    • Tsk, tsk, tsk - Erase WrdArray() 在使用 WrdArray 的循环内? (据我所见,OP 无论如何都不需要Erase。)并在For Each Cell 循环之外执行Dim inputArr() As Variant ReDim inpurArr(myqcdData.Cells.Count),否则每次转到下一个@987654331 时都会擦除所有内容@。火星上几点了——你一定累了! :D
    • @YowE3K 真实时间 - 当我在 Wayne Enterprises 工作时,它接近家庭时间,可能让一两件事情溜走了我的视线。我从 savi 回家后会编辑……我是说商务晚餐。
    【解决方案2】:

    我将用一个独立的代码来修饰它,您可以轻松地运行它来了解正在发生的事情。必须声明数组变量,因此 Dim userInput(99) 和 99 是上限(0-99 = 100 个可能值)。第一个循环的第一行设置变量,即userInput(j) = InputBox("Sample InputBox", "InputBox Title", "blah" & j) "blah" & j 位是默认条目,这在您编写/调试时很有用,因为保持进入要快得多虚拟数据...

    Sub inputBoxEg()
        Dim userInput(99)
        Dim MyQCData As Range
    
        Set MyQCData = Range("A1:A4")
    
        'Set InputBox inputs to a variable array called userInput:
        j = 0
        For Each cell In MyQCData
            userInput(j) = InputBox("Sample InputBox", "InputBox Title", "blah" & j)
            If userInput(j) = "" Then Exit Sub 'if user pressed cancel or entered blank
            j = j + 1
        Next cell
    
        'Collate variables collected by InputBoxes in a text string called allInputs:
        allInputs = ""
        For i = 0 To j - 1
            If i = 0 Then
                allInputs = i & ": " & userInput(i)
            Else
                allInputs = allInputs & vbNewLine & i & ": " & userInput(i)
            End If
        Next i
    
        MsgBox allInputs
    End Sub
    

    【讨论】:

    • 我还没有机会尝试这里的建议,但我非常感谢您的回复。通过阅读,我看到了足够多的东西,我应该能够做到这一点。我喜欢这个网站,学到了很多东西——也许有一天我会回答其他人的问题。太棒了!
    • 刚刚有机会尝试这些建议。完美,谢谢!
    【解决方案3】:

    是的,使用数组:

    Dim inputBoxAnswers() As String
    ReDim inputBoxAnswers(1 To MyQCData.Cells.Count)
    Dim cellCounter As Long
    For Each cell In MyQCData
        text_string = cell.Value
        WrdArray() = split(text_string, ",")
    
        'Is this loop needed???
        For i = LBound(WrdArray) To UBound(WrdArray)
            strg = strg & vbNewLine & "Part No. " & i & " - " & WrdArray(i)
        Next i
    
        cellCounter = cellCounter + 1
        inputBoxAnswers(cellCounter) = InputBox("This part requires a " & _
                                       WrdArray(0) & " measurement of the " & _  
                                       WrdArray(1) & _
                                       vbNewLine & vbNewLine & _
                                       "The range for this is input is " & _
                                       vbNewLine & vbNewLine & _
                                       "Lower Control Limit     " & WrdArray(2) & _
                                       vbNewLine & _
                                       "Upper Control Limit     " & WrdArray(3))
    Next cell
    

    如果您的MyQCData 范围不是单列或单行,您可能会发现使用二维数组更容易,它可以(也许)使用

    Dim inputBoxAnswers() As String
    ReDim inputBoxAnswers(1 To MyQCData.Rows.Count, 1 To MyQCData.Columns.Count)
    

    但是在为元素分配值时,您将需要重新设计要使用的索引。 可能需要

    inputBoxAnswers(cell.Row - MyQCData.Row + 1, cell.Column - MyQCData.Column + 1) = ....
    

    但很大程度上取决于您之后打算如何使用该数组。

    【讨论】:

    • 我喜欢。除了使用新变量cellCounter,您可以使用MyQCData.cell.row 吗?或者什么,主要范围的想法有单元格,并使用每个单元格的行主要范围内?
    • @BruceWayne - 如果MyQCData 是一维的,您可以使用inputBoxAnswers(cell.Row - MyQCData.Row + 1),或者您可以使用ReDim inputBoxAnswers(MyQCData.Row To MyQCData.Row + MyQCData.Rows.Count - 1) 进行标注,然后使用inputBoxAnswers(cell.Row)。 (显然,如果 MyQCData 从第 1 行开始,这些表达式会简化很多,因为 MyQCData.Row - 1 将是 0。)很大程度上取决于 MyQCData 的形状和答案的预期用途,很难猜出是什么是最好的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多