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

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

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

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

配列

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

Q&A

3回答

2924閲覧

VBAの配列でExcel列の入れ替えは可能か?

VBA-nyanko

総合スコア0

VBA

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

配列

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

0グッド

0クリップ

投稿2022/06/21 09:51

[やりたいこと]

ExcelでA~ED列(仮)という多くの列を扱います。
その中で、例えばA列、G列、AG列、BH列をコピーし、
他のシートに貼り付けて、そこから更に指定された並び順に変える必要があるとします。


コピーした列(仮)

AGAGBH

指定された順に並び替え(仮)

AGBHGA

現在のコード

1:列をコピーし、別シートに貼り付け
この時点でA,G,AG,BHの順番に貼り付けられている
つまり、A列は別シートのA列に、G列は別シートのB列に、AG列は別シートのC列に、BH列は別シートのD列に貼り付けられている

.Worksheets("Sheet1").Range("A:A,G:G,AG:AG,BH:BH").Copy .Worksheets("Sheet2").Columns("A:A").PasteSpecial _ Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

2:並び替え

Dim strRetsu1 Dim strRetsu2 Dim strRetsu3 Dim strRetsu4 '貼り付けた列を変数にセット strRetsu1= Columns(1) 'A列にA列が貼り付けられている strRetsu2= Columns(2) 'B列にG列が貼り付けられている strRetsu3= Columns(3) 'C列にAG列が貼り付けられている strRetsu4= Columns(4) 'D列にBH列が貼り付けられている '列の配置換え Columns(1) = strRetsu3 'AG列 Columns(2) = strRetsu4 'BH列 Columns(3) = strRetsu2 'G列 Columns(4) = strRetsu1 'A列

こういう風に書いていますが、今後コピーしたい列が増えた時にコードが冗長になって困るのではと思っています。

聞きたいこと

上記の流れは配列ですっきりできるのでしょうか?
もし配列で可能なのであれば、その書き方を教えてほしいです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

今後コピーしたい列が増えた時にコードが冗長になって困るのではと思っています。

ということなので、汎用関数にしてみました。

標準モジュール

vba

1'引数 2'rng: 並べ替えるセル範囲 3'OrderNum: 列番号を並べ替える順に指定 4'使用例: Call SortColumns(Range("A1:D10"), 3, 4, 2, 1) 5Public Sub SortColumns(rng As Range, ParamArray OrderNum() As Variant) 6 If UBound(OrderNum) + 1 <> rng.Columns.Count Then 7 MsgBox "セル範囲の列数とOrderNum引数の数は合ってません。" 8 Exit Sub 9 End If 10 11 Dim ary(): ary = rng.Value 'セル範囲を配列に格納 12 Dim i As Long 13 For i = 0 To UBound(OrderNum) 14 rng.Columns(i + 1).Value = WorksheetFunction.Index(ary, 0, OrderNum(i)) 15 Next 16End Sub

使用例

vba

1Sub test() 2 Call SortColumns(Cells(1, 1).CurrentRegion, 3, 4, 2, 1) 3End Sub

もし、セル範囲が増えて5列になったとしても、引数の数を増やせばいいだけです。

vba

1Sub test() 2 Call SortColumns(Cells(1, 1).CurrentRegion, 3, 4, 2, 5, 1) 3End Sub

投稿2022/06/21 14:00

hatena19

総合スコア33808

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

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

0

配列といっていいかどうかわかりませんが。

Sub Sample() ColCopy Worksheets(1), Worksheets(2), "AG", "BH", "G", "A" End Sub Sub ColCopy(moto As Worksheet, saki As Worksheet, ParamArray cols()) Dim i For i = 0 To UBound(cols) moto.Columns(cols(i)).Copy saki.Columns(i + 1) Next End Sub

列指定は数字でもいけます。

Sub Sample2() ColCopy ActiveSheet, Worksheets.Add, 3, 2, 1 End Sub

投稿2022/06/21 12:49

編集2022/06/21 13:00
jinoji

総合スコア4585

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

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

0

VBA

1 Sub test() 2 ' 現在の列格納用 3 Dim colArray(3) As Variant 4 5 Dim colNum As Integer 6 colNum = 1 7 8 Dim i As Integer 9 For i = LBound(colArray) To UBound(colArray) 10 colArray(i) = Columns(colNum) 11 colNum = colNum + 1 12 Next 13 14 ' 並び替える順番を記述 15 Dim colSortNums As Variant 16 colSortNums = Array("2", "3", "1", "0") 17 18 ' 並び替え 19 For i = 1 To 4 20 Columns(i) = colArray(colSortNums(i - 1)) 21 Next 22 23 End Sub

もっと良い方法があるかもしれませんが、配列で行うならこんな感じではないかと思います。

実施前実施後
イメージ説明イメージ説明

投稿2022/06/21 10:55

編集2022/06/21 10:57
k.a_teratail

総合スコア845

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問