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

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

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

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

ループ

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

Q&A

2回答

250閲覧

vba 1次元配列をループさせ2次元配列に挿入できるか?

Mai0429

総合スコア15

VBA

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

ループ

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

0グッド

0クリップ

投稿2020/02/10 11:30

度々似たような質問をし恐縮です。
過去にいただいた回答を元に少しずつ進んでおります。

【本題】
BookAのSheetAには、以下の2つのパターンで記載された文字列がAO列に並んでいます。
①/Aを使っている場合
②/Bと/Cを使っている場合
※1つのセル内では区切る文字は①か②のどちらかに統一されています。

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

※各行は改行で区切ってあります。

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

AO1セルに対して最後に欲しい2次元配列
|1,1|1,2|1,3|...
|1,1|:あいう|:かきく|
|2,1|:さしすせ|:かきく|:けこ|
|3,1|:なにぬね|:かきく|:たちつてと|:はひふへ|
|4,1|:たち|:かきく|:あかさたな|
|5,1|:はひふへほ|:かきく|:さしすせそ|
|6,1|:やゆよ|:なにぬ
|7,1|:わを|:あかさたなはまやらわ

BookBのSheetBのL列には、これらをバラして縦に並べた文字列が既に入っています。
(以前質問させていただいたパートです。
https://teratail.com/questions/239754)

ここで、BookBのSheetBのK列には、各行、もとの文字列(SheetAのAO1)の中で最初に入っていた文字列か、/A以降に入っていた文字列か、を判断してシートに記載しなければなりません。

SheetAのAO2セルに対しては、同様に、/B以前に入っていた文字列か、/Bの部分に入っていた文字列か、/Cの部分に入っていた文字列か、をBookBのSheetBのK列に記載しなければなりません。
最も効率的かはわかりませんが、2次元配列を作って取り出す作業を繰り返せば良いのかなと考えて題名のような質問をしました。

A2セルに対して第1段回目
配列変数Kari:
|1,1|1,2|1,3|...
|1,1|:あいう|:/Bかきく/Cけこさし|
|2,1|:さしすせ|:/Bかきく、けこ/Cなにぬねの、あかさ、はまや|
|3,1|:なにぬね|:/Bかきく、たちつてと、はひふへ/Cあ|
|4,1|:たち|:/Bかきく、あかさたな/Cあい、うえ|
|5,1|:はひふへほ|:/Bかきく、さしすせそ/Cー|
|6,1|:やゆよ|:B/なにぬ/Cー

→(?,1)に入っている文字列を別の配列変数Firstに入れて、配列の番号を指定することで順番に取り出せるようにする

→(?,2)に入っている文字列を別の配列変数Afterwardsに入れて、以下の2段回目を実施する。
配列変数Afterwards:
|1,1|1,2|1,3|...
|1,1|:/Bかきく/Cけこさし|
|2,1|:さしすせ|:/Bかきく、けこ/Cなにぬねの、あかさ、はまや|
|3,1|:なにぬね|:/Bかきく、たちつてと、はひふへ/Cあ|
|4,1|:たち|:/Bかきく、あかさたな/Cあい、うえ|
|5,1|:はひふへほ|:/Bかきく、さしすせそ/Cー|
|6,1|:やゆよ|:B/なにぬ/Cー

→変数配列Bは
|1,1|1,2|1,3|...
|1,1|:/Bかきく|
|2,1|:/Bかきく、けこ|
|3,1|:/Bかきく、たちつてと、はひふへ|
|4,1|:/Bかきく、あかさたな|
|5,1|:/Bかきく、さしすせそ|
|6,1|:B/なにぬ|

→配列変数Cは
|1,1|1,2|1,3|...
|1,1|:/Cけこさし|
|2,1|:/Cなにぬねの、あかさ、はまや|
|3,1|:/Cあ|
|4,1|:/Cあい、うえ|
|5,1|:/Cー|
|6,1|:/Cー|

L列の当該行の文字列が、配列変数First、配列変数B、配列変数Cのどれに入っているか判別させ、その結果をそれぞれ文字列("First"もしくは"B"もしくは"C")としてK列に表示するにはどうすれば良いでしょうか。
split関数が1次配列のみ対応ということで、実際どうループを組めばいいか良いかよくわかりません。
どうぞよろしくお願いします。

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

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

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

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

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

Mai0429

2020/02/13 03:57

お二方とも、早速ご回答いただきまして、どうもありがとうございます。 ご提案いただいた方法で試しています。 ベストアンサーの決定にはもう少しだけお時間を下さい。
guest

回答2

0

L列の当該行の文字列が、配列変数First、配列変数B、配列変数Cのどれに入っているか判別させ、その結果をそれぞれ文字列("First"もしくは"B"もしくは"C")としてK列に表示するにはどうすれば良いでしょうか。

急にL列とか出てきますが、どのブックのどのシートの話でしょうか?

1段階づつ解決されようとしているとは思いますが、
方向が解決に向かう方向なのか定かではないので、
1回、まずは、単に文字列を提示するのではなく、
なぜ、単一セルにあるデータを分割して展開したいのかと、
最終的な欲しい結果を提示してください。

あと、配列が頭の中でイメージし辛ければ、
エクセルのシートは2次元配列を可視化したもの(行、または列は1次配列)と、
考えればいいので、一旦新規ブック(ブックは3次配列と考えてもよいかも)に転記し、
少しづつ段階を次のシート次のシートと展開してもよいかも知れません。

あと、

1次元配列をループさせ2次元配列に挿入できるか?

ぱっと見、提示のデータは2次元配列ではなく、ジャグ配列というものに見えます。
そちらも少し勉強されれば、Split関数でも上手く展開できるのではないでしょうか?

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

が新規ブックのSheet1のA1セルがあるとして、
以下のコードを試してみてみるといいかもです。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim v As Variant 5 Dim vv() As Variant 6 Dim i As Long, j As Long 7 8 v = Range("A1").Value 9 If InStr(1, v, "/A") > 0 Then 10 v = Replace(v, "、", "/A") 11 End If 12 v = Split(v, vbLf) 13 ReDim vv(UBound(v)) 14 For i = LBound(v) To UBound(v) 15 vv(i) = Split(v(i), "/") 16 Next 17 18 For i = LBound(vv) To UBound(vv) 19 For j = LBound(vv(i)) To UBound(vv(i)) 20 Range("C2").Cells(i + 1, j + 1).Value = vv(i)(j) 21 Next 22 Next 23End Sub

投稿2020/02/11 00:24

mattuwan

総合スコア2163

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

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

0

Mai0429さんのコード引用して
Sheet1、A1のでーたーをSheet2のL,M列に転記

Sub Macro1() DataSplitInsert ActiveSheet.Range("A1") End Sub Function DataSplitInsert(DataCell As Range) As Range Dim Wb As Workbook Dim Sh As Worksheet Set Sh = ThisWorkbook.Sheets("Sheet2") Dim Origin As String: Origin = DataCell.Value Dim Lines Dim i As Long Dim Select_Row As Long: Select_Row = 1 Dim c As Range Set c = Sh.Range("L1") Dim Str_Cnt As Long Lines = Split(Origin, vbLf) Str_Cnt = 1 For i = 0 To UBound(Lines) Lines(i) = Mid(Lines(i), 2) '行頭の丸数字を削除 Lines(i) = Replace(Lines(i), "/", "、") Dim Items: Items = Split(Lines(i), "、") '、でスプリット Dim l As Long: l = UBound(Items) '1行のアイテム数 For l = 0 To UBound(Items) If l = 0 Then c.Offset(Str_Cnt, 0).Value = "First" c.Offset(Str_Cnt, 1).Value = Items(l) Else Flg = Mid(Items(l), 1, 1) If Flg = "A" Or Flg = "B" Or Flg = "C" Then c.Offset(Str_Cnt, 0).Value = Mid(Items(l), 1, 1) c.Offset(Str_Cnt, 1).Value = Mid(Items(l), 2) Else c.Offset(Str_Cnt, 0).Value = "、" '、の時は何を入れる c.Offset(Str_Cnt, 1).Value = Items(l) End If End If Str_Cnt = Str_Cnt + 1 Next Next End Function

投稿2020/02/10 15:09

sinzou

総合スコア392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問