使用多维数组的单元格拆分Excel VBA

时间:2016-03-06 04:46:32

标签: excel vba excel-vba

我正在尝试拆分多行文本框并使用VBA将输出粘贴到MS Excel中的下一张工作表上,我在下面找到了一段代码并且它可以工作:

    Dim Str As String, a
    Dim cnt As Integer
    Dim w()

    Str = xmlRequestTextBox.Value
    a = Chr(10)
    cnt = UBound(Split(Str, a))
    MsgBox (Str)
    MsgBox (a)
    MsgBox (cnt)
    ReDim w(1 To cnt + 1, 1 To 1)

    For i = 0 To cnt
     w(i + 1, 1) = Split(Str, Chr(10))(i)
    Next i

    Sheet2.range("A1").Resize(i, 1) = w
    Sheet2.Cells.Replace Chr(13), " "

现在我的问题是当我尝试修改它并将其更改为单维数组时,它只输出数组的第一个索引的值。为什么阵列必须是多维的?先谢谢你。

3 个答案:

答案 0 :(得分:0)

对于多行文本,您需要使用Split()函数返回的2d数组,其中第一个维度通常是指行(行),第二个索引是指这些行中的单个词。希望这可能有所帮助。

答案 1 :(得分:0)

使用拆分

的示例
Option Explicit
Private Sub CommandButton1_Click()

Dim Str As String
Dim cnt As Integer
Dim w As Variant

Str = Me.xmlRequestTextBox.Value
w = Split(Str, Chr(10))
cnt = UBound(w)
MsgBox (Str)
MsgBox (Chr(10))
MsgBox (cnt)

' suppose the multi-line textbox value is:
' first line : 1 2 3
' second line: 4 5 6
' third line:  7 8 9
With ThisWorkbook.Sheets("split")
    .Range("A1").Resize(cnt + 1) = w(1) ' writes "4 5 6" in A1:A3 (i.e. the 2nd element of w)
    .Range("B1").Resize(cnt + 1) = Split(w(0), " ")(2) ' writes "3" in B1:B3 (i.e. the third element of the 1st element of w)
    .Cells.Replace Chr(13), " "
End With

End Sub

我认为有一些UserForm有一个名为“xmlRequestTextBox”的多行文本框和一个名为“CommandButton1”的按钮,其click事件启动了你的那段代码

答案 2 :(得分:0)

要回答您的问题,数组必须是多维的。但是,Excel假定一维数组将水平,即在单行中填充。因此,如果您在电子表格中写入垂直范围(单列 >),它将采用第一个元素(列)并将其写入列中的每个单元格。例如,假设您有一个这样的数组:

MyArray = Array(1, 2, 3, 4, 5)

此代码会将MyArray的第一个元素写入 A列中的垂直范围:

Set MyRange = Range("A1").Resize(5, 1)    ' Cells A1:A5
MyRange.Value = MyArray

结果:

    A | B | C | D | E
  +---+---+---+---+---+
1 | 1 |   |   |   |   |
2 | 1 |   |   |   |   |
3 | 1 |   |   |   |   |
4 | 1 |   |   |   |   |
5 | 1 |   |   |   |   |

如果您将数组写入单行中的水平范围,那么它将显示整个数组

Set MyRange = Range("A1").Resize(1, 5)    ' Cells A1:E1
MyRange.Value = MyArray

结果:

    A | B | C | D | E
  +---+---+---+---+---+
1 | 1 | 2 | 3 | 4 | 5 |
2 |   |   |   |   |   |
3 |   |   |   |   |   |
4 |   |   |   |   |   |
5 |   |   |   |   |   |

但是,我假设您确实希望将数组写入单列中的 vertical 范围。您可以通过在阵列上使用 Application.WorksheetFunction。 Transpose 方法来完成此操作。这会将数组的每个元素写入A列中的行:

Set MyRange = Range("A1").Resize(5, 1)    ' Cells A1:A5
MyRange.Value = Application.Transpose(MyArray)

结果:

    A | B | C | D | E
  +---+---+---+---+---+
1 | 1 |   |   |   |   |
2 | 2 |   |   |   |   |
3 | 3 |   |   |   |   |
4 | 4 |   |   |   |   |
5 | 5 |   |   |   |   |

有关此内容的更多信息,请参阅VBA Arrays And Worksheet Ranges

上的Chip Pearson页面