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

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

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

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

Q&A

解決済

1回答

1388閲覧

vba 配列の各要素を逆の順番で入れる方法

Mai0429

総合スコア15

VBA

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

0グッド

0クリップ

投稿2020/02/06 04:15

A1セル内の要素の個数分(=(UBound(Items) + UBound(w)個分)、行を挿入してから、その挿入した行にこれらの配列の要素を表示するようアレンジしたいです。
以前いただいた質問回答に3時間かけて自分で2行足して、
以下のコードを作りましたが、シートに現れる結果はGroup(n)の順番が逆に出てきます。そのため、Group(n)内の要素の順番を逆からに入れ替えた配列を用意し以下をすれば良いと思ったのですが、どうすれば良いでしょうか?
もしくは他に良い方法はありますか?

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

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

vba

1 2Sub Macro1() 3 Dim Origin As String: Origin = ActiveSheet.Range("A1").Value 4 Dim c As Range: Set c = ActiveSheet.Range("B1") '入力開始セル 5Range("B1").Activate '今回は無いですが、今後このActiveCell部分に変数を入れてループさせる予定なので省かずにご回答お願いします。 6 Dim Group 7 For Each Group In Split(Origin, vbLf) 8 Dim Items: Items = Split(Mid(Group, 2), "/A") 9 10 Dim w: w = Split(Items(1), "、") 11   c.Value = Items(0): Set c = c.Offset(1) 12  Range("B" & ActiveCell.Row +UBound(Items) + UBound(w))).Offset(1,0).EntireRow.Insert 13 Set c = Range("B1") 14 Dim l As Long: l = UBound(w) + 1 15 c.Resize(l).Value = WorksheetFunction.Transpose(w) 16 Set c = c.Offset(l) 17 Next 18End Sub 19

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそもActiveCellを対象に処理をするという発想から変えましょう。
非アクティブでも処理は可能です。対象セルを変数に入れて処理をするという発想で行きましょう。

また、現状のコードはたぶんピント外れです。配列が逆順になっているということはないです。行をそゅう入してますが、それがおかしいので順番もおかしくなっているのです。きれいな逆順になっているわけではないので、逆にいれていけば解決するという問題ではないです。

具体的にどのようなデータがあって、どのような結果が欲しいのかまずは、言葉とデータ例で説明してください。

やりたいことは、
例えば、下記のようなことでしょうか。

A列に改行されたデータが入っている。

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

A2セルのデータ
①あいう/Aかきく
②さしすせ/Aかきく、けこ
③なにぬね/Aかきく、たちつてと、はひふへ

それを「/A」「、」を区切り文字として分割してB列に出力する。
出力する場合は、分割したデータ個数分行を挿入してから出力する。
出力結果は下記のような感じ

AB
A1のデータあいう
かきく
さしすせ
かきく
けこ
なにぬね
かきく
たちつてと
はひふへ
たち
かきく
あかさたな
はひふへほ
かきく
さしすせそ
やゆよ
なにぬ
わを
あかさたなはまやらわ
A2のデータあいう
かきく
さしすせ
かきく
けこ
なにぬね
かきく
たちつてと
はひふへ

上記の推測であってますか。
違っているなら、上記のような感じで、仕様が明確に分かるように説明してください。

サンプルコード追記

上記の仕様だとして、サンプルコードを作成してみました。
前回の回答からロジックも大幅に見直しました。

vba

1Sub Macro1() 2 3 DataSplitInsert ActiveSheet.Range("A1") 4 5End Sub 6 7Function DataSplitInsert(DataCell As Range) As Range 8 Dim Origin As String: Origin = DataCell.Value 9 10 Dim Lines: Lines = Split(Origin, vbLf) 11 Dim i As Long 12 For i = 0 To UBound(Lines) 13 Lines(i) = Mid(Lines(i), 2) '行頭の丸数字を削除 14 Next 15 Origin = Join(Lines, "、") 16 Origin = Replace(Origin, "/A", "、") 17 18 Dim Items: Items = Split(Origin, "、") 19 Dim l As Long: l = UBound(Items) 20 21 Dim c As Range: Set c = DataCell.Offset(, 1) '出力先: DataCellの右の列 22 c.Offset(1).Resize(l - 1).EntireRow.Insert '追加件数分行挿入 23 c.Resize(l).Value = WorksheetFunction.Transpose(Items) 24 Set DataSplitInsert = c.Offset(l) 25End Function

A列の複数のデータを処理するために、処理をFunctionにしました。これをループで呼び出せば、複数データ処理にできます。

投稿2020/02/06 08:45

編集2020/02/07 01:36
hatena19

総合スコア33620

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

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

Mai0429

2020/02/07 06:51

ありがとうございます!! やりたかったことはこれです!!! ただ、実際に出力したいシートは 他のエクセルブックのSheet1のL10から順に、なのです。(順番はおっしゃっていただいたものであっています。) こちらで解読して変更しようと試みましたが、私にはまだ分からないところだらけでとても時間が足りません。 あわよくば教えていただけませんでしょうか? 疑問点はたくさんあるのですが、まず一つ伺いたいのが、Sub Macro1()の中で、ファンクションを呼び出した後に書いてあるセルが読み込む対象となるのは何故でしょうか? (どこで指定しているのでしょうか?)
hatena19

2020/02/07 08:12

> 他のエクセルブックのSheet1のL10から順に、なのです。(順番はおっしゃっていただいたものであっています。) 出力先が他のブックのシートなら行を挿入する処理は不要になります。提示のコードよりずっとシンプルにできます。 もし、疑問点があるなら、その前にどのような仕様なのかを明確にしてもらわないと、提示したコードが無意味になります。仕様が不明確なままで、このまま続けても無意味なので、新規に質問を立てて、やりたいことの仕様を明確にしたうえで、現状をコードでどこがどううまくいかないか、を質問してください。 出力先のシートが別のシートならそれもちゃんと明示してくださいね。
Mai0429

2020/02/10 11:18

はい、明示しておらず申し訳ございませんでした。 まだ完全には理解できていないかもしれないですが、別のブックの名前をBookBとすると、 Dim l As Long: l = UBound(Items) 以下を↓のように書き換えて別シートに出力することができました。大変助かりました。ありがとうございました。 BookB.WorksheetB.Range("L10").Resize(n+1).EntireRow.Insert BookB.WorksheetB.Range("L10").Resize(n+1).Value = WorksheetFunction.Transpose(Items)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問