2017-09-19 19 views
0

この質問は何度も聞かれるようですが、いくつか問題があります。タスクには、各セルの区切り文字(区切り文字はスペース ""です)に列のいくつかのセルが与えられ(列Aといいます)、得られたすべての単語を別の列に印刷します(C列)。ここで列内のテキストを単語に分割して別の列に印刷する

Sub splitting() 

Dim tmp As Collection 
Dim i As Integer, j As Integer 

For i = 0 To 3 
    tmp.Add split(Cells(i + 1, 1).Value, " ") 
Next i 

For j = 0 To tmp.Count 
    Cells(j + 1, 3).Value = tmp(j) 
Next j 

End Sub 

が、私は動的再配置する能力を持っている(ループ内で新しいアイテムを毎回追加)する代わりに、配列のコレクションを使用します。

は、いくつかの答えを読んだ後、私は次のコードを書きました。また、テキストはテストするために最初の4行にしかないと仮定します。それは私にエラーを与える

ファイル名を指定して実行時エラー「91」:変数またはWithブロック変数が私が間違っているのは何

に設定されていないオブジェクト、私はそれをどのように行う必要があります適切な方法?

+2

あなたは 'Set tmp = new collection'を忘れたのでしょうか? – CommonSense

+0

どの行にエラーが表示される – jsotola

+0

とにかく、2番目のループでは、配列に単一セルの値を渡そうとしています。あなたはここで何を期待していますか?配列を二重セル範囲に渡す必要があります。最初に配列を転置して垂直次元に収まるようにする必要があります。 – CommonSense

答えて

2

以下の例を参照してください、コメントで述べたすべての問題を要約すると:

入力:

one two three four five 
six seven eight nine 
ten eleven twelve 


Sub splitting() 

    Dim tmp As Collection 
    Dim i As Integer, j As Integer, k As Integer 

    Set tmp = New Collection 

    For i = 1 To 3 
     tmp.Add Split(Cells(i, 1).Value, " ") 
    Next i 

    For j = 1 To tmp.Count 
     For k = 0 To UBound(tmp(j)) 
      Debug.Print tmp(j)(k) 
     Next k 
    Next j 
End Sub 

出力:

one 
two 
three 
four 
five 
six 
seven 
eight 
nine 
ten 
eleven 
twelve 
-2

あなたのコレクションは宣言されていますが、初期化されていません。変更してみてください:

Dim tmp As New Collection 
+0

これは自動インスタンス化と呼ばれ、避けるべきです。オブジェクトは実際には作成されませんが、コードで最初に遭遇したときに作成されます。 –

+1

[なぜ新しいものは避けるべきか](https://stackoverflow.com/a/42656772/6634373) – CommonSense

関連する問題