質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1721閲覧

vba 配列の各要素を別配列に挿入>特定文字を取り出しシートに記入 をループさせたい

Mai0429

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/02/05 14:43

vbaで、配列の各要素GroupNum(n)に対し、特定の文字を取り出し、シートに表示したいですが、以下のコードでは
NGroup(n)について、「SubまたはFunctionがありません」とエラーが出てしまいます。
エラーを解消するか、もしくは下記の最終目的を達成する他の方法はありますか?
(またコトを複雑にしているかもしれないので簡単な方法があればご教示ください。)

以前の質問にいただいた回答を利用して途中まで作成してみたのですが、
その後最終目的を達成するまでどうすれば良いか、わかりません。
色々試したもののうまくいかず、かなり時間がかかってしまったため、質問させてください。

A1セルの内容:
①あいう/Aかきく
②さしすせ/Aかきく、けこ
③なにぬね/Aかきく、たちつてと、はひふへ
④たち/Aかきく、あかさたな
⑤はひふへほ/Aかきく、さしすせそ
⑥やゆよ/Aなにぬ
⑦わを/Aあかさたなはまやらわ

↑それぞれの行で改行してあります。

<最終的目的>
上記A1セルの内容を、分割し、それぞれ別の変数?配列?に入れ、下記のようにシートに出力したいです。
①あいう/(A)かきく 部分

B1:あいう
B2:かきく
②さしすせ/(A)かきく、けこ 部分

B3:さしすせ
B4:かきく
B5:けこ
...
③〜⑦も同様
また、A1以外の他のセル(A2,A3...)には⑦までない場合もありますが、適宜可変となるようにしたいです。

Sub Macro1() Dim Origin As String = ThisWorksheet.Range("A1").Value If InStr(Origin,"⑦")> 0 Then GroupNum = 7 ElseIf InStr(Origin, "⑥")>0 Then GroupNum = 6 ElseIf InStr(Origin, "⑤")>0 Then GroupNum = 5 ElseIf InStr(Origin, "④")>0 Then GroupNum = 4 ElseIf InStr(Origin, "③")>0 Then GroupNum = 3 ElseIf InStr(Origin, "②")>0 Then GroupNum = 2 ElseIf InStr(Origin, "①")>0 Then GroupNum = 1 Else GroupNum = 0 End If Dim i As Long, j As Long, n As Long Dim NGroups() As String ReDim NGroups(1 To GroupNum) i = 1 j = InStr(i, Origin, vbLf) Do Until j = 0 n = n + 1 NGroups(n) = Mid(Origin, i, j - i) i = j + 1 j = InStr(i, Origin, vbLf) Loop ReDim Preserve NGroups(1 To n) 'セルA1中、最後の行である⑦はNGroupsに入っていないので追加。 NGroups(GroupNum) =Mid(Origin, (InStrRev(Origin, vbLf) + 1)) '以上でNGroups(n)にA1セル内各行を分割し挿入済 '以下では各要素に対し、特定の文字を抜き出したい Dim First() As String, Second() As String For n = 1 To GroupNum First = Mid(NGroups(n), 2, InStr(NGroups(n), "/A") -2) Second = Mid(NGroups(n), (InStr(NGroups(n), "/A")+ 2)) Dim w() As String w = Split(Second, "、") Dim q As Integer For q = 0 To UBound(w) '↓以下だと表示順序がA1セルと異なってしまうので何か良い方法はないか? ThisWorksheet.Range("A" & n + 1).Value = First(n) ThisWorksheet.Range("A" & n + GroupNum + q + 1).Value = WorksheetFunction.Transpose(w(q)) Next End Sub

<現状>
上記のコードを実行した結果、エラーが出る部分のコードを除き実行すると、
GroupNum(1) = ①あいう/(A)かきく
GroupNum(2) = ②さしすせ/(A)かきく
...
GroupNum(7) = ⑦わを/(A)あかさたなはまやらわ
が入っている形です。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

呈示のコードは、最初の1行目からコンパイルエラーですので、
一から自分なりにコーディングしました。

vba

1Sub Macro1() 2 Dim Origin As String: Origin = ActiveSheet.Range("A1").Value 3 Dim c As Range: Set c = ActiveSheet.Range("B1") '入力開始セル 4 5 Dim Group 6 For Each Group In Split(Origin, vbLf) 7 Dim Items: Items = Split(Mid(Group, 2), "/A") 8 c.Value = Items(0): Set c = c.Offset(1) 9 Dim w: w = Split(Items(1), "、") 10 Dim l As Long: l = UBound(w) + 1 11 c.Resize(l).Value = WorksheetFunction.Transpose(w) 12 Set c = c.Offset(l) 13 Next 14End Sub

投稿2020/02/05 16:10

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mai0429

2020/02/06 03:55

夜遅くにも関わらず、どうもありがとうございました! こんなに簡潔に書けるとは、驚きました!! ちなみに、これを使って、A1セル内の要素の個数分(=(UBound(Items) + UBound(w)個分)、行を挿入してから、その挿入した行にこれらの要素を表示するようアレンジしようとしたのですが、3時間かかってもまだうまくできていません。 これとは別に質問する予定なので、もしよろしければご回答よろしくお願いいたします。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問