Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows XP全般 : Excel 2003)
リスト内のに行の自動追加
投稿日時: 19/01/13 00:56:26
投稿者: チワワのゾロ

夜分に失礼します。
A     B     C     D
a りんご   \100 青森
a みかん   \ 80 愛媛
a メロン   \800 愛知
b りんご   \120 青森
b さくらんぼ \100 山形
b メロン   \900 愛知
c りんご   \120 青森
c さくらんぼ \100 山形
c みかん   \ 90 愛媛
 
A列の項目が切り替わる行に空白の列を挿入するマクロを作りたいです。
結果は下記のようにしたいです。
 
A     B     C     D
a りんご   \100 青森
a みかん   \ 80 愛媛
a メロン   \800 愛知
 
b りんご   \120 青森
b さくらんぼ \100 山形
b メロン   \900 愛知
 
c りんご   \120 青森
c さくらんぼ \100 山形
c みかん   \ 90 愛媛
 
お知恵をお貸しください。
宜しくお願い致します。

回答
投稿日時: 19/01/13 08:08:26
投稿者: simple

行挿入は結構負荷のかかる処理です。
色々な手法があると思いますし、データの量に依存する話だと思います。
 
(1)一番基本的なのは、最終行から上に向かって判定して、行挿入を下から順に実行する方法です。
(2)大量のデータの場合は、グループ毎にコピーペイスト(一行空けながら)する方法が
   有効かもしれません。
 
とりあえず、(1)にトライしてみてはいかがですか?
なぜ下から実行すると良いかですが、
行挿入の結果、行がずれることになりますが、
下から判定していけば、その影響を免れることができるからですね。
 
繰り返しは書けるでしょうし、
行挿入のコードは、サンプルでマクロ実行すれば参考となるものが得られます。
その方針でトライしてみてもらえますか?

回答
投稿日時: 19/01/13 11:39:54
投稿者: WinArrow
投稿者のウェブサイトに移動

マクロでなくても、一般機能の操作でも簡単にできます。
 挿入した「空白行」にどのようなデータを入力する目的にもよりますが、
とりあえず、↓の手順を実施することをお勧めします。
マクロでループ処理するより、断然、早いです。
 前提として、1行目には、項目行を用意します。
   
  (1)表の1行目に項目行を作成します。
  既に項目行が存在するならば、次へ
(2)カーソルを項目行に置き、データタブの「集計」をクリック
(3)表示されるダイアログで
@グループの基準:A列の項目名を選択する
A集計の方法:データの個数
B集計するフィールド:B列の項目名にチェックを入れる
C現在の集計表と置き換えるにチェック
D集計行をデータの下に挿入するにチェック
E「OK」をクリック
   
これで、空白行にしたければ、「置換」で「*データの個数」を空白に置き換えれば
A列だけは空白になります。
  
もし、金額の合計をとる目的ならば、
Aを「合計」
BをC列の項目名にすれば、よいです。

回答
投稿日時: 19/01/13 15:16:59
投稿者: WinArrow
投稿者のウェブサイトに移動

↑の追記
 
「集計」コマンドで挿入された行:「集計行」=*データの個数と表示されている行
のA列セルを空白にする方法は、↑で紹介しましたが、
B列セルをクリアする方法を紹介します。
 
B列を選択し、「検索」で「=SUBTOTAL(3」をキーとして
数式を検索対象として検索します。
「すべて検索」ボタンをクリックします
下の対象リストで、
[Ctrl]+[C] ですべてを選択します。
この画面を閉じてから、[Delete]キーを押して、で数式セルをクリアします。
 
最終行の「総合計」行は単純に削除すればよいです。

回答
投稿日時: 19/01/14 08:21:48
投稿者: miyakodai

VBAでのやり方を知りたいのなら
行数が多ければ時間はかかりますが
下記のようなマクロではいかがでしょうか?
 
Sub Sample1()
    Dim myLastRow As Long
    Dim i As Long
    Application.ScreenUpdating = False
 
    'データの最終行を取得
    myLastRow = Cells(Rows.Count, 1).End(xlUp).Row
     
    '最終行から上方向にループ
    For i = myLastRow To 2 Step -1
        If Cells(i, 1) <> Cells(i - 1, 1) Then
            Rows(i).Insert
        End If
    Next i
 
    Application.ScreenUpdating = True
End Sub
 
(参考情報)
https://www.moug.net/tech/exvba/0050076.html
セル/行/列を挿入する(Insertメソッド)|Excel VBA

回答
投稿日時: 19/01/14 10:21:49
投稿者: WinArrow
投稿者のウェブサイトに移動

質問は、
A列セルの「値」ブレークで空白行挿入
という内容ですが、
データ行の件数など状況によって、対応方法が変わってきます。
 
また、空白行を挿入する目的まで示すと
更に対応方法が変わってきます。
 
単に、その場しのぎ的な質問ではなく、
その背景、状況、目的などを明確にすることが、
質問者にとって、有意義な結果をもたらすばかりではなく、
この板を閲覧している人にも、こんな考え方があるんだ
など・・・参考になることがあるはずです。
 
今後、質問する際の参考にしていただければと思います。

投稿日時: 19/01/15 21:38:06
投稿者: チワワのゾロ

皆さん、お礼が遅くなり申し訳有りません。
不慣れとは言え説明が解りにくくなりすみませんでした。
VBAばかりを考えエクセルの基本機能で対応できるとは思いませんでした。
これからもっと勉強してスキルを磨いて行こうと思います。
また何かありましたら宜しくお願い致します。