【问题标题】:VBA TextBox pass value of each line to cell rangeVBA TextBox将每行的值传递给单元格区域
【发布时间】:2017-07-25 21:59:27
【问题描述】:

用户将电子表格中的值粘贴到多行文本框中。 TextBox 将如下所示(默认情况下以制表符分隔):

所以每行有 3 个值,SKU、数量、价格,它们之间用 2 个标签分隔。 (有时可能会省略数量或价格的值)。

现在尝试将每行的每个值传递到 3 个专用单元格,J1 K1 和 L1。

最终结果应如下图所示。 (单元格将被下一行的值覆盖)

到目前为止,我的代码成功地将每一行的值传递给 MsgBox。

Sub passValuesToCell()    

    UserForm1.TextBox25.SetFocus
    lines = UserForm1.TextBox25.LineCount
    For i = 0 To lines - 1
        MsgBox Split(UserForm1.TextBox25, Chr(13))(i)
    Next

End Sub

如何修改代码以将值传递到 J1 K1 L1?试过这辆公共汽车但出错了

 Sub passMultiSkuToCell()
 Dim a() As String

    UserForm1.TextBox25.SetFocus
    lines = UserForm1.TextBox25.LineCount
    For i = 0 To lines - 1
        a() = Split(UserForm1.TextBox25, Chr(13))(i)
        Range("J1").Resize(UBound(a) + 1, 1).Value = a()
    Next

 End Sub

【问题讨论】:

    标签: excel textbox multiline vba


    【解决方案1】:

    无需使用SetFocusLineCount;你可以先用vbLf分割得到行数,然后用vbTab分割每一行。试试这个:

    Sub passValuesToCell()
        Dim lines: lines = Split(UserForm1.TextBox25.value, vbLf)
        Dim i As Long
        For i = 0 To UBound(lines)
            Sheet1.Range("J" & i + 1).Resize(, 3).value = Split(lines(i), vbTab)
        Next
    End Sub
    

    附言如果你想覆盖相同单元格 J1 K1 L1 上的行(我没看到原因,但是很好),那么只需将 "J" & i + 1 替换为 "J1"

    【讨论】:

    • A.S.H.这在将选项卡式值吐出到相邻单元格中效果很好,但它会立即将所有行复制到单元格 J1 J2 等中。我需要的是逐行执行并覆盖 J1 K1 L1。
    • @joell 然后将"J" & i + 1 替换为"J1"
    • 更近了!现在如何在每个单元格的行输入之间运行另一个宏?这就是我只想指定这些单元格的原因,而宏将解析这些单元格的值,每次都不同。很抱歉没有指出这一点。
    • A.S.H 现在像一个魅力一样工作,只是在 Next 之前添加了宏。上帝保佑你!
    【解决方案2】:

    您可以使用分隔符和起始地址来满足您的需求。 如果您想硬编码,可以将 NumCols 更改为 3。

    下面的代码将使用字符串数组和偏移命令将每一行粘贴到目标位置。

    Sub passValuesToCell()
      ' Set active worksheet
      Dim sht As Worksheet
      Set sht = ActiveSheet
    
      ' Set delimiter
      Dim myDelimiter As String
      myDelimiter = Chr(13)
    
      ' Initial array with lines
      Dim lines(1 To 3) As String
      lines(1) = "ABC" & myDelimiter & "10" & myDelimiter & "20"
      lines(2) = "DEF" & myDelimiter & "20" & myDelimiter & "30"
      lines(3) = "GHI" & myDelimiter & "30" & myDelimiter & "40"
    
      ' Temporary array to get each line
      Dim NumRows As Long: NumRows = UBound(lines, 1) - LBound(lines, 1) + 1 ' Row Count - your LineCount
      Dim NumCols As Long: NumCols = UBound(Split(lines(1), myDelimiter)) + 1 ' Column count - you can hardcode it to 3
    
      ' Set the destination to start from
      Dim StartAddress As String: StartAddress = "A1"
    
      ' Set destination range to be 1 row and with NumCols columns
      Dim MyDestination As Range: Set MyDestination = sht.Range(StartAddress).Resize(1, NumCols)
    
      For i = 1 To NumRows
        MyDestination.Value = Split(lines(i), myDelimiter) ' Split lines to the current destination
        Set MyDestination = MyDestination.Offset(1, 0) ' go to next row in destination range
      Next i
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多