VBAで変数を配列に格納する際の条件

このQ&Aのポイント
  • VBAで変数を配列に格納する際には、二つの条件を指定することができますか?
  • VBAで配列に格納する際、指定条件の例を教えてください。
  • VBAのSplit関数を使用して、指定条件に合わせた結果を得る方法について教えてください。
回答を見る
  • ベストアンサー

変数を配列に格納する時に、二つの条件を指定すること

変数を配列に格納する時に、二つの条件を指定することはできますか? VBAです。 Private Sub test() Dim i As Long Dim Str As String Dim tmp As Variant Str = "a,i,u-e-o" tmp = Split(Str, ",") '配列に格納する For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub の場合、結果が a i u-e-o になってしまいます。 tmp = Split(Str, "," or "-") のようなことをして a i u e o と表示させたいです。 "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。ご教授よろしくお願いします。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.4

Str = "a,i,u-e-o" tmp = Split(Replace(Str, "-", ","), ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i

jkiju9
質問者

お礼

できました。ありがとうございました。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、cjです。 すみません、勘違いで書きすぎました。 #2さん、ご紹介の方法でいくつかありますね。 大変失礼いたしました。

jkiju9
質問者

お礼

いえいえ。とても参考になりました。

  • golab
  • ベストアンサー率50% (1/2)
回答No.2

参考URLでSplitに正規表現を使用する方法が紹介されてますね。

参考URL:
http://okwave.jp/qa/q1405463.html
jkiju9
質問者

お礼

正規表現は難しいので勉強します。ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 Sub Re7759904a()   Dim i As Long   Dim sStr As String   Dim tmp As Variant   sStr = "a,i,u-e-o" ' ' 区切り文字を(置換によって)統一後、配列に格納する   tmp = Split(Replace(sStr, "-", ","), ",")   For i = LBound(tmp) To UBound(tmp)     Debug.Print tmp(i)   Next i End Sub Split()関数のように非ループで実現するには、一旦置換するしかないですね。 > "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。 という限定がどういう意味なのかはわかりませんけれど。 或いはループを考えるにしても、区切り文字を統一した方が結局は効率的です。 また、区切り文字は本来、その文字(記号)が、テキストの中で 区切り文字以外の意味で使われることがない という前提で成り立っていますから、 そういう意味では、既に使われている区切り文字に置換する、ということに 問題があるとは思えません。 もしかしたら、ここに書かれていない条件があるのでしょうか?

jkiju9
質問者

お礼

> "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。 という限定がどういう意味なのかはわかりませんけれど。 なんか自分で読み返しても意味がわかりませんでした笑 すいませんでした。 置換しちゃえばいいんですね! うまく行きました。ありがとうございました。

関連するQ&A

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • InternetExplorer.Applicat

    Sub test1() Dim objIE As Object Dim i As Long Dim MyRow As Long Dim Str As String Dim tmp As Variant Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://oshiete.goo.ne.jp/" objIE.Visible = True Do While objIE.Busy = True DoEvents Loop Str = objIE.Document.Body.innerHTML 'ソースを抜き出す tmp = Split(Str, Chr(10)) '配列に格納する MyRow = 1 '初期値 For i = LBound(tmp) To UBound(tmp) Cells(MyRow, 1) = tmp(i) MyRow = MyRow + 1 Next i objIE.Quit Set objIE = Nothing End Sub ************************************************** Sub test2() Dim objIE As Object Dim Str As String Dim tmp As Variant Dim i As Long Dim MyRow As Long Set objIE = CreateObject("MSXML2.XMLHTTP") objIE.Open "GET", "http://oshiete.goo.ne.jp/", False objIE.Send Str = objIE.responseText 'ソースを抜き出す tmp = Split(Str, Chr(10)) '配列に格納する MyRow = 1 '初期値 For i = LBound(tmp) To UBound(tmp) Cells(MyRow, 1) = tmp(i) MyRow = MyRow + 1 Next i Set objIE = Nothing End Sub ************************************************** 上記の二つのコードは どちらもVBAでHTMLソースをエクセルに書き出すコードなのですが 結果が違います。 なぜなのでしょうか? 実際のソースを確認したら CreateObject("MSXML2.XMLHTTP") の方が正しかったです。 CreateObject("InternetExplorer.Application") は何が取得されてるのでしょうか?

  • 配列に格納したデータを指定行以下に転記する方法

    excel2000を使っています。 以下のコードだと最終行にデータが転記されます。これを4行目に確定して、転記したいのです。常に4行目つまりA列4行目以下に上書きしたいのです。 その場合コードをどのように変更すべきでしょうか? Sub 配列() With ActiveSheet ' 配列に格納 --------------------------- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 --------------------------- SaleAry = Array(.Range("t4"), .Range("e5"), .Range("g5"), .Range("o5")) End With ' 転記 --------------------------- With Worksheets("daityou") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) ' Next i End With Set SaleAry = Nothing End Sub

  • 動的配列の後始末?

    以下のサブルーチンで、lines()と動的配列を定義して、Splitでデータを入れたのですが、このサブルーチンが終了すると、lines()はデータも含めて解放されるのでしょうか? 極端な話、1億回このサブルーチンを呼ぶと、メモリーリークするのでしょうか? それと、VB6やVB.NETでは、For文・For Each文のどちらを使う方が良いのでしょうか? Sub test() Dim lines() As String lines = Split(Data, vbCrLf, -1, vbBinaryCompare) Dim i As Integer For i = LBound(lines) To UBound(lines) MsgBox ("for=[" & lines(i) & "]") Next i Dim s As Variant For Each s In lines MsgBox ("for each=[" & s & "]") Next End Sub

  • 配列格納時にスペース、セル内改行を無視したい。

    ExcelVBAで、配列に文字列を一文字ずつ格納する方法について質問します。 以下の(1)の機能において改行や、全半角スペースは無視して格納したい のですが、方法が判りません。教えてください。よろしくお願いします。 下記のマクロは、 (1)A1セルに記載された文字列を,1文字ずつ配列aに格納し、 <現行では、a(n,0)には、左からn文字目、a(n,1)には右からn文字目の文字が格納される> (2)B列、C列に1それぞれの文字を順々に1文字ずつ順次転記し、 (3)B列の文字のうち”ー”を”~”に変更する マクロです。これの出力結果を、添付画像の赤枠内にようにしたいというのが、質問の内容です。 よろしくおねないします。 【マクロのソース】 Public a() As Variant Public s As String Sub Macro1() Dim n As Long, i As Long s = Range("A1") n = Len(s) Call submacro(n) Call submacro2(n) Call submacro3(n) End Sub Sub submacro(n As Long) Dim ss As String ReDim a(n - 1, 1) For i = 1 To n ss = Mid(s, i, 1) a(i - 1, 0) = ss a(n - i, 1) = ss Next i End Sub Sub submacro2(n As Long) Dim i As Long For i = 1 To n Cells(i, 2) = a(i - 1, 0) Cells(i, 3) = a(i - 1, 1) Next i End Sub Sub submacro3(n) Range("B1").Resize(n, 1).Select Selection.Replace What:="ー", Replacement:="~", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub 【関連質疑】 http://okwave.jp/qa/q7479718.html

  • VBAでSplitエラーです

    環境:Excel2002です   Cells(1, 1)に(1)~(10),(13),(20)~(28)のような値があります   Cells(1, 1)の値は別のプロシージャ求めていてその都度変わります   Cells(j, 4)をスタート位置にして   Cells(j, 4)に(1)~(10)   Cells(j+1, 4)に(13)   Cells(j+2, 4)に(20)~(28)を表示したいので   以下のプロシージャにしました Dim Str As String Str = ActiveSheet.Cells(1, 1).Value Dim i As Integer Dim j As Integer '◆カンマで区切った文字列をD列に格納 Dim tmp As Variant tmp = Split(Str, ",") j = 1 For i = 0 To UBound(tmp) ActiveSheet.Cells(j, 4) = tmp(i) j = j + 1 Next i   あるブックでは正常に動作するのですが   別のブックでは以下のエラーメッセージがでて動作しません   【モジュールではなく、変数またはプロシージャを指定してください】   何が原因なのでしょうか?ご教示願います   Splitを使わない別の方法があればそれでも結構です   とにかく困っています

  • エクセルVBAで配列?

    以下は、文字列"t", "e", "s", "t"を配列に取り込み、セルに表示する例ですが、 ar = Array("t", "e", "s", "t") なら作動しますが、セル範囲から取り込もうと、 ar = Range("A1:D1").Value とするとエラーになります。 どうしてでしょうか? Sub test() Dim ar As Variant Dim n As Integer ar = Array("t", "e", "s", "t") 'ar = Range("A1:D1").Value For n = LBound(ar) To UBound(ar) Cells(n + 1, 5) = ar(n) Next n End Sub

  • 配列変数 インデックス番号の最小値

     特に指定しない場合、配列変数のインデックス番号の最小値は0から始まるはずですが、下記のプロシージャでは、abの最小インデックス番号は1,2次元とも「0」でなく「1」から始まります(ウォッチ式で見ても「1」から始まっています)。 「0」から始まらない理由が分かりません。 ご教授を よろしくお願いいたします。 Public Sub セル参照() ' "A1:B10"のセル範囲のデータを順番にメッセージボックスに表示する。 Dim ab As Variant Dim i As Integer, j As Integer ab = Worksheets("Sheet1").Range("A1:B10").Value For i = 1 To UBound(ab, 1) For j = 1 To UBound(ab, 2) MsgBox ab(i, j) Next j Next i End Sub

  • 配列の個数を数えたい

    Dim ar As Variant ar = Split(moji, "/") '配列に格納 for i = 0 to arの[配列の最大数] next [配列の最大数]の部分がわかりません。 たしか、「b」で始まって、「d」で終わり、中に「o」が入ってたような気がします、、、 (自信ないです) どなたかこれだけのヒントでわかる方いらしたら ご解答よろしくお願いします。

専門家に質問してみよう