Excel VBA質問箱 IV

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

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


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

【10564】オートフィルター後の選択範囲の取得 rika 04/2/2(月) 11:53 質問
【10565】Re:オートフィルター後の選択範囲の取得 INA 04/2/2(月) 11:56 回答
【10567】Re:オートフィルター後の選択範囲の取得 Jaka 04/2/2(月) 12:26 回答
【10568】Re:オートフィルター後の選択範囲の取得 ichinose 04/2/2(月) 12:48 発言
【10571】Re:オートフィルター後の選択範囲の取得 rika 04/2/2(月) 14:33 お礼

【10564】オートフィルター後の選択範囲の取得
質問  rika  - 04/2/2(月) 11:53 -

引用なし
パスワード
   はじめまして。rikaと申します。いつも勉強させていただいています。
すでに過去レスにありましたらお許しください。(検索してみたのですが、見つからなくて・・・)

オートフィルターにて抽出後、マウスで選択してもらってその範囲をVBAにて
取得しようと思い下記コードを書いているのですが、1つだけ選択したときに
うまく動作してくれません。2つ以上選択したときはうまくいきます。
すみませんが、どこが悪いのか教えていただければありがたいのですが・・・。
環境は、Win2000,WinXP Excel2000です。


  'エリア数を数える
  cnt = Selection.SpecialCells(xlCellTypeVisible).Areas.Count

  '### ↑このときに1つだけ選択したらcnt=6とか入ってしまいます。

  i = 0
  
  'エリア数分、まわす
  Do
    '何行分選択されているか
    cnt2 = Selection.SpecialCells(xlCellTypeVisible).Areas(cnt - i).Rows.Count
      
    '何行目を選択されているか
    Rowcnt = Selection.SpecialCells(xlCellTypeVisible).Areas(cnt - i).Row
    Colcnt = Selection.SpecialCells(xlCellTypeVisible).Areas(cnt - i).Column

    i = i + 1
  Loop Until i >= cnt

わかりにくい質問で恐縮ですが、どうぞよろしくお願いします。

【10565】Re:オートフィルター後の選択範囲の取得
回答  INA  - 04/2/2(月) 11:56 -

引用なし
パスワード
   実際、どんな目的で使用するコードなのでしょうか?

for each 〜 next で Areas は使いますが、
たいていはCells.countしたりしてますもので・・・

【10567】Re:オートフィルター後の選択範囲の取得
回答  Jaka  - 04/2/2(月) 12:26 -

引用なし
パスワード
   良く解っていませんけど...。
こう言うことなのかなぁ?
A列をオートフィルタした後の場合。

'可視セルの1つづつのアドレス
Sub aaaaa()
  Dim rang As Range, cel As Range, adt() As Range
  er = Range("A65536").End(xlUp).Row
  MsgBox "可視セル最後の行、ERow=" & er

  Set rang = Range("A2:A" & er).SpecialCells(xlCellTypeVisible)
  MsgBox "可視セル行、CountA=" & Application.CountA(rang)
  For Each cel In Range("A2:A" & er).SpecialCells(xlCellTypeVisible)
    i = i + 1
    ReDim Preserve adt(1 To i)
    Set adt(i) = cel
    tt = cel.Address
    pp0 = 0
  Next
  MsgBox UBound(adt) & "行の可視セル(UBound)"
  For i = 1 To UBound(adt)
    MsgBox adt(i).Address
  Next
  Erase adt
  End
End Sub

【10568】Re:オートフィルター後の選択範囲の取得
発言  ichinose  - 04/2/2(月) 12:48 -

引用なし
パスワード
   rika さん、INAさん、Jakaさん、こんにちは。

>はじめまして。rikaと申します。いつも勉強させていただいています。
>すでに過去レスにありましたらお許しください。(検索してみたのですが、見つからなくて・・・)
>
>オートフィルターにて抽出後、マウスで選択してもらってその範囲をVBAにて
>取得しようと思い下記コードを書いているのですが、1つだけ選択したときに
>うまく動作してくれません。2つ以上選択したときはうまくいきます。
>すみませんが、どこが悪いのか教えていただければありがたいのですが・・・。
>環境は、Win2000,WinXP Excel2000です。
>
>
>  'エリア数を数える
>  cnt = Selection.SpecialCells(xlCellTypeVisible).Areas.Count
>
>  '### ↑このときに1つだけ選択したらcnt=6とか入ってしまいます。
例えば、Range("a1").SpecialCells(xlCellTypeVisible).Areas.Count
みたいな場合ですよね?

   ↑これ、Cells.SpecialCells(xlCellTypeVisible).Areas.Count
   と指定したときとほぼ同じになってしまいますよね?

ということは、

Selection.Countの値を見て、1の時とそうでないときの処理を分けなければ
ならないと思いますよ。

手動操作でも同じように単一セルの選択で「ジャンプ」---「セル選択」---「可視セル」
をおこなうと、非表示セルがないときは、単一セルを返しますが、
非表示セルが存在する場合は、シート全体から抽出してしまいます。

【10571】Re:オートフィルター後の選択範囲の取得
お礼  rika  - 04/2/2(月) 14:33 -

引用なし
パスワード
   INA様、Jaka様、ichinose様、早速のお返事ありがとうございます。

ichinose様のアドバイス通り、Selection.Countの値を見て、1の時とそうでないときの処理を分けると、うまくいきました。困っていたので助かりました。
本当にありがとうございます。

INA様、Jaka様、説明不足で申し訳ありません。いまさらですが、説明させてください。
これは、あるデータが複数あり、通常のオートフィルタにてデータを絞り込んでもらい、その中からさらに見たいデータをマウスにて選んでもらい、表示ボタンでその情報をグラフ化したりして表示するというものでした。

オートフィルタにて抽出したときに、例えば、下記のようなデータを、500で抽出すると、
1. 100     3. 500
2. 300 抽出後 4. 500
3. 500  →  6. 500
4. 500     8. 500
5. 100
6. 500
7. 100
8. 500
となります。ここで、その全てを選択してもらった場合、Selection.SpecialCells(xlCellTypeVisible).Areas.Countを使うと3が返ってきます。
でも、今度は6のみを選択してSelection.SpecialCells(xlCellTypeVisible).Areas.Countを使うと
1ではなく、6とか10とかという値が返ってきてしまい、みなさまにご質問させていただきました。
説明が悪くて本当にすみませんでした。次回からはもう少し具体例をあげて
質問します。(「またするんかい」ってつっこまないで・・・汗)

で、ichinose様のアドバイス通り、Selection.Countの値を見て、1の時とそうでない時と分けるようにして、解決しました。

みなさまありがとうございました。

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