• ベストアンサー

VBAで文字列を各セルに出力

はじめまして。 業務でVBAを使うことになり、勉強中なのですが、 動的な文字列をスペースごとに区切り、各セルに出力する方法がわかりません。 どなたかご教授ください。 str = "EMPNO = 1111 AND DEPTNO = 4444" という文字列を 演算子 フィールド 条件 比較値 ------------------     EMPNO  | = | 1111 AND | DEPTNO  | = | 4444 となるようにしたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

こんな感じになると思います。 Sub test() Dim str As String Dim field() As String Dim col As Integer Dim row As Integer str = "EMPNO = 1111 AND DEPTNO = 4444" 'VBでは決まった文字列で文字列を分割する場合にSplit関数を使用します。分割した文字列を配列で返してくれます。 field = Split(str, " ") '開始位置の指定col=行,row=列です col = 2 row = 1 '配列を1要素づつ取り出します。 'for i構文を使用する場合は配列数を返す関数であるUBound(配列)を使用することで書き換えられます。 For Each s In field '演算子の場合は行を一段ずらします。 If s = "AND" Or s = "OR" Then row = row + 1 col = 1 End If '複数のブックを開いた状態で実行する場合はブックの指定も必要です。 ActiveSheet.Cells(row, col).Value = s col = col + 1 Next End Sub

volving
質問者

お礼

ご指摘ありがとうございます! 私も最初はSplitを使ってやっていたのですが配列にした後さらに配列にする必要があったので断念していました。 しかし、Splitの適切な使用法がわかりました! ありがとうございました!

その他の回答 (2)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>str = "EMPNO = 1111 AND DEPTNO = 4444"  「str」にはどのような内容が格納されるのでしょうか?  例えば、 arr = Split(str) Range("A1").Resize(1, UBound(arr) + 1).Value = arr というようなことで、「str」を「スペースごとに区切り」A1:G1 の「各セルに出力する」ことはできます。  あるいは、2行目を With Range("A2")  .Offset(0, 1).Value = arr(0)  .Offset(0, 2).Value = arr(1)  .Offset(0, 3).Value = arr(2)  .Offset(1, 0).Value = arr(3)  .Offset(1, 1).Value = arr(4)  .Offset(1, 2).Value = arr(5)  .Offset(1, 3).Value = arr(6) End With とするとご希望のようにもできます。

volving
質問者

お礼

ご指摘ありがとうございます! strにはSQLの抽出条件が入るようになっています! 条件が一つだけのときは出来たのですが、複数になった時はお手上げでした。 しかし、みなさんのを参考にやってみたいと思います! ありがとうございました!!!

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.2

ダサいですけど。 Option Explicit Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/04/07 ユーザー名 : fuc ' ' Dim myStr As String '検査する文字列 Dim myPos As Long 'スペースの出現箇所 Dim myAfter(10) As String '分解後の配列(10個までとする) Dim i As Long 'いま何個目を処理しているか i = 0 'ゼロクリア' myStr = "EMPNO = 1111 AND DEPTNO = 4444" '文字列を入れておく' myPos = InStr(myStr, " ") 'スペースがmyStrの何文字目に出てくるか While (myPos > 0) '出てきている限り繰り返す i = i + 1 '何個目かを増やす myAfter(i) = Left(myStr, myPos - 1) '左からスペースまでをmyAfter(いまやっている個数)に入れる myStr = Mid(myStr, myPos + 1) 'スペース以降右全部を新しいmyStrに myPos = InStr(myStr, " ") 'スペースがmyStrの何文字目に出てくるか Wend For i = 1 To 10 'ちゃんとできたかテスト MsgBox "I>>" + Str(i) + "<< myAfter>" + myAfter(i) + "<" Next i End Sub あと、セルでやるっていうのだったら「データ>>区切り位置」をマクロ記録したらこうなりました。 Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(5, 1), Array(7, 1), Array(12, 1), Array(16, 1), _ Array(23, 1), Array(25, 1)), TrailingMinusNumbers:=True

volving
質問者

お礼

ご指摘ありがとうございます! ダサくなんかないです! いろいろなやり方があるんですね! みなさんの実力に脱帽するばかりです!!! 私もみなさんのように早くなりたいです! ありがとうございました!

関連するQ&A