Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3433 / 13645 ツリー ←次へ | 前へ→

【62250】AdvancedFilterがうまくいきません hiro 09/7/4(土) 3:17 質問[未読]
【62251】Re:AdvancedFilterがうまくいきません かみちゃん 09/7/4(土) 8:13 発言[未読]
【62252】Re:AdvancedFilterがうまくいきません hiro 09/7/4(土) 9:34 発言[未読]
【62254】Re:AdvancedFilterがうまくいきません かみちゃん 09/7/4(土) 13:47 発言[未読]
【62258】Re:AdvancedFilterがうまくいきません hiro 09/7/4(土) 19:09 お礼[未読]
【62256】Re:AdvancedFilterがうまくいきません kanabun 09/7/4(土) 15:53 発言[未読]
【62259】Re:AdvancedFilterがうまくいきません hiro 09/7/4(土) 19:38 お礼[未読]
【62257】Re:AdvancedFilterがうまくいきません kanabun 09/7/4(土) 16:50 発言[未読]
【62260】Re:AdvancedFilterがうまくいきません hiro 09/7/4(土) 20:25 お礼[未読]

【62250】AdvancedFilterがうまくいきません
質問  hiro  - 09/7/4(土) 3:17 -

引用なし
パスワード
   よろしくお願いします。
EXCELは2003です。
AdvancedFilterを使い、指定列の中の重複しないデータを別シートに作成したいのですが、うまくいきません。
具体的には、作業明細シートの日付列(Columns(3))(表示形式:標準)に20090601などの数値が入っています。
どんな日付があるのか知りたくて、重複しない日付を日付集計1シートに取り出したいのですが、うまくいきません。
また、他に気になる点があります。criteriarangeがCriteriaRange、copytorangeがCopyToRangeとならないので、コードとして認識していないのかなと心配しています。
以下にコードを書きます。
Sub 日付抽出1()
Worksheets("作業明細").Range("A3").CurrentRegion.Columns(3). _
AdvancedFilter action:=xlFilterCopy, _
criteriarange:=Empty, _
copytorange:=Worksheets("日付集計1").Range("A3"), _
Unique:=True
End Sub
日付集計1シートは空の状態で実行しています。実行するとエラーにはなりませんが、日付集計1シートには何も表示されません。
また、日付集計1シートのセルA3の名前ボックスはExtractと表示されています。
よろしく、お願いいたします。

【62251】Re:AdvancedFilterがうまくいきません
発言  かみちゃん E-MAIL  - 09/7/4(土) 8:13 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>AdvancedFilterを使い、指定列の中の重複しないデータを別シートに作成したいのですが、うまくいきません。

AdvancedFilterを使う場合は、リストの先頭行の項目名が重要になります。

以下のようなシートイメージで、シートレレイアウトを教えていただけませんか?
  A  B  C  D
1
2
3
4

シートレイアウトを説明していただく際には、投稿欄右下の「等幅」にチェック
するといいかと思います。

【62252】Re:AdvancedFilterがうまくいきません
発言  hiro  - 09/7/4(土) 9:34 -

引用なし
パスワード
   かみちゃんさん、早速ありがとうございます。
作業明細シートのリストの項目名とデータ例をお知らせします。

 A    B  C    D   E   F    G
1 作業別勤務明細
2
3 社員番号 氏名 日付   作業ID 作業名 開始時間 終了時間
4   3456 あ  20090601   1 作業A   9:00  12:00
5   3457 い  20090602   2 作業B   13:00  15:30
6   3456 あ  20090602   2 作業B   13:00  15:30

よろしくお願いします。

【62254】Re:AdvancedFilterがうまくいきません
発言  かみちゃん E-MAIL  - 09/7/4(土) 13:47 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> 日付集計1シートには何も表示されません。
> また、日付集計1シートのセルA3の名前ボックスはExtractと表示されています。

提示されたシートレイアウトで、提示されたコードを実行すると、
「日付集計1」シートは以下のようになります。

   A   B
1
2
3 日付
4 20090601
5 20090602
6

何か不都合があるのでしょうか?

【62256】Re:AdvancedFilterがうまくいきません
発言  kanabun  - 09/7/4(土) 15:53 -

引用なし
パスワード
   ▼hiro さん:
横から失礼します

>Sub 日付抽出1()
>Worksheets("作業明細").Range("A3").CurrentRegion.Columns(3). _
>AdvancedFilter action:=xlFilterCopy, _
>criteriarange:=Empty, _
>copytorange:=Worksheets("日付集計1").Range("A3"), _
>Unique:=True
>End Sub

>日付集計1シートは空の状態で実行しています。実行するとエラーにはなりませんが、日付集計1シートには何も表示されません。

検索条件がなければ
>criteriarange:=Empty, _
の行は無くてもよいと思いますが、
あっても、検索範囲が正しければちゃんと抽出されるんですね。

いちど、フィルタをかける前に
MsgBox Worksheets("作業明細").Range("A3").CurrentRegion.Columns(3). _
    Address
のデバッグ行をマクロの最初に挿入して、
3行目が先頭行になっているか、とかを、確認されてみてはいかがでしょうか?
たとえば、[A1:A2]が結合されていたり、[A2]セルが空白でなく スペースが
入っていたりすると、
> .Range("A3").CurrentRegion
は、シートの1行目からの表範囲になってしまうので、

> 実行するとエラーにはなりませんが、
> 日付集計1シートには何も表示されません。

状態になります。こちらでも確認できました。
もし CurrentRegion.Columns(3) で範囲を正しく特定できないときは、
  With Worksheets("作業明細")
    .Range("C3", .Cells(.Rows.Count,3).End(xlUp)).AdvancedFilter ...

のように、C列の見出しセルからデータ最終セルまでとかで、範囲を特定
するようにします。

【62257】Re:AdvancedFilterがうまくいきません
発言  kanabun  - 09/7/4(土) 16:50 -

引用なし
パスワード
   ▼hiro さん:

>また、他に気になる点があります。criteriarangeがCriteriaRange、copytorangeがCopyToRangeとならないので、コードとして認識していないのかなと心配しています。

それは大丈夫かと思いますよ

たとえば、抽出範囲をRangeオブジェクト型の変数に入れてコードを記述すると、

 Dim r As Range  '← Rangeオブジェクト型変数
 With Worksheets("作業明細")
   Set r = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp))
 End With
このあと、
 r.
とタイプすると、メソッド候補リストに AdvancedFilter があるので[TAB]キー
でそれを選び、そのあとスペースを打ち込むと、
 「Action As XlFilterAction, [CriteriaRange], [CopyToRange],[Unique] 」
とパラメータリストが出てきますよね?
そのとき、Action,CriteriaRange, CopyToRange,Unique と大文字小文字を区別
して打ち込めば、モジュール内のそのほかのパラメータリストもみな一括変更さ
れます。↓

 r.AdvancedFilter Action:=xlFilterCopy, _
  CopyToRange:=Worksheets("日付集計1").Range("A3"), _
  Unique:=True
End Sub

すべて小文字だと「コードとして認識していない」かと不安になりますが、
ちゃんと認識しています。
たとえば プロシージャのどこかに
Dim value as double
と、value という変数を宣言したとすると、(こんな変数名あり得ないのですが)
そのプロジェクト内のすべてのモジュールの Rangeオブジェクトの
Valueプロパティが "value" に変わってしまいます。
VBE は プロジェクト全体で変数名、プロパティ、プロシージャ名の
大文字小文字を統一するように管理しています。

先ほど宣言した
> Dim value as double
は、一端
Dim Value as double
と直して、
すぐ この一行を削除しておいてください (^^

【62258】Re:AdvancedFilterがうまくいきません
お礼  hiro  - 09/7/4(土) 19:09 -

引用なし
パスワード
   かみちゃんさん、お世話になりました。
早速テストしていただき、ありがとうございました。
私の作業明細シートの2行目に問題があったようです。
2行目の行番号を選択し、DELキーを押しデータを削除して、マクロを実行してみました。するとテストしていただいたような結果が日付集計1シートに表示されました。
何も入力されていないように見えていたのですが、スペースなど見えないものが2行目のどこかに入っていたようです。推測ですが。
3日間なやんでいました、大変ありがとうございました。また質問させていただく機会があったら、お手数ですがよろしくお願いいたします。

【62259】Re:AdvancedFilterがうまくいきません
お礼  hiro  - 09/7/4(土) 19:38 -

引用なし
パスワード
   kanabun さん、ありがとうございます。
>いちど、フィルタをかける前に
>MsgBox Worksheets("作業明細").Range("A3").CurrentRegion.Columns(3). _
>    Address
>のデバッグ行をマクロの最初に挿入して、
>3行目が先頭行になっているか、とかを、確認されてみてはいかがでしょうか?
上のデバッグ行をマクロに挿入して、実行してみました。
なんと、$C$1:$C$18とMsgBOXに表示され驚きました。C3からではなくC1から選択されていました。

>たとえば、[A1:A2]が結合されていたり、[A2]セルが空白でなく スペースが
>入っていたりすると、
>> .Range("A3").CurrentRegion
>は、シートの1行目からの表範囲になってしまうので、
2行目の行番号を選択し、DELキーで2行目全体を消去し、再度マクロを実行しました。するとMsgBoxには$C$3:$C$18と表示され、日付集計1シートにはユニークな日付データが表示されていました。
このデバッグ行はたいへん素晴らしいですね。とても勉強になりました。
このデバッグ行は .Range("A3").CurrentRegionが選択した範囲が確認でき、実行できたり出来なかったり不安な気持ちで使ってきたマクロでしたが、自信をもって
マクロを使っていける気持ちになりました。

>状態になります。こちらでも確認できました。
>もし CurrentRegion.Columns(3) で範囲を正しく特定できないときは、
>  With Worksheets("作業明細")
>    .Range("C3", .Cells(.Rows.Count,3).End(xlUp)).AdvancedFilter ...
>のように、C列の見出しセルからデータ最終セルまでとかで、範囲を特定
>するようにします。
このステートメントも参考にさせていただきます。
数日間悩んでいた問題が解決しました。ありがとうございました。たいへん勉強になりました。
また、質問させていただく機会がありましたら、よろしくお願いいたします。
ありがとうございました。

【62260】Re:AdvancedFilterがうまくいきません
お礼  hiro  - 09/7/4(土) 20:25 -

引用なし
パスワード
   kanabun さん、たびたびご丁寧なアドバイス、ありがとうございます。
>>また、他に気になる点があります。criteriarangeがCriteriaRange、copytorangeがCopyToRangeとならないので、コードとして認識していないのかなと心配しています。

>それは大丈夫かと思いますよ
>すべて小文字だと「コードとして認識していない」かと不安になりますが、
>ちゃんと認識しています。
ほっとしました。

>そのとき、Action,CriteriaRange, CopyToRange,Unique と大文字小文字を区別
>して打ち込めば、モジュール内のそのほかのパラメータリストもみな一括変更さ
>れます。
一括変換されました、感激です。

最近マクロを書き始めたところで、なんとなく書いていましたが、たいへんスッキリしました。
ご丁寧な回答をいただき、ありがとうございました。
マクロの勉強を続けていこうと思っています。
また、質問させていただいたときは、よろしくお願いいたします。
ありがとうございました。

3433 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free