エクセル(VBA)に関して質問です。

並び替えの処理を行い、データの埋め込み作業を自動で行うプログラムを作成したいと考えております。
時間がある方でプログラムを組める方おりましたらよろしくお願いいたします。
プログラムを行うデータですが、以下のような状況です。

http://oskuni7.sakura.ne.jp/hatena/question3/hatena3_1.htm 

ピンクとオレンジの行の全てを並び替えをします。
並び替えの条件ですが、第一条件を 商品番号、第二条件を 1か0か?にし、昇順で共に並び替えをします。

並び替えをすると下記のような状態になります。

http://oskuni7.sakura.ne.jp/hatena/question3/hatena3_2.htm

商品番号が共にある場合、0(オレンジ)の列Aから列AEに入っているデータを、1(ピンク)の列Aから列AEへ移動させます。
移動させた後、0(オレンジ)のデータを行ごと削除します。

処理後、下記のようになります。

http://oskuni7.sakura.ne.jp/hatena/question3/hatena3_3.htm

最後に今回埋め込まれたデータ行の列AHに”再出品”という判定を出力して終わりです。

上記のようなプログラムを組める方おりましたらよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/12/19 09:45:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント300pt

EXCEL のソートの仕様により、並べ替え順は提示されたサンプルと異なりますが、

内容に関しては同等の結果になると思います。


不明な点がありましたら、コメントください。

Option Explicit
Sub Aiomac()
    Const DATA_START_LINE = 2

    Dim i As Long
'--- Step 1 ソート
    Columns("A:AG").Sort _
        Key1:=Range("AG1"), Order1:=xlAscending, _
        Key2:=Range("AF1"), Order2:=xlAscending, _
        Header:=True, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
    
    Dim lastRow As Long
    lastRow = Range("AF" & Rows.Count).End(xlUp).Row
    
'--- Step 2 データ転記
    Dim pCode As String
    Dim bOverWrite As Boolean
    Dim srcRow As Long
    For i = DATA_START_LINE To lastRow
        If Cells(i, "AG").Value = pCode Then
            If bOverWrite = True And Cells(i, "AF") = 1 Then
                Range("A" & srcRow).Resize(1, 31).Copy _
                    Destination:=Range("A" & i).Resize(1, 31)
                Cells(i, "AH") = "再出品"
            End If
        Else
            If Cells(i, "AF").Value = 0 Then
                bOverWrite = True
                pCode = Cells(i, "AG").Value
                srcRow = i
            Else
                bOverWrite = False
            End If
        End If
    Next
    
'--- Step 3 行削除
    For i = lastRow To DATA_START_LINE Step -1
        If Cells(i, "AF") = 0 Then
            Rows(i).Delete
        End If
    Next
End Sub
id:aiomock

ご回答ありがとうございます。

プログラムを実行したのですが 400というメッセージエラーが発生してしまいました。

プログラムを始める行も 商品番号が入っている

Const DATA_START_LINE = 4

に変更してみたのですが引き続きエラーが発生してしまいます。

2008/12/16 23:43:04
  • id:Mook
    エラーが発生したのはどの行でしょうか。
    また、セルの結合は使用されていますか?

    もしソートであれば、
     Columns("A:AG").Sort _
     Key1:=Range("AG1"), Order1:=xlAscending, _
     Key2:=Range("AF1"), Order2:=xlAscending, _
     Header:=True, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
    の部分を下記のようにしてどうでしょうか。
     Range("A4:AG65535").Sort _
     Key1:=Range("AG4"), Order1:=xlAscending, _
     Key2:=Range("AF4"), Order2:=xlAscending, _
     Header:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
  • id:aiomock
    変更させて、実行させてみたところ

    実行時エラー”13”

    型が一致しません。

    というエラーが発生いたしました。

    セルの結合は行っておりません。

    現在こちらのサンプルのエクセルの並び替えをしているのですが

    http://oskuni7.sakura.ne.jp/hatena/question3/hatena3_1.htm

    並び替えを行っているのは4行目からになります。(行数を書いていなかったので追加いたしました。申し訳ありません。)

    全てのセルの結合をはずしてやってみましたが、引き続き 型が一致しませんというエラーが発生しております。

    お手数をおかけしますがご回答よろしくお願いいたします。
  • id:Mook
    エラーが出ている位置を報告いただけるでしょうか。

    エラーが発生した時に、下にデバッグというボタンがあると思いますので、それを押し
    VBEで黄色くなっている行を教えてください。


    追記:
    代入を行っているのはここだけなので、もしエラーが出ているのがここであったら
     Range("A" & srcRow).Resize(1, 31).Copy _
      Destination:=Range("A" & i).Resize(1, 31)
    srcRow と i の上にマウスカーソルを持って行き、表示される数字も一緒に教えてください。
    また、対象シートのその行に通常のデータがあるかどうかも、確認ください。
  • id:aiomock
    Mook さん

    ご回答ありがとうございます。

    プログラムを実行してみたのですがエラーメッセージがでてくるもののデバッグボタンがでてこない状況です。

    プログラムを行った際のパソコン状況の画像をアップしてみました。

    VBAエラー発生の画面:http://oskuni7.sakura.ne.jp/hatena/question3/gamen1.jpg

    エクセル:http://oskuni7.sakura.ne.jp/hatena/question3/gamen2.jpg

    デバッグに関してどこか設定するところがありましたら、引き続きご回答をいただければと思います。

    お手数ばかりおかけし申し訳ありません。。。
  • id:Mook
    うーん、環境に依存するかと思いましたが、EXCEL2003、2007とも問題なく動作しました。
    下記にこちらの作成したものを置きましたので、そちらのものと比べてみていただけますか?

    http://www.filebank.co.jp/wblink/5356613dd27563cc889f99cbab975fdc
  • id:aiomock
    Mook さん

    プログラム綺麗に実行されました。

    ありがとうございます^^。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません