Excel VBA質問箱 IV

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

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


2287 / 13646 ツリー ←次へ | 前へ→

【68955】AutoFilter トキノハジメ 11/5/2(月) 14:56 質問[未読]
【68956】Re:AutoFilter kanabun 11/5/2(月) 15:11 発言[未読]
【68961】Re:AutoFilter トキノハジメ 11/5/2(月) 19:26 質問[未読]
【68962】Re:AutoFilter kanabun 11/5/2(月) 19:58 発言[未読]
【68964】Re:AutoFilter トキノハジメ 11/5/3(火) 8:22 質問[未読]
【68965】Re:AutoFilter kanabun 11/5/3(火) 9:43 発言[未読]
【68966】Re:AutoFilter kanabun 11/5/3(火) 9:51 質問[未読]
【68967】Re:AutoFilter トキノハジメ 11/5/3(火) 14:24 質問[未読]
【68968】Re:AutoFilter トキノハジメ 11/5/3(火) 14:45 質問[未読]
【68969】Re:AutoFilter kanabun 11/5/3(火) 15:59 発言[未読]
【68970】Re:AutoFilter トキノハジメ 11/5/3(火) 19:55 質問[未読]
【68971】Re:AutoFilter kanabun 11/5/3(火) 21:04 発言[未読]
【68972】Re:AutoFilter トキノハジメ 11/5/3(火) 21:58 質問[未読]
【68973】Re:AutoFilter kanabun 11/5/3(火) 22:39 発言[未読]
【68974】Re:AutoFilter トキノハジメ 11/5/4(水) 11:15 お礼[未読]

【68955】AutoFilter
質問  トキノハジメ  - 11/5/2(月) 14:56 -

引用なし
パスワード
   いつもお世話になります。
下記のコードなのですが今までうまくいっていたのですが、
何故か機能しないのですが、何か不備があればおしえてください。
当方 XP と Excel 2010 です
With Range("A3")
      Range("A3").AutoFilter Field:=1, Criteria1:=Worksheets(ShtName1).Range("E2").Value
      Range("B3").AutoFilter Field:=2, Criteria1:=Worksheets(ShtName1).Range("H2").Value
      .CurrentRegion.Copy Range("A41")
      .AutoFilter
    End With

【68956】Re:AutoFilter
発言  kanabun  - 11/5/2(月) 15:11 -

引用なし
パスワード
   ▼トキノハジメ さん:

>何故か機能しないのですが、何か不備があればおしえてください。

>With Range("A3")
>      Range("A3").AutoFilter Field:=1, Criteria1:=Worksheets(ShtName1).Range("E2").Value
>      Range("B3").AutoFilter Field:=2, Criteria1:=Worksheets(ShtName1).Range("H2").Value
>      .CurrentRegion.Copy Range("A41")
>      .AutoFilter
>    End With

たとえば、2つ目のAutoFilter
>  Range("B3").AutoFilter Field:=2
は、B列からみて Field:=2 なので C列のことですよ。

適当に直すと
Dim ws2 As Worksheet
Set ws2 = Worksheets(ShtName1)
With ActiveSheet.Range("A3").Currentregion
   .Worksheet.AutoFilterMode = False
   .AutoFilter Field:=1, Criteria1:=ws2.Range("E2").Value
   .AutoFilter Field:=2, Criteria1:=ws2.Range("H2").Value
   .Copy ActiveSheet.Range("A41")
   .AutoFilter
>End With

なお、
.Range("A3").Currentregion
で、3行目が先頭見出し行にならないときは、別の方法でFilter範囲を
取得する必要があります。

【68961】Re:AutoFilter
質問  トキノハジメ  - 11/5/2(月) 19:26 -

引用なし
パスワード
   ▼kanabun さん:アドバイスありがとうございます。
コードを埋め込んだところ、
Dim ws2 As Worksheet
Set ws2 = Worksheets(ShtName1)
Worksheets のところが黒くなって配列がありません。 とでるのですが

Dim Worksheets As String
Dim ShtName As String, ShtName1 As String

上記は記述していのですが、
調べましたがよくわかりません。
もう少し教えてください。

>>何故か機能しないのですが、何か不備があればおしえてください。
>
>>With Range("A3")
>>      Range("A3").AutoFilter Field:=1, Criteria1:=Worksheets(ShtName1).Range("E2").Value
>>      Range("B3").AutoFilter Field:=2, Criteria1:=Worksheets(ShtName1).Range("H2").Value
>>      .CurrentRegion.Copy Range("A41")
>>      .AutoFilter
>>    End With
>
>たとえば、2つ目のAutoFilter
>>  Range("B3").AutoFilter Field:=2
>は、B列からみて Field:=2 なので C列のことですよ。
>
>適当に直すと
>Dim ws2 As Worksheet
>Set ws2 = Worksheets(ShtName1)
> With ActiveSheet.Range("A3").Currentregion
>   .Worksheet.AutoFilterMode = False
>   .AutoFilter Field:=1, Criteria1:=ws2.Range("E2").Value
>   .AutoFilter Field:=2, Criteria1:=ws2.Range("H2").Value
>   .Copy ActiveSheet.Range("A41")
>   .AutoFilter
>>End With
>
>なお、
>.Range("A3").Currentregion
>で、3行目が先頭見出し行にならないときは、別の方法でFilter範囲を
>取得する必要があります。

【68962】Re:AutoFilter
発言  kanabun  - 11/5/2(月) 19:58 -

引用なし
パスワード
   ▼トキノハジメ さん:

>Set ws2 = Worksheets(ShtName1)
>Worksheets のところが黒くなって配列がありません。 とでるのですが
>
>Dim Worksheets As String
>Dim ShtName As String, ShtName1 As String
>
>上記は記述していのですが、

>Dim Worksheets As String
が問題ですね
Worksheets というExcelにはじめから備え付けのコレクション
(すべてのワークシートのコレクション)の ShtName1 という名の
メンバにアクセスするのですから、Worksheets は 変数宣言の必要はないです。

>Dim Worksheets As String
は削除してください。

【68964】Re:AutoFilter
質問  トキノハジメ  - 11/5/3(火) 8:22 -

引用なし
パスワード
   ▼kanabun さん:
有難うございます。余分なコードをなくして参考コードだけにしたら
表が3行目だけが残って後は全部消えてしまいましたが、
3行目は
  A  B   C   D
1 
2
3 名前 番号 数字 数字
4 点数 点数 点数 点数
以下30程続きます。 
もう少し教えてください。  

【68965】Re:AutoFilter
発言  kanabun  - 11/5/3(火) 9:43 -

引用なし
パスワード
   ▼トキノハジメ さん:
>▼kanabun さん:
>有難うございます。余分なコードをなくして参考コードだけにしたら
>表が3行目だけが残って後は全部消えてしまいました

「3行目だけが残って後は全部消えてしまいました」
ということから言えることは、

・フィルタはかかった。
・が、条件にマッチする行が存在しなかった。

ということです。
A列、B列のフィルタ条件(各Criteria1)に合うデータ行が 実際に
一つもないのか? あるいは 少なくとも一つ以上存在するけれど、コードで
フィルタかけると抽出されないのか?
確認してください。
'                       ↓ ここの値を確認
>   .AutoFilter Field:=1, Criteria1:=ws2.Range("E2").Value
>   .AutoFilter Field:=2, Criteria1:=ws2.Range("H2").Value

実際にも条件にマッチするものがなかったなら →ws2の[E2]と[H2]セルの値
を変更する。
実際にはA,B列条件に該当する行があるにもかかわらず、AutoFilterで
抽出されなかったばあい → ws2の[E2]と[H2]セルの値を教えてください。

ws2の[E2]と[H2]セルの値は まさか 日付じゃないですよね?
日付ですと、Criteria1 だけではダメですけど。

【68966】Re:AutoFilter
質問  kanabun  - 11/5/3(火) 9:51 -

引用なし
パスワード
   ▼トキノハジメ さん:

あと、フィルタかける表ですが、↓の説明ではよくわかりません。
>3行目は
>  A  B   C   D
>1 
>2
>3 名前 番号 数字 数字
>4 点数 点数 点数 点数
>以下30程続きます。 

これは、たとえば、
  A  B   C   D
1 
2  (空白行)
3 名前 番号 算数 国語
4 高橋 11   75  80
5 吉田 12   55  75
6 渡邉 15   85  100
7 大島  2   60  80

とかじゃないのですか??

>もう少し教えてください。

【68967】Re:AutoFilter
質問  トキノハジメ  - 11/5/3(火) 14:24 -

引用なし
パスワード
   kanabunさんすみません。変な表を送ってしまってすみません。
  A   B   C   D
1 
2
3  1   2   3   4  
4 名前 番号 数字 数字
5 名前 番号 数字 数字
6 名前 番号 数字 数字


上記の表で 1と2が空白なのは ボタンがあるのですが、なのて

【68968】Re:AutoFilter
質問  トキノハジメ  - 11/5/3(火) 14:45 -

引用なし
パスワード
   kanabunさんすみません。変な表を送ってしまってすみません。
再度送ります
   A   B  C   D  E   F 
1 
2
3 名前 順番  1   2   3   4  
4 名前 番号 数字 数字 数字 数字
5 名前 番号 数字 数字 数字 数字
6 名前 番号 数字 数字 数字 数字

上記の表で 1と2が空白なのは ボタンがあるのですが、なのて゛
A3 からの対象になります。日付けは有りません。

【68969】Re:AutoFilter
発言  kanabun  - 11/5/3(火) 15:59 -

引用なし
パスワード
   ▼トキノハジメ さん:
>kanabunさんすみません。変な表を送ってしまってすみません。
>再度送ります
>   A   B  C   D  E   F 
>1 
>2
>3 名前 順番  1   2   3   4  
>4 名前 番号 数字 数字 数字 数字
>5 名前 番号 数字 数字 数字 数字
>6 名前 番号 数字 数字 数字 数字
>
>上記の表で 1と2が空白なのは ボタンがあるのですが、なのて゛
>A3 からの対象になります。日付けは有りません。

了解です。

で、
> A列、B列のフィルタ条件(各Criteria1)に合うデータ行が 実際に
> 一つもないのか? あるいは 少なくとも一つ以上存在するけれど、コードで
> フィルタかけると抽出されないのか?

については、いかがですか?

【68970】Re:AutoFilter
質問  トキノハジメ  - 11/5/3(火) 19:55 -

引用なし
パスワード
   ▼kanabun さん:
A列、B列のフィルタ条件(各Criteria1)に合うデータ行が
2つともあるのですが、フィルターに掛けると抽出しないのです。
表ではA3のしたは行番号が40になり3列だけが見えていて後は何も見えていません。

>▼トキノハジメ さん:
>>kanabunさんすみません。変な表を送ってしまってすみません。
>>再度送ります
>>   A   B  C   D  E   F 
>>1 
>>2
>>3 名前 順番  1   2   3   4  
>>4 名前 番号 数字 数字 数字 数字
>>5 名前 番号 数字 数字 数字 数字
>>6 名前 番号 数字 数字 数字 数字
>>
>>上記の表で 1と2が空白なのは ボタンがあるのですが、なのて゛
>>A3 からの対象になります。日付けは有りません。
>
>了解です。
>
>で、
>> A列、B列のフィルタ条件(各Criteria1)に合うデータ行が 実際に
>> 一つもないのか? あるいは 少なくとも一つ以上存在するけれど、コードで
>> フィルタかけると抽出されないのか?
>
>については、いかがですか?

【68971】Re:AutoFilter
発言  kanabun  - 11/5/3(火) 21:04 -

引用なし
パスワード
   ▼トキノハジメ さん:
>▼kanabun さん:
>A列、B列のフィルタ条件(各Criteria1)に合うデータ行が
>2つともあるのですが、フィルターに掛けると抽出しないのです。
>表ではA3のしたは行番号が40になり3列だけが見えていて後は何も見えていません。

えっとですね、もう少し具体的な表を例示してもらえませんかね。

たとえば、
【68966】に挙げた、
  A  B   C   D
1 
2  (空白行)
3 名前 番号 算数 国語
4 高橋 11   75  80
5 吉田 12   55  75
6 渡邉 15   85  100
7 大島  2   60  80

のようなものでいいです。
上のような表に対して、

Dim ShtName1 As String: ShtName1 = "Sheet2" '←ここに参照先シート名を入れる
Dim ws2 As Worksheet
Set ws2 = Worksheets(ShtName1)
With ActiveSheet.Range("A3").Currentregion
   .Worksheet.AutoFilterMode = False
   .AutoFilter Field:=1, Criteria1:="吉田" 'ws2.Range("E2").Value
   .AutoFilter Field:=2, Criteria1:=12  'ws2.Range("H2").Value
   MsgBox "OK?", vbOkCancel
   .Copy ActiveSheet.Range("A41")
   .AutoFilter
End With

を実行すると、
A列が「吉田」で、かつ、B列が「12」の行は1行ありますから、
3行目(見出し行)と 5行目だけがフィルタされて、
>   MsgBox "OK?", vbOkCancel
で実行が一時中断すると思います。

そちらの表は どのようなもので、

>   .AutoFilter Field:=1, Criteria1:=ws2.Range("E2").Value
>   .AutoFilter Field:=2, Criteria1:=ws2.Range("H2").Value

 ws2.Range("E2").Value
 ws2.Range("H2").Value
とが、どのような値なのかを知りたいのです。

【68972】Re:AutoFilter
質問  トキノハジメ  - 11/5/3(火) 21:58 -

引用なし
パスワード
   ▼kanabun さん:
>  A  B   C   D
>1 
>2  (空白行)
>3 名前 番号 算数 国語
>4 東京 1番   75  80
>5 京都 2番   55  75
>6 渡邉 15   85  100
>7 大島  2   60  80

.Range("V45").Value = Worksheets(ShtName1).Range("E2").Value・・・東京
.Range("W45").Value = Worksheets(ShtName1).Range("H2").Value・・・1番

上記の物で E2 H2 は V45 W45 にそのまでてきています。

【68973】Re:AutoFilter
発言  kanabun  - 11/5/3(火) 22:39 -

引用なし
パスワード
   ▼トキノハジメ さん:
>.Range("V45").Value = Worksheets(ShtName1).Range("E2").Value・・・東京
>.Range("W45").Value = Worksheets(ShtName1).Range("H2").Value・・・1番
>
>上記の物で E2 H2 は V45 W45 にそのまでてきています。

↑おっしゃることがよく分からないので、
もっと簡単なテストをしてみましょう。

新規にBookを追加し、そのSheet1 の3行目から
以下の表を作成してください。

>  A  B   C   D
>1 
>2  (空白行)
>3 名前 番号 算数 国語
>4 東京 1番   75  80
>5 京都 2番   55  75
>6 渡邉 15   85  100
>7 大島  2   60  80


つぎに、標準モジュールを挿入し、
そこに 以下をコピペしてください。
'---------------------------------- 標準モジュール
Option Explicit
Sub Test1()
 Dim S1 As String, S2 As String
 
 S1 = "東京"
 S2 = "1番"
 With Sheet1.Range("A3").CurrentRegion
   .Worksheet.AutoFilterMode = False
   .AutoFilter 1, S1
   .AutoFilter 2, S2
   MsgBox "OK?"
   .AutoFilter
 End With
End Sub

Sub Test2()
 Dim S1 As String, S2 As String
 
 S1 = "京都"
 S2 = "2番"
 With Sheet1.Range("A3").CurrentRegion
   .Worksheet.AutoFilterMode = False
   .AutoFilter 1, S1
   .AutoFilter 2, S2
   MsgBox "OK?"
   .AutoFilter
 End With
End Sub

Sub Test3()
 Dim S1 As String, S2 As String
 
 S1 = "*京*"
 S2 = "*番"
 With Sheet1.Range("A3").CurrentRegion
   .Worksheet.AutoFilterMode = False
   .AutoFilter 1, S1
   .AutoFilter 2, S2
   MsgBox "OK?"
   .AutoFilter
 End With
End Sub

コピーしたら、一応
VBEメニューの[デバッグ]-[VBAプロジェクトのコンパイル]でコンパイルし、
3つの Testプロシージャを実行してみてください。

'▼Test1() を実行すると、
名前    番号    算数    国語
東京    1番    75    80
となります。(ただし、MsgBoxで[OK]を押すと、フィルタは解除されますが)

'▼Test2() を実行すると、
名前    番号    算数    国語
京都    2番    55    75
となります。

'▼Test3() を実行すると、
名前    番号    算数    国語
東京    1番    75    80
京都    2番    55    75

となります。


そちらでも、そうなりますか?
なりませんか?

【68974】Re:AutoFilter
お礼  トキノハジメ  - 11/5/4(水) 11:15 -

引用なし
パスワード
   kanabun さん:提示の通りになりました。

流れが良く理解できました。
長々と時間を取り本当に有難うございました。
いろいろアレンジをしてコードを埋めてみます。
また質問が出るかもしれませんが、どうぞ宜しくお願いいたします。


新規にBookを追加し、そのSheet1 の3行目から
>以下の表を作成してください。
>
>>  A  B   C   D
>>1 
>>2  (空白行)
>>3 名前 番号 算数 国語
>>4 東京 1番   75  80
>>5 京都 2番   55  75
>>6 渡邉 15   85  100
>>7 大島  2   60  80
>
>
>つぎに、標準モジュールを挿入し、
>そこに 以下をコピペしてください。
>'---------------------------------- 標準モジュール
>Option Explicit
>Sub Test1()
> Dim S1 As String, S2 As String
> 
> S1 = "東京"
> S2 = "1番"
> With Sheet1.Range("A3").CurrentRegion
>   .Worksheet.AutoFilterMode = False
>   .AutoFilter 1, S1
>   .AutoFilter 2, S2
>   MsgBox "OK?"
>   .AutoFilter
> End With
>End Sub
>
>Sub Test2()
> Dim S1 As String, S2 As String
> 
> S1 = "京都"
> S2 = "2番"
> With Sheet1.Range("A3").CurrentRegion
>   .Worksheet.AutoFilterMode = False
>   .AutoFilter 1, S1
>   .AutoFilter 2, S2
>   MsgBox "OK?"
>   .AutoFilter
> End With
>End Sub
>
>Sub Test3()
> Dim S1 As String, S2 As String
> 
> S1 = "*京*"
> S2 = "*番"
> With Sheet1.Range("A3").CurrentRegion
>   .Worksheet.AutoFilterMode = False
>   .AutoFilter 1, S1
>   .AutoFilter 2, S2
>   MsgBox "OK?"
>   .AutoFilter
> End With
>End Sub
>
>コピーしたら、一応
>VBEメニューの[デバッグ]-[VBAプロジェクトのコンパイル]でコンパイルし、
>3つの Testプロシージャを実行してみてください。
>
>'▼Test1() を実行すると、
>名前    番号    算数    国語
>東京    1番    75    80
>となります。(ただし、MsgBoxで[OK]を押すと、フィルタは解除されますが)
>
>'▼Test2() を実行すると、
>名前    番号    算数    国語
>京都    2番    55    75
>となります。
>
>'▼Test3() を実行すると、
>名前    番号    算数    国語
>東京    1番    75    80
>京都    2番    55    75
>
>となります。
>
>
>そちらでも、そうなりますか?
>なりませんか?

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