• ベストアンサー

VB6イルミネーションプログラムその3

いつもお世話になっています。 テキストボックスに1~255までの数字を入力し、コマンドボタンをクリックしたら、入力した数字を2進数に変換してランプを点灯するというプログラムを考えています。 例えば、テキストボックスに170と入力し、コマンドボタンをクリックしたら以下の様にランプが点灯するプログラムです。 ●○●○●○●○ 10101010 170の2進数 色々と調べ目的とする動きはするのですが、別の方法として値を引数にして2進数に変換した値でランプを点灯する処理を手続き(サブルーチン)として分離するという処理はどのようにすればよいのでしょうか? 現コードは以下です。(未熟ですので、コメントが見苦しくすみません…) Private Sub cmd1_Click() '変数の宣言 Dim Kazu As String Dim Binary(7) As Integer Dim Nishin As Integer Dim Value As String Dim Index As Integer 'テキストボックスへ入力した文字列を数値型に変換し、格納 Nishin = Val(txtKazu.Text) '2進数への変換処理 For Index = 0 To 7 Step 1 'Nishinに入力された数値を2で除算し、8ビット分の余りを繰返し求め格納 Binary(Index) = Nishin Mod 2 'Nishinの除算の商を求め、格納 Nishin = Nishin \ 2 Next Index '各余りを下から順に並べる処理 For Index = 7 To 0 Step -1 '変数Binaryを変数Kazuの型である文字列型へ変換し、連結して格納 Kazu = Kazu & CStr(Binary(Index)) Next Index '2進数の結果をランプコントロールへ反映 CWBtn(0).Value = Mid(Kazu, 8, 1) CWBtn(1).Value = Mid(Kazu, 7, 1) CWBtn(2).Value = Mid(Kazu, 6, 1) CWBtn(3).Value = Mid(Kazu, 5, 1) CWBtn(4).Value = Mid(Kazu, 4, 1) CWBtn(5).Value = Mid(Kazu, 3, 1) CWBtn(6).Value = Mid(Kazu, 2, 1) CWBtn(7).Value = Mid(Kazu, 1, 1) End Sub サブルーチンって??と思い、サイトや参考書を色々と見たのですが、サンプルコードなどを見ても理解出来ませんでした。 未熟で理解が浅いのですが、役割として「離れた箇所の文の並びを実行し、元の場所に制御を戻す」という様な感じですよね…元の場所で実行せず、わざわざ離れた箇所で実行するメリットもピンときません… 宜しくお願いします。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.3

サブルーチンは私の言葉で簡単に表現しますと、特定の動作をする「小さな部品」です。ただ、 百聞は一見にしかず!! ということで、質問に書いてあるプログラムをサブルーチンにくくり出して見ましょう。まず、2進数の文字列に変換することだけをするプログラムの部品です。この部品にDecToBinaryという名前を仮につけてあげましょう。その部品にはこんなソースを書きます。 Private Function DecToBinary(Byval intValue As Integer) As String DecToBinary = "" Do Until intValue < 2 DecToBinary = CStr(intValue Mod 2) & DecToBinary intValue = Int(intValue / 2) Loop DecToBinary = CStr(intValue) & DecToBinary End Function 負の数は考えていませんが、あしからず。 さて、部品が1個できました。この部品を使うにはCallステートメントを使います。使い方はこうです。 Call DecToBinary(170) 本当はCallは省略できて、「DecToBinary 170」という風に書くこともできます。むしろ省略するほうが有名ですよね。 しかし、この部品はFunctionプロシージャーです。Subプロシージャーと違って部品が動いた結果を部品の名前自身が変数となって教えてくれるのです。この例ですと strResult=DecToBinary(170) という風に書きますと、実行されるとstrResultのなかには"10101010"という文字が入ることになります。DecToBinaryという部品はそういう仕事をする専用に今ここに生まれたわけです。 さて、10進数を2進数に変換できただけではまだ目的の動作は完了できませんよね。ですので、もうちょっと大きな目線で見ましょう。 数字を受け取ると、2進数に変換して、その2進数の値にしたがってランプコントロールのValueプロパティーを変更して初めて仕事が完了するわけですので、その動作を行う部品を作りましょう。この部品には「SwitchLamp」とでも名前をつけてみましょう。すると、SwitchLampという部品のソースはこうなります。 Private Sub SwitchLamp(intValue As Integer) Dim I As Integer, strResult As String strResult = DecToBinary(intValue) '(1) '8桁未満の場合は頭に0が足りないので足りない分だけ0を追加する If Len(strResult) < 8 Then strResult = String(8 - Len(strResult), "0") & strResult For I = 1 To 8 'CWBtnのValueプロパティーはTrueかFalseの指定であると '勝手に解釈しています。違う場合はこの部分を修正してください CWBtn(I - 1).Value = (Mid$(Right$(strResult, I), 1) = 1) Next End Sub (1)の部分が先ほど作った10進数から2進数に変換する部品を呼び出しているところです。似たような動作を何度もするところをこのように小さな部品にしてしまうのです。そして、部品にして、部品にした仕事はその部品に代わりに仕事をしてもらうのです。仕事を部下に丸投げする上司みたいですよね。でもそういう捕らえ方で大丈夫です。 小さいところですが、ランプコントロールのValueを変更する部分もFor~Nextでまとめちゃうと、コードが非常にすっきりしてますよね?これがサブルーチン化のメリットの1個です。いろいろな部品を組み合わせて1個の大きな動作をする機械を作り上げるのです。 最後に、これで目的の動作をする機械は完成しました。しかし、1個まだ問題が残っています。機械はできても、この機械はいつ動けばいいのでしょう? その答えが一番頭にあり、かつこの質問の心臓部ですね。コマンドボタンを押したらこの機械を動かしなさい。そうすることによってこの機械は動作を開始して、目的の動作をこの機械が行ってくれるのです。そのためのコードは下のような感じです Private Sub Command1_Click() Call SwitchLamp(Val(txtKazu.Text)) End Sub この1行だけです。とてもシンプルになりましたよね。日常に例えると「機械のスタートボタンをポンと押した」という感じでしょうか。 よって、コマンドボタンがたくさん増えて40個目が押されたとしても Private Sub Command40_Click() Call SwitchLamp(Val(txtKazu.Text)) End Sub 書くのは同じこの1行だけでいいのです。 最後になりましたが、サブルーチン化はコードが見やすくなり、見やすくなることでバグが発生しにくいプログラムを作ることができるようになります。一番初めの2進数に変換する部分でも「(Byval intValue As Integer)」と書きましたよね?これによって変な文字を入力しようとするとこの部品を呼び出そうとした場所でエラーが起こりますので、バグの原因の発見も早くなるといった小さいけれど侮れない大きなメリットもあるのです。 また、余談ですが、サブルーチンを呼び出してそこへ飛ぶということは、呼び出して終わった後、呼び出された元へ飛んで帰らなければいけません。あまり部品を小さく区切りすぎると逆に処理が遅くなるということも起こります。過ぎたるは及ばざるが如し、程々が一番ですね。 以上、長文失礼いたしました。 個人的なことですが、私もVB使いです。昔は私もaries-0323さんと同じようなことで悩み、同じようなコードを記述していました。aries-0323さんが今後より上達できることを応援します。

aries-0323
質問者

お礼

ご回答有難う御座います。 ご丁寧な解説で大変勉強になります! まだまだ完璧には使いこなせませんが、Randomizeさんに教えていただいたコードを元に他の処理の場合にも「小さな部品」として機能出来るように勉強していきたいと思います! 最後に未熟な私ごときに応援をしていただき、恐縮です… ご期待(?)に添えますように、今後も壁に当たっても精進していきます!!

その他の回答 (2)

  • shut0325
  • ベストアンサー率40% (490/1207)
回答No.2

今回書かれているコードもサブルーチンです。 では、新規にボタン2を作ったとして、処理としてはボタン1と同じにしたいときはどうしますか? 同じコードをコピー&ペーストしますか? それも間違いではないですが、「ボタン1をクリックしたときと同じ処理でおねがいします。」が楽ではないですか? 更に発展して、ボタン2の処理はボタン1の処理と1部だけ違うパターンはどうでしょう? ということsubやfunctionを使って状況によって変わる処理が実現できます。

aries-0323
質問者

お礼

ご回答有り難う御座います。 仰られる通り、新規にボタンを作ったとして同じ処理にしたい時自分ならどうするかと考えると今の自分のレベルでは最初に思いつく考えはコピー&ペーストにしてしまいます… 同じ処理に出来れば楽ですね。 処理の仕方は沢山あるんですね。 う~ん、奥深いです!!

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

具体的なコードはともかくとして、 たとえば、このボタンが信号機で、 40個の信号機を出力デバイスを使いながら、同期を取ってコントロールしなくてはいけなくて、、、 歩行者信号延長などの情報などを入力デバイスで取得しなければいけないとしたら、、、 すべての行為をログに書き出さなければいけないとしたら、、、 ・・・・・ と考えていくとサブルーチンはメリットがあります。

aries-0323
質問者

お礼

ご回答有り難う御座います。 なるほど、40個一つ一つにその処理を書くよりもその処理を一つの箇所に決めて用意しておいて、そこへ飛ばして処理を実行させてから元の所へ戻すという感じですね。 サブルーチン、メリットありますね。 わかり易い例え感謝です!

関連するQ&A

  • VBのプログラム

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 20 + 70 tb.Left = (j - 1) * 50 + 60 * (columns * (k - 1)) + 5 tb.Width = 55 Next Next Next End Sub これはボタンを押すと テキストボックスに入力された値分だけテキストボックスが出てくるというものです。 例えば 3 4 4とテキストボックスに値が入力された場合 3行4列が4個分テキストボックスが出てきます。 しかし6 6 6と入力した場合画面に入りきらなくなってしまいます。 大きな値を入力しても画面に入れたいです。 これはスクロールなどしてできるようにしたいです。 どのようなソースでできるのでしょうか。

  • プログラミングVisual Basicの質問です。

    任意の数字を入力し、Len関数とMid関数を使って2進数を10進数に変換するというプログラムを作っているのですが、うまくいきません。 コードは Dim a  As Integer Dim b  As Integer Dim i  As Integer a = Val(TextBox1.Text) For i = Len(a) To 1 Step -1 If Mid(a, Len(a), 1) = "1" Then b += 2 ^ (i - 1) End If Next Label3.Text = b    End Sub 上記のものが作ったコードです。 問題点の指摘をよろしくお願いします。

  • VBのプログラムの質問です。

    VBのプログラムの質問です。 100点満点のテストで10人分の点数を一次元配列で読み込み、各人の偏差値を含めて表示するプログラムを作りなさい。 知恵袋で一度同じような質問をしましたが、似たようなエラーが出てきてしまうために 今一度力をお貸しください、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Integer = CInt(TextBox3.Text)  ←ここ Dim p(n) As Integer 'データの取得と平均計算 Dim s As Double = 0 For i As Integer = 0 To n - 1 p(i) = CInt(TextBox1.Lines(i)) s = s + p(i) Next Dim m As Double = s / n '標準偏差の計算 Dim sx As Double = 0 For i As Integer = 0 To n - 1 sx = sx + (p(i) - m) ^ 2 Next Dim sd As Double = (sx / n) ^ (1 / 2) '偏差値の表示 For i As Integer = 0 To n - 1 Dim dv As Double = 50 + 10 * (p(i) - m) / sd TextBox2.Text = TextBox2.Text & Format(dv, "##.#0") & vbCrLf Next End Sub String "" から型 'Integer' への変換は無効です。 と Dim n As Integer = CInt(TextBox3.Text)からでてしまいます。 詳しい方よろしくお願いします

  • VB6.0 で パート2

    前回ご回答頂きました皆様、有難う御座います。 度々質問させて頂きます。8つのコントロールがコントロール配列されていて、初めは全て消灯している状態から、コマンドボタンを1回クリックすると一番右側の一つが点灯し、またクリックすると右のランプが消えて、左隣のランプが点灯します。 これを繰り返していって、一番左のランプが点灯したら再び一番右のランプが点灯します。以前はここまでの動きをこちらで質問して教えて頂いたのですが、この動きの延長でそこから今度は逆に一番左側のランプが点灯した跡にもう一回、ボタンをクリックしたら右側のランプが順々に点灯していくような事を考えています。 説明が下手なのですが、下の図の様な感じです。 7 6 5 4 3 2 1 0 ←CWBtn(Index)番号 ○○○○○○○●      ↓ ○○○○○○●○      ↓ ○○○○○●○○      ↓ ○○○○●○○○      ↓ ○○○●○○○○      ↓ ○○●○○○○○      ↓ ○●○○○○○○      ↓ ●○○○○○○○      ↓ ○●○○○○○○      ↓ ○○●○○○○○      ↓ ○○○●○○○○      ↓ ○○○○●○○○      ↓ ○○○○○●○○      ↓ ○○○○○○●○      ↓ ○○○○○○○● この繰返しです。 Private Sub cmd1_Click() Dim Index As Integer '右から左へランプコントロールが点灯していく処理 '消灯の処理 CWBtn(Index).Value = False Index = Index + 1 'もしIndexが7より大きければ、Indexを最初の0に戻す If Index > 7 Then Index = 0 End If '点灯の処理 CWBtn(Index).Value = True '左から右へランプコントロールが点灯していく処理 CWBtn(Index).Value = True Index = 0 '消灯の処理 CWBtn(Index).Value = False Index = Index + 1 'もしIndexが7より小さければ、Indexを右の6方向に戻す If CWBtn(7).Value = True Then Index = Index + 1 End If '点灯の処理 CWBtn(Index).Value = True End Sub Private Sub Form_Load() 'フォームを開く直前に行う処理 For Index = 0 To 7 '全て消灯 CWBtn(Index).Value = False Next Index 'Indexに7の初期値を設定 Index = 7 End Sub 以上が教えていただいたコードで自分で書いたのですが… また教えて頂きたいです。宜しくお願い致します。

  • VBプログラム エラーが出ます

    Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tbA" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * k-1))).ToString(), TextBox).Text)    エラー Next tb.Text = sum.ToString() Next Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Do Until Me.Controls.Count <= 6 For Each tbD As Object In Me.Controls If CType(tbD, Control).Name Like "tb*" Then Me.Controls. Remove(tbD) Next Loop End Sub End Class エラーと書いている箇所 どう直したらよいのでしょうか。 縮小変換しないで呼び出されるアクセス可能なitemがないためオーバーロードの解決に失敗しました と出ます。 あとwindowsの画面の大きさを入力される値が小さければ少し小さいwindowsになるように変えたいのですがどうしたよいのでしょう。

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • VB.NETでExcelの数式バーの処理をさせたい

    Excelのセルにいろいろな数式が入っていて、 この数式を書き出したテキストファイルを読み込ませて、 VB.NETで処理をしたいのですが、 VB.NETで、Excelの文字列関数を含んだ式を処理するには どのように記述すればよいでしょうか。 単なる計算式であれば  Dim xlApp As New Excel.Application  Dim str1 As String  Dim x As Integer  a = "3600 / 60 + 5000"  x = xlApp.Evaluate(a) でできるのですが文字列だとうまくいきません。 例えば、ExcelのシートのA1セルを選択して 数式バーに =MID("ABCDE",2,3) と入力すると その結果のBCDがA1セルに得られますが VB.NETで、 =MID("ABCDE",2,3) から BCD を得るにはどのようにすればよいでしょうか。 なお、=MID("ABCDE",2,3) の式は一例であって、 以下のように、この式をVB.NETで記述する 仕方を知りたいのではありません。  Dim str1, str2 As String  str1 = "ABCDE"  str2 = str1.Substring(2, 3) よろしくお願いします。 (VisualStudio2010 , Excel2003 , WindowsXP SP3)

  • 【VB2005】変数の保存

    ゲームプログラムの練習をしておりまして、 たとえば、アイテムAの情報を(アイテムの名前)(アイテムの価格)(アイテムの個数) などを変数を使って、下記のような構造体で持つか悩んでいます。 Private Structure ItemData Dim Name As String Dim kakaku As long Dim kazu As integer End Structure この変数は、アイテムをデータベースのように 指定したアイテムをいつでも価格入力することにより、 そのアイテムが変更かけれるようにしたいと考えてます。 バイナリで読み書きするときは、どうすればよいでしょうか? お知恵を借りたいと思っています。

  • VBのfunctionの引数について

    2の Double型と 3の Single型のように送る側と受け取る側の変数の型が 違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim koku As Integer Dim san As Integer Dim rika As Integer Dim ave As Double------------------------------------1 koku = Val(TextBox1.Text) san = Val(TextBox2.Text) rika = Val(TextBox3.Text) ave = (koku + san + rika) / 3 Label5.Text = Round(ave)-------------------------------2 End Sub Private Function Round(ByVal sngvalue As Single-----3) As Integer Dim intvalue As Integer intvalue = Int(sngvalue + 0.5) Return intvalue End Function End Class

  • ヤマ括弧でくくられたテキストを抽出(入れ子)

    いつもお世話になっています。VBA学習者です(手短に説明するため文章がぶっきらぼうになることをご容赦ください)。 以下のようなテキストがあったとします。 サンプルテキストA: test <sample_1> test <sample_2> test. このテキストから括弧で括られた部分(ここでは「ユニット」と呼びます)を取り出すのは比較的容易です。 しかし、「サンプルテキストB」のように「ユニット」が入れ子になっている場合にも対応する必要があるため以下のコードを書きました。 これでとりあえず、入れ子の一番外殻のユニットを抽出することができました(「結果A」がシートに書き出されます)。 ここから更に、入れ子になっている内側のユニットも取り出したいのですが、これが意外とうまくいきません。 「結果B」のような結果を得るには、どのようにしたらよいでしょうか。 必ずしも、下に示した処理方法にこだわるものではないので、もっと良いアイデアがあれば大歓迎です! ※ここに示したサンプルは1行のみですが、実際には数千行(ユニットがない行も含む)からなるファイルをいくつも連続して処理するので、出来るだけシンプルに高速で処理できるようにしたいと思っています。 サンプルテキストB: Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>. 結果A: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> 結果B: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> <if([control],<if([test],a,b)>,c)> <if([test],a,b)> <if([control],d,e)> <if([control],f,g)> <if([control],h,i)> Sub テスト() Dim i As Long Dim j As Long 'テキストファイル内の行を格納する変数 Dim textLine As String 'テキストの文字数を格納 Dim letterCount As Integer 'ヤマ括弧の数を数えるカウンタ用 Dim bracketCounter1 As Integer Dim bracketCounter2 As Integer '括弧の位置を格納する変数 Dim bracketPosition1 As Integer Dim bracketPosition2 As Integer '「<」から「>」までのテキストを格納 Dim textFromToBracket As String '括弧の見つかった位置を格納する配列 Dim unitArray() As String 'bracketArray1()の要素数のカウンタ Dim inArrayCounter As Integer 'textLineにテスト用テキストを格納 textLine = "Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>." letterCount = Len(textLine) '先頭から「< 」と「>」 をカウントし、の数が一致したところが1ユニット For i = 1 To letterCount 'Midで1文字ずつとりだしつつ「<」を検索 If Mid(textLine, i, 1) = "<" Then bracketCounter1 = bracketCounter1 + 1 '1つ目の「<」の位置を格納 If bracketCounter1 = 1 Then bracketPosition1 = i End If End If 'Midで1文字ずつとりだしつつ「>」を検索 If Mid(textLine, i, 1) = ">" Then bracketCounter2 = bracketCounter2 + 1 End If 'ヤマ括弧の数が0以外で、括弧始め/閉じの数が一致したら If bracketCounter1 + bracketCounter2 > 0 And bracketCounter1 = bracketCounter2 Then 'その時点の「>」の位置を格納 bracketPosition2 = i 'bracketPosition1からbracketPosition2までのテキストを切り出し textFromToBracket = Mid(textLine, bracketPosition1, bracketPosition2 - bracketPosition1 + 1) '配列の要素数を1つずつ増やしながらユニットを格納 inArrayCounter = inArrayCounter + 1 ReDim Preserve unitArray(inArrayCounter) unitArray(inArrayCounter) = textFromToBracket 'bracketCounter1とbracketCounter2を初期化 bracketCounter1 = 0 bracketCounter2 = 0 End If Next '以下配列に格納したユニットを書き込み For j = 1 To UBound(unitArray) Cells(j, 1).Value = unitArray(j) Next j End Sub

専門家に質問してみよう