エクセルの学校


[[20131207091222]] 『データをまとめる』(木葉) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

|
| 全文検索 | 過去ログ | HOME ]

 

『データをまとめる』(木葉)

 おはようございます。毎度お世話になっております。

 混乱してきたので、皆様のお知恵を拝借したく、また来てしまいました。
 貴重なお時間いただいてしまいますが、ご回答くださればありがたいです。

http://xfs.jp/cwmgq6

 ↑簡易なデータを載せておきます

 データが無くても出来る限りご理解いただけるよう説明したいと思っておりますが、
説明不足によりお手数かけるかも知れません。ご了承くださいませ。

 データの内容はざっくり言うと、勤務表みたいなものです。

 1シートにつき1社1カ月分、これが何社かあるので社数分のシートがあります。
 次月に入ると別のブックに移動するので、1ヶ月分=1ブックとなります。
 処理前のデータ(上に載せたデータのうち、上の表です)は、これとは違うブックから
必要な部分だけをコピーし、貼り付けたものです。

 *データの構成*

 A1〜B2→セルを結合し、社名を入れています。
 C1→何月の表なのかを入力しています。
 4行目→見出しです。C4から順に、「日付」「番号」「備考」「人員」「朝」「昼」とH4まで続きます。
 ※「朝」「昼」は仕事の内容、といったところです。

 処理前のデータは、一人の1作業につき1行を使っているので、1行で朝、昼のデータが
両方入っているという事はありません。
 【例1】
 1日 1 Aさん 朝データ
 1日 1 Aさん      昼データ

 という感じに2行に分けて表示されています。

 ここで、同じ「日付」同じ「人員」同じ「番号」で
なおかつ朝・昼でペアになっているデータを同じ行にして、2行→1行にまとめたいのです。
 【例1】でいうと
 1日 1 Aさん 朝データ 昼データ
 にまとめたいのです。

 元データからコピーして、このブックに貼り付ける際に、
並べ替え(昇順で、優先度は1「日付」2「人員」3「番号」に設定します)をするようにしているので、
同じ「日付」同じ「人員」同じ「番号」は前後かもしくはそれに近い位置に並べられると思います。

 ここから少しややこしいですが、
 同じ「日付」同じ「人員」同じ「番号」のデータが、3件以上の場合があるのです。

 【例2】
 1日 1 Aさん 朝データ
 1日 1 Aさん      昼データ
 1日 1 Aさん 朝データ

 このような状態です。
 同じ「日付」同じ「人員」同じ「番号」のデータ数は1件から6件までの可能性があります。
 このような場合には、
 【例2】でいうと
 1日 1 Aさん 朝データ 昼データ
 1日 1 Aさん 朝データ
 というように、朝と昼がペアになっている部分だけをまとめ、残りのデータはそのままにしたいです。
 同じ「日付」同・・・(ry)のデータをまとめるにあたって、4件以上のデータ数になると、
2ペア出る場合もあるし、1ペアと2つはペアにならないもの、または全てペアにならないデータもあります。

 また、3件以上同じ(ry)データが出た場合、ペアにするデータと
単体のままのデータの区別はありません。上から順に合ったものをまとめる方法でも良いし、このあたりに条件はありません。

 ※上に載せたデータには、黄色でまとめる箇所を塗りつぶしておりますが、実際は色はありません。
 また、まとめた際に備考が潰れたりしても構いません。

 この時期ですし、皆様も大変忙しい中だとは思うのですが、
ご協力いただけたら嬉しいです。よろしくお願いします。

 ps.しばらく見ないうちに(あまり経っていないような気もするが)色々と仕様が変わっていたみたいで、
大変使いやすいと感じました。便利さにかまけてまたお邪魔する機会があるかもしれませんね・・・。(笑)
この学校にはいつも優しく教えてくださる先生方がいて心がホットになります。(*´-◇-`*)校長先生と先生方に感謝です。

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


 >元データからコピーして、このブックに貼り付ける際に、
 >並べ替え(昇順で、優先度は?@「日付」?A「人員」?B「番号」に設定します)をするようにしているので、
 って事ですが、たとえば表部分を左右に二つコピーして

 左側の表は 日付→番号→人員→朝 の順で並び替え
 右側の表は 日付→番号→人員→昼 の順で並び替え
 左側の表の昼の列から、右側の表の朝の列までを削除
 朝・昼ともに空白になっている行を削除

 ってのはどうですか?
  
(HANA) 2013/12/07(土) 13:16

 あ、並べ替えの順番は
  日付→人員→番号→朝or昼
 で良いですね。

 載せておられるブックのデータは
 並べ替えをする前のデータだったんですね。
  
(HANA) 2013/12/07(土) 13:34

HANA様

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

 並び替えについてなのですが、2013バージョンだからかな?
 3項目までしか優先順位をつけることが出来ないのですが・・・

 どうしたらよろしいでしょうか?

 >載せておられるブックのデータは
 >並べ替えをする前のデータだったんですね。
 そう・・・ですね・・・慌てて載せたがために確認しておりませんでした・・・。ごめんなさい

(木葉) 2013/12/07(土) 13:46


 優先順位の低い方から並べ替えをして下さい。

 手作業なら 並べ替えをしたい範囲を選択して
 Tab で「朝」の列までアクティブセルを移動 A→Z ボタンを押す
 Tab や Shift+Tab を駆使して アクティブセルを移動させながら A→Z ボタンで並べ替え。

 溢れる一つだけ先に済ませておいて
 残りの三つを一気に指定しても良いと思います。

 マクロの話かな?と思ってましたが。。。
  
(HANA) 2013/12/07(土) 14:09

HANA様

 あ、なるほどです!
 ・・・私の頭固まってきてるかもしれないですね・・・

 最終的にはマクロで処理できたらいいなーと思います。
 しかしマクロの記録に頼って細かいところは調べてコードを作成する程度の知識しかないので、
最初に動作を知らない事には何もできないなぁと思いまして。

 一度大まかに今の流れを作ってみます!
 ありがとうございます!

(木葉) 2013/12/07(土) 14:30


とりあえず作ってみました。

 Sub test()

 Dim a As Integer
 'コピーペースト
    a = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("C5:H" & a).Copy _
        ActiveSheet.Range("I5")

    Application.CutCopyMode = False

 '1つ目(朝データ)の並び替え
    Range("C5:H" & a).Sort Key1:=Range("G5"), Order1:=xlAscending
    Range("C5:H" & a).Sort Key1:=Range("C5"), Order1:=xlAscending, Key2:=Range("F5") _
        , Order2:=xlAscending, Key3:=Range("D5"), Order3:=xlAscending

 '1つ目(昼データ)の並び替え

    Range("I5:N" & a).Sort Key1:=Range("N5"), Order1:=xlAscending
    Range("I5:N" & a).Sort Key1:=Range("I5"), Order1:=xlAscending, Key2:=Range("L5") _
        , Order2:=xlAscending, Key3:=Range("J5"), Order3:=xlAscending

 '間を消してデータ列長さを揃える

    Columns("H:M").Delete Shift:=xlToLeft
    Columns("G:H").ColumnWidth = 30

 Application.CutCopyMode = True
 End Sub

 汚くて読みづらいと思います。私の限界なのでご了承ください・・・。

 あと問題点が2つあって、まとめた後に残る空白行の削除と、
 並び替えた時に残ってしまう罫線の対処、です。

 どちらもコードの書き方がいまいち分からないのですが、
 罫線については、普通にエクセルを使用するにおいて(マクロを使わずに)は、
 罫線ごと並び替えをするのは不可能だと聞きました。

 という事は、処理前に引かれていた罫線を一度消し、新たに文字の入力されているセルのみに
 罫線を引く、という書き方をすればいいのでしょうか?

 貴重なお時間をとってしまい申し訳ないですが、再度よろしくお願いします。

 また、次の返信は月曜日になりそうです。図々しくてごめんなさい・・・。

(木葉) 2013/12/07(土) 16:23


 >まとめた後に残る空白行の削除
 これは、オートフィルタを使う事にしてみてはどうですか?

 「朝」が空白のセル、「昼」が空白のセル
 をそれぞれ表示して Range("C6:H" & a)の範囲の行を削除。

 >並び替えた時に残ってしまう罫線の対処
 この辺りはいまいちどういった事か良く分かりません。

 今回の提案をしたのも
 「書式を整えるのが面倒だから コピーして引き継げば良いや」
 と思ったので。。。

 データが何も入って無くて 罫線だけが引かれているセルがあって
 そこは罫線も削除したい
 って事ですか?

 ただ、「並べ替え〜〜」って所の記述を見ると
 もともと表に綺麗に罫線が入っていないのでこれを機に引き直したい
 と言う事の様にも思えますし。。。?
  
(HANA) 2013/12/07(土) 23:28

HANA様

 おはようございます。遅くなり申し訳ないです。

 >これは、オートフィルタを使う
 なるほどです!早速コードを作成してみます!

 並び替えについてですが、
 表の罫線は、番号、備考、人員の範囲には全てのセルに使っているのですが、
 朝、昼の表には、データが入力されているセルのみ罫線を使用しています。

 なので、並び替えした時に変化があった(移動した?)セルは、書式は移動しても罫線は一緒に移動しません。
 罫線だけ処理前と同じ位置にある状態になるので、不恰好と言いますか・・・。

 いっそ全てに罫線を引いたほうがいいと思うのですが、できれば、罫線はデータの
 入っているセルだけにというのが希望です。

 長々と書きましたが、
 >データが何も入って無くて 罫線だけが引かれているセルがあって
 >そこは罫線も削除したい
 ↑と同じ、かな?
(木葉) 2013/12/09(月) 11:10

 >罫線だけ処理前と同じ位置にある状態になるので、不恰好と言いますか・・・。
 あ、やってみてわかりました。(前回は何のことかわからないままコメントしてました、すみません。)

 >できれば、罫線はデータの入っているセルだけにというのが希望です。
 でしたら、まずは描かれている罫線は一旦削除するとして
 条件付き書式を利用して「セルが空白でない」と言った条件で
  上下左右の罫線を描く 設定をする とか
 ジャンプ機能(Ctrl + G)で セル選択(S) → ●定数(O) で
  文字が入っているセルだけ選択して罫線を引く

 ってのはどうですか?
 (二つ書きましたが、Ctrl + G の方が後腐れが無くて良いと思います。)

 >>罫線だけが引かれているセルがあってそこは罫線も削除したい
 >↑と同じ、かな?
 たぶん、文字が入っているけど罫線が無いセル ってのもありますよね。。。?
  
(HANA) 2013/12/09(月) 11:26

HANA様

 >ジャンプ機能(Ctrl + G)で セル選択(S) → ●定数(O) で
 >文字が入っているセルだけ選択して罫線を引く

 なるほどです。お昼休憩して再度作成してみます!

 >たぶん、文字が入っているけど・・・
  あ、そうですね、確かに・・・です

またお昼後に返事させていただきます!
(木葉) 2013/12/09(月) 12:00


何だかよくわからないまま出来ました。↓

 Sub test()

  Dim a As Integer
 'コピーペースト
    a = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("C5:H" & a).Copy _
        ActiveSheet.Range("I5")

    Application.CutCopyMode = False

 '1つ目(朝データ)の並び替え
    Range("C5:H" & a).Sort Key1:=Range("G5"), Order1:=xlAscending
    Range("C5:H" & a).Sort Key1:=Range("C5"), Order1:=xlAscending, Key2:=Range("F5") _
        , Order2:=xlAscending, Key3:=Range("D5"), Order3:=xlAscending

 '2つ目(昼データ)の並び替え
    Range("I5:N" & a).Sort Key1:=Range("N5"), Order1:=xlAscending
    Range("I5:N" & a).Sort Key1:=Range("I5"), Order1:=xlAscending, Key2:=Range("L5") _
        , Order2:=xlAscending, Key3:=Range("J5"), Order3:=xlAscending

 '間を消してデータ列長さを揃える

    Range("H4:M" & a).Delete Shift:=xlToLeft
    Columns("G:H").ColumnWidth = 30

 Application.CutCopyMode = True

 'オートフィルターで空白行削除

    Range("C5:H" & a).AutoFilter
        Range("C5:H" & a).AutoFilter Field:=5, Criteria1:="="
        Range("C5:H" & a).AutoFilter Field:=6, Criteria1:="="

        Range("C6:H" & a).Delete Shift:=xlUp
    Range("C6:H" & a).AutoFilter

 '罫線の書き直し

    With Range("G5:H" & a).Borders
        .LineStyle = xlLineStyleNone
    End With

    With Range("G5:H" & a).SpecialCells(xlCellTypeConstants, 2).Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With

 End Sub

 とりあえずなんとか・・・。
 ここまでお付き合いくださってありがとうございます(*-U-*)

 ここで新たに問題?が出てきました・・・。
 このマクロ、連続で2回使用してしまうと
 1行だけ残り、あとは全て削除されてしまうみたいなのですが、

 続けて2回使用できないようにするか、
 何回使用しても、1回目に使用した状態(処理後)のままにする

 みたいな事はできますでしょうか?

 セルのどこかに「処理済」と入力するのが一番手っ取り早い気がするのですが、
 オートシェイプからボタンを作って登録しようと思っているので、
 「処理済」は見えていたけどうっかり押しちゃった・・・、なんて事があったら少し面倒ですし・・・。

 他に何か手段があれば教えていただきたいです!

(木葉) 2013/12/09(月) 14:16


 連続で2回すると、オートフィルタで何も抽出されず
 全て消えてしまうので、条件に一致したデータ(両方空白のセル)
 があるかどうかチェックしても良いとは思いますが

 どこかに「処理済」と入れて良いなら
 If Range(そのセル).Value <> "処理済み" Then
     処理をする
 Else
     Msgbox "処理済です。"
 End If

 みたいな感じでやるのが簡単だと思います。
  
(HANA) 2013/12/09(月) 15:02

HANA様

おー、なるほどです!
無事作動してすっきりしましたー。

お忙しい時期に長い間、お世話になりまして、本当に感謝です。
こんな私でも納得のいくような導き方をしていただき、大変助かりました!

私から見ると無理難題な事だなぁと思っていることでも的確にご指導くださっていて、
すごく尊敬です。

またお世話になることがありましたら、よろしくお願いします(完全に頼るつもりな文ですね・・・)

ありがとうございました!

(木葉) 2013/12/09(月) 15:28


 無事出来ましたか。良かったです。
 色々弱気な事も書いてありますが
 載せておられるコードは、すっきり整理されていて良いと思います。

 今後 セル番地が変わってしまう事などを見据えて
 なるべく変更が簡単なコードになる様に考えてみても良いかもしれません。

 もっとVBA的な書き方も出来ると思いますが、せっかくエクセルなので
 一般機能を利用する方向からアプローチして行っても良いと思います。

 先にも書きましたが、二回目に実行するとデータがなくなってしまうのは
 オートフィルタでの抽出結果が無い事が原因です。
 ですから、一回目でも 抽出結果が無い場合は やはりすべてのデータがなくなってしまいます。

 姑息な手段として Range ("C5:H" & a + 1) の範囲にオートフィルタを設定すると
 思惑通り動いてくれるかもしれません。。。
  
(HANA) 2013/12/09(月) 16:49

HANA様

 HANA様からそのようなお言葉いただけて嬉しいです(*´U`*)
 変更に適応したコードも、挑戦してみようと思います!

 >一回目でも 抽出結果が無い場合は やはりすべてのデータがなくなってしまいます
 ちょうどそれに気がついて急いで戻ってきました!
 「+1」のしくみがよく分からないのでひとまずオートフィルする部分のコードを
 >Range ("C5:H" & a + 1)
 に書き換えてみたところ、上の1行が削除されているようなのですが・・・。

 どう書き換えたらよろしいのでしょうか・・・?
(木葉) 2013/12/09(月) 17:06

 オートフィルタを設定して、抽出するときに
 実際の表の一行下までを範囲にすると
 かならず  両方のセルが空白の行ができますよね?

 って思ったのですが。

 消す範囲はタイトル行を含めない範囲にしないと
 タイトル行も消えてしまいますよ?
 (上の一行って、どこの事だろう?)
  
(HANA) 2013/12/09(月) 17:18


HANA様

 >実際の表の一行下までを範囲にすると
 >かならず  両方のセルが空白の行ができますよね?

 あ、そっか!なるほどです!

 >消す範囲はタイトル行を含めない範囲にしないと
 >タイトル行も消えてしまいますよ?
 タイトル行は4行にしていますし、実際削除するコードは6行目からなのですが、
 もしやタイトルごと消えてしまうのでしょうか・・・?オートフィル難しい・・・。

 >上の一行って、どこの事だろう?
 えっと、データが入力されている部分の一番上の行です。
 上の載せているブックの、12月1日 A 1  2
 となっている行なのですが・・・

  
(木葉) 2013/12/09(月) 17:28


あ、処理後の12月1日 A 1  2
の行です
(木葉) 2013/12/09(月) 17:29

 う〜ん、何でしょう

 'オートフィルターで空白行削除
    Range("C5:H" & a + 1).AutoFilter
        Range("C5:H" & a + 1).AutoFilter Field:=5, Criteria1:="="
        Range("C5:H" & a + 1).AutoFilter Field:=6, Criteria1:="="

        Range("C6:H" & a + 1).Delete Shift:=xlUp
    Range("C6:H" & a + 1).AutoFilter

 こう言うのも駄目ですか?

 ちょっとやってみたところ、こちら(vista 2007)では
 'オートフィルターで空白行削除

    Range("C5:H" & a).AutoFilter
        Range("C5:H" & a).AutoFilter Field:=5, Criteria1:="="
        Range("C5:H" & a).AutoFilter Field:=6, Criteria1:="="

        Range("C6:H" & a + 1).Delete Shift:=xlUp '★ここにだけ +1
    Range("C6:H" & a).AutoFilter

 こんなので行けるみたいですが。。。
    Deleteする段階で 非表示に成っていないセルを含める。

 >タイトル行は4行にしていますし、実際削除するコードは6行目からなのですが
 オートフィルタの範囲は 5行目からにしてありますよね?
 4・5行目がタイトルで、6行目からデータ て事ですか??

 >上の1行が削除されているようなのですが・・・。
 ってのは、5行目がタイトル 6:19行目にデータが隙間なく入っている(削除すべき行が無い)時
  a+1 で実行すると、6行目が削除されて 5行目タイトル+6:18行目データ の表に成る
 って事ですか?
  
(HANA) 2013/12/09(月) 23:05

HANA様

 おはようございます。

 >'オートフィルターで空白行削除
 >   Range("C5:H" & a + 1).AutoFilter
 >       Range("C5:H" & a + 1).AutoFilter Field:=5, Criteria1:="="
 >       Range("C5:H" & a + 1).AutoFilter Field:=6, Criteria1:="="
 >
 >       Range("C6:H" & a + 1).Delete Shift:=xlUp
 >   Range("C6:H" & a + 1).AutoFilter
 昨日はこれで試していて出来ませんでした・・・。

 >'オートフィルターで空白行削除
 >Range("C5:H" & a).AutoFilter
 >       Range("C5:H" & a).AutoFilter Field:=5, Criteria1:="="
 >       Range("C5:H" & a).AutoFilter Field:=6, Criteria1:="="
 >
 >      Range("C6:H" & a + 1).Delete Shift:=xlUp '★ここにだけ +1
 >   Range("C6:H" & a).AutoFilter

 こちらも先ほど試したところ、同じような現象になってしまいました・・・。

 >4・5行目がタイトルで、6行目からデータ て事ですか??
 あ、変な勘違いしてました。ごめんなさい。
 4行目タイトルで、5行目からデータなのですが、コードだけ見てC6からが
 削除範囲になっているなぁ、と思っていました・・・。

 >>上の1行が削除されているようなのですが・・・。
 >ってのは、5行目がタイトル 6:19行目にデータが隙間なく入っている(削除すべき行が無い)時
 > a+1 で実行すると、6行目が削除されて 5行目タイトル+6:18行目データ の表に成る
 >って事ですか?
 上に述べました通り、私の意味不明な勘違いで混乱させて申し訳ないです。
 削除すべき行が無い時、5行目が削除されて 4行目タイトル+6:19行目のデータの表になる、という事です。
 タイトルの1つ下の行が削除されて、それ以降の行は1行上にシフトされている状況ですね。

 色々いじってみて、最後の行を
 >   Range("C6:H" & a).AutoFilter
    ↓
    Range("C5:H" & a).AutoFilter
 にすると、出来たのですが・・・

 自分でコードを書いておいてお恥ずかしい限りなんですが、
 なぜ下2行の部分をC6にしているのか分からないです。なぜ気づかなかったんだろう・・・。

 「'オートフィルターで空白行削除」のコード上にある全てのセルの範囲を「C5:」にすると、
 昨日と同じになってしまいます。
 「Range("C6:H" & a + 1).Delete Shift:=xlUp 」の部分のセル範囲だけC6だと、
 思った通りに動いてくれるのですが、なんだかしっくり来ないというか、納得できないです。

(木葉) 2013/12/10(火) 10:59


 ・・・あ、ごめんなさい、できてました!
 なんで出来なかったのかわかりませんが・・・

 ご迷惑おかけしまして・・・
 質問の際はもっと慎重にっするようきをつけます・・・。

 ここまで長い間お付き合いいただいて本当にありがとうございます!

(木葉) 2013/12/10(火) 11:51


 4行目がタイトルですか?
 でしたら、それらを踏まえたコードにするのが良いと思います。

 コピーする時は、4行目を含めてコピーし
 並べ替えをする時は、「タイトル行があります」と指定。
  今は特に指定をしていないので、エクセルに「1行目ってタイトルっぽいな」と思われると
  2行目からしか並べ替えてくれません。
  もちろん「タイトル行は無いです」と指定しても良いのですが、エクセルでデータを扱う際
  タイトル行の重要性(あるといろんな事が便利になったりする)を意識されるのが良いと思います。

 オートフィルタは、タイトル行を含めた範囲にオートフィルタをかける。
  今のコードだと、データの先頭行に「▼」がつかないですか?
  おそらく、データの先頭行に抽出されるべき行が来ることはないと思いますが
  もしそうだった場合、削除されないですよね?

 色々な処理をする際、あえてタイトル行を外した範囲を処理しているのには
 何か理由がありますか?
  
(HANA) 2013/12/10(火) 13:24

HANA様

 細かい箇所までお気遣いいただけるなんて・・・ありがとうございます!

 >もちろん「タイトル行は無いです」と指定しても良いのですが、エクセルでデータを扱う際
 >タイトル行の重要性(あるといろんな事が便利になったりする)を意識されるのが良いと思います。
 なるほど・・・並びかえとかオートフィルタって、
 データだけ範囲指定してるのになんで勝手に・・・とか思ってましたが・・・気をつけます。

 >オートフィルタ・・・今のコードだと、データの先頭行に「▼」がつかないですか?
 マクロ内でオートフィルタを解除していたので気づきませんでした。
 試してみて、確かに・・・。

 >色々な処理をする際、あえてタイトル行を外した範囲を処理しているのには
 >何か理由がありますか?
 ありません。並び替えたりフィルタを使う時って、どっちが正解なんだろう?と
 思いながら結局データの部分だけを指定していた気がします。

 並び替えとオートフィルタに、そんな秘密があったんですね。(私が気づかなかっただけですが)
 もう一度コードを書き直してみます!

 何から何まで、ありがとうございます(*^^*)

(木葉) 2013/12/10(火) 14:27


 で、出来ました!これで直すところは無いはず・・・
 仕事中なのにニヤニヤするのを堪えております。

 これでようやく仕事が捗ります!

 今回質問して、たくさん勉強になる事がありました。
 一皮剥けた気分です!

 3日間もお付き合いいただいたHANA様には、本当に感謝です!

 仕事が落ち着いたら、変更が簡単なコード、試してみようと思います。

 ありがとうございました!

(木葉) 2013/12/10(火) 16:18


 出来ましたか。良かったです。

 並べ替えの所で
  「タイトル行があります」
 と指定できましたか?

 せっかくなので、コードを載せてみてもらえると良いのですが。
  
(HANA) 2013/12/10(火) 17:11

HANA様

 おはようございます。
 一応全体を載せておきます。

 >並べ替えの所で
 >「タイトル行があります」
 >と指定できましたか?
 はい!恐らく、ですが・・・

Sub test()

  Dim a As Integer

  If Range("C2").Value <> "処理済み" Then

 'コピーペースト
    a = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row
    ActiveSheet.Range("C4:H" & a).Copy _
        ActiveSheet.Range("I4")

    Application.CutCopyMode = False

 '1つ目(朝データ)の並び替え
    Range("C4:H" & a).Sort Key1:=Range("G5"), Order1:=xlAscending, Header:=xlYes
    Range("C4:H" & a).Sort Key1:=Range("C5"), Order1:=xlAscending, Header:=xlYes, Key2:=Range("F5") _
        , Order2:=xlAscending, Header:=xlYes, Key3:=Range("D5"), Order3:=xlAscending, Header:=xlYes

 '2つ目(昼データ)の並び替え
    Range("I4:N" & a).Sort Key1:=Range("N5"), Order1:=xlAscending, Header:=xlYes
    Range("I4:N" & a).Sort Key1:=Range("I5"), Order1:=xlAscending, Header:=xlYes, Key2:=Range("L5") _
        , Order2:=xlAscending, Header:=xlYes, Key3:=Range("J5"), Order3:=xlAscending, Header:=xlYes

 '間を消してデータ列長さを揃える

    Range("H4:M" & a).Delete Shift:=xlToLeft
    Columns("G:H").ColumnWidth = 30

 Application.CutCopyMode = True

 'オートフィルターで空白行削除

    Range("C4:H" & a).AutoFilter
        Range("C4:H" & a).AutoFilter Field:=5, Criteria1:="="
        Range("C4:H" & a).AutoFilter Field:=6, Criteria1:="="

        Range("C5:H" & a + 1).Delete Shift:=xlUp '★ここにだけ +1
    Range("C4:H" & a).AutoFilter

 '罫線の書き直し

    With Range("G5:H" & a).Borders
        .LineStyle = xlLineStyleNone
    End With

    With Range("G5:H" & a).SpecialCells(xlCellTypeConstants, 2).Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With

    Range("C2") = "処理済"
 Else
     MsgBox "処理済です。"
 End If

 End Sub

 いかがでしょう?

(木葉) 2013/12/11(水) 08:52


 コードありがとうございます。

 そのままでも大勢に影響は無いと思いますが

 並べ替えの基準の列を指定するセル番地が、5行目になっているので
 なんだか落ち着かない感じがします。

 それから、C2セルに「処理済」を入力する部分は
 C2セル【の値】を と書かれていないのが気になります。
 省略していたら「の値」とみなされるのですが
 省略せずに書いておいた方が良いといわれる事が多いと思います。

 オートフィルタの部分は、範囲が途中で変わってしまうわけではないので
    With Range("C4:H" & a)
        .AutoFilter Field:=5, Criteria1:="="
        .AutoFilter Field:=6, Criteria1:="="

        .Offset(1).Delete Shift:=xlUp
    End With
    ActiveSheet.AutoFilterMode = False
 こんな感じにしておいても良いと思います。

 オートフィルタが設定されていない場合
 絞り込みするコードで オートフィルタの設定&絞り込み が行われます。

 元のイメージのまま
    With Range("C4:H" & a)
        .AutoFilter
            .AutoFilter Field:=5, Criteria1:="="
            .AutoFilter Field:=6, Criteria1:="="

            .Offset(1).Delete Shift:=xlUp
        .AutoFilter
    End With
 としてもわかりやすいかもしれません。
  
(HANA) 2013/12/11(水) 14:31

HANA様

 アドバイスありがとうございます!
 参考にさせていただきます。

 >並べ替えの基準の列を指定するセル番地が、5行目になっているので
 ここも4行目の指定でも大丈夫なのですね・・・。 直しておきます!

 >「の値」
 これってつまり、「.Value」のことですか?
 Range("C2").Value = "処理済"
 という事でしょうか?

 >オートフィルタの部分は、・・・こんな感じにしておいても良いと思います。
 同じ範囲なら省略することも出来るのですか!
 すごいです!とても勉強になります!

 ありがとうございます!
(木葉) 2013/12/11(水) 16:27

 >Range("C2").Value = "処理済"
 って事です。

 >同じ範囲なら省略することも出来るのですか!
 あれ?罫線を引くところで使っておられるので。。。

 記録をとると Withが使ってあるのでそのままなのかな?

 「省略されてるんだ」と思って
 見直してみてもらえると良いと思います。
  
(HANA) 2013/12/12(木) 20:16

HANA様

 「.Value」、了解です!直しておきます!

 >あれ?罫線を引くところで使っておられるので。。。
 確かに、使ってましたね・・・

 >記録をとると Withが使ってあるのでそのままなのかな?
 多分そうかも、です。全然気にしておりませんでした・・・。
 With、意識してみます!

5日間もの間、お世話になりまして・・・
何回も言いますが、本当にありがとうございます!

情けない話ですが、またこちらに質問させていただくことがありましたら、よろしくお願いします!

(木葉) 2013/12/13(金) 13:33


 なかなか終わらなくて、何度も
 >本当にありがとうございます! 
 言わせてしまってすみません。^^;

 こちらこそ、よろしくお願いします。
  
(HANA) 2013/12/13(金) 14:39

コメント:

[ 一覧(最新更新順) |

]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.