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

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

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

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

Q&A

2回答

1044閲覧

配列上の切り取り(Cut)・挿入(Insert)の行う方法について

doggyman10

総合スコア5

VBA

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

0グッド

0クリップ

投稿2021/09/08 16:08

編集2021/09/10 15:39

●冒頭
オブジェクト上での処理方法であれば、正常動作できていることは確認済

●課題点
オブジェクト上での処理となるためデータ量が多ければ多いほど処理時間が要している

●対策点
オブジェクトでの処理でなく、配列を用いて処理時間を短縮することを目標
指定範囲を配列格納 ➡ 配列上で処理 ➡ 指定範囲へ配列の出力
といった方法で処理を模索中

上記の対策点にある配列上での処理において、オブジェクト上での処理で言う切り取り(Cut)と挿入(Insert)のやり方が分からず詰まっております。

そもそも配列上での切り取り(Cut)と挿入(Insert)の概念があるのか知識不足のため、
自分なりにネット上で検索してみたのですがこれといったページが見つからず解決に至っておりません。

また配列上での処理以外にも他に最善のやり方がございましたら、
アドバイス頂けると幸いです。

また下記にて自分なりに作成したコードとイメージ図を記載いたしますので、
よろしくお願いいたします。

VBA

1Sub sample1() 2'--------------------------------------------------------------- 3Dim wb As Workbook 4Set wb = ThisWorkbook 5 6Dim ws As Worksheet 7Set ws = wb.Sheets("メイン") 8'--------------------------------------------------------------- 9 10With ws 11 12 Dim i, j, x 13 For i = .Cells(Rows.Count, "A").End(xlUp).Row To 3 Step -1 14 15 If .Cells(i, "D") = "●" Then 16 17 x = Cells(i, "C").Value 18 .Range(i & ":" & i).Cut 19 20 For j = Cells(Rows.Count, "A").End(xlUp).Row To 3 Step -1 21 22 If .Cells(j, "C").Value Like x Then 23 Rows(j + 1).Insert 24 Exit For 25 End If 26 Next j 27 End If 28 Next i 29 30End With 31End Sub

VBA

1Sub sample2() 2'--------------------------------------------------------------- 3Dim wb As Workbook 4Set wb = ThisWorkbook 5 6Dim ws As Worksheet 7Set ws = wb.Sheets("メイン") 8'--------------------------------------------------------------- 9 10With ws 11 12 Dim lRow 13 lRow = .Cells(Rows.Count, "A").End(xlUp).Row'最終行取得 14 15 Dim TB 16 TB = .Range("A3:D" & lRow)'配列格納 17 18 Dim i, j, x 19 For i = UBound(TB, 1) To 3 Step -1 20 21 If TB(i, 4) = "●" Then'●の有無判別 22 23 x = TB(i, 3) 24 TB(i).Cut 25 26 For j = UBound(TB, 1) To 3 Step -1 27 28 If TB(j, 3) Like x Then 29 TB(j+1).Insert 30 Exit For 31 End If 32 Next j 33 End If 34 Next i 35 36 .Range("A3:D" & lRow) = TB 37 38End Sub

イメージ説明
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

Excelのソート機能で、PHASE・備考・No. の順で並び替えるのでは駄目ですか?

投稿2021/09/09 02:54

jinoji

総合スコア4585

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

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

doggyman10

2021/09/10 15:40 編集

質問内容は分かりやすく・回答頂くためにシンプル化させたものを記載しているのですが、 実際は他にもいくつかの列項目があり、イメージ図1(処理前)の過程までにSortを利用して自分で設定した並び順に直しています。列項目が増えた場合でも同様のようにうまくいきますでしょうか? 個人的に何度かか試してみたのですが意図した並び順になりませんでした。 ※再度画像記載致しましたので、是非ご確認頂けると助かります。 現状私が振り絞ったアイデアの場合・・・ ①備考欄に"●"が入力されていたらその行ごと切り取り・PHASEを変数格納 ②変数をPHASEの列を下から検索ループして一致したらその下の行に挿入 といった流れを思いついたのですが、Cut・Insertを繰り返しとなると処理時間が掛かってしまうため解消策を探している最中となります。
jinoji

2021/09/10 23:22

PHASE、備考、GROUP1,GROUP2,RANKの順になればいいのでしょうか。
guest

0

VBAの場合、配列の指定した要素を削除したり、挿入したりする直接的な命令はありません。
今回の場合、一旦別の配列にデータを退避するしかないかと。

配列の扱いについては以下、ご参考まで。
https://dailyrecords.blog/archives/13862

投稿2021/09/09 02:11

hex309

総合スコア761

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

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

doggyman10

2021/09/10 15:37 編集

なんでもかんでもオブジェクト上で出来ることが 全て配列上でもどうようの命令ができるというわけでないということですね。 また頂いた参照URL当初自分で検索した際も(VBA 配列 Insert で検索したら出た記憶が) 同様のサイトを見つけまして、参考になりそうでならないかな・・・とスルーしておりました。 改めて頂いたURLを踏まえて確認させていただきます。 ご丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問