Excel VBA質問箱 IV

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

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


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

【69940】オートフィルタがおかしい かかこ 11/9/26(月) 15:22 質問[未読]
【69941】Re:オートフィルタがおかしい かかこ 11/9/26(月) 16:27 質問[未読]
【69942】Re:オートフィルタがおかしい UO3 11/9/26(月) 16:47 発言[未読]
【69944】Re:オートフィルタがおかしい かかこ 11/9/27(火) 10:03 お礼[未読]
【69945】Re:オートフィルタがおかしい UO3 11/9/27(火) 11:24 発言[未読]
【69949】Re:オートフィルタがおかしい かかこ 11/9/27(火) 19:52 お礼[未読]
【69946】Re:オートフィルタがおかしい Jaka 11/9/27(火) 14:31 発言[未読]
【69950】Re:オートフィルタがおかしい かかこ 11/9/27(火) 19:56 お礼[未読]
【69961】Re:オートフィルタがおかしい かかこ 11/9/28(水) 23:22 お礼[未読]

【69940】オートフィルタがおかしい
質問  かかこ  - 11/9/26(月) 15:22 -

引用なし
パスワード
   こんにちは、よろしくお願いします

A1:BN235にデータの入った表があります。
A1でオートフィルタを掛けて
下記のようなコードを動かすと、変なところが選択されます。

Sub sample15()
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible). _
  SpecialCells(xlCellTypeLastCell).Select
End Sub

不可解のは、このコードは今までちゃんと動いていたことです。
今まではちゃんと235行目を選択してくれました。
(上記は簡略化して書きましたが実際は一番下の行を選ぶという下記コードを書いています)

lastcell = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeLastCell).Row

ところが、今日動かすと241行目が選択されます。列もなんの関係もない列BVが選択されています。
その場所になにもデータは入っていません。
念のため表の右側と下側を削除してもう一度やってみるとやはりダメでした。

そして再起動して再度動かすと今度はなんと236行目が選択されやるたびにまちまちです。(列は相変わらずBV)
そして、オートフィルタを良く見ると、BNの列までしか表がないのに何も関係のないBV列まで下向けの矢印が出来ています。(やり直してもだめ)

どうしてこんな風になるのでしょうか?今まで大丈夫だったのでなぞです。
わかるかたよろしくお願いします。

【69941】Re:オートフィルタがおかしい
質問  かかこ  - 11/9/26(月) 16:27 -

引用なし
パスワード
   何度もすみません

とりあえず列は関係ないので下記コードを書いて試しにやってみました

Sub sample15()
  MyValue = ActiveSheet.AutoFilter.Range.Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1). _
   Offset(1).Columns(7).SpecialCells(xlCellTypeVisible).Cells(1).Row
  lastcell = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible). _
  SpecialCells(xlCellTypeLastCell).Row

MsgBox MyValue
MsgBox lastcell
End Sub

開始行MyValueは何ら問題ありませんが、
最後の行lastcellは236行目を選んでしまいます
何行目のデータでフィルタをかけてもlastcellは236目になります。
例えばオートフィルタで100行目のデータを抽出したあとこのコードを走らせると
Myvalue = 100
lastcell = 236
となり、データが137件もあることになってしまうのです。
今までちゃんと動いていたのに・・・不安定なコードなんでしょうか?

【69942】Re:オートフィルタがおかしい
発言  UO3  - 11/9/26(月) 16:47 -

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

こんにちは
実際のシートが、こちらではチェックできないので想像です。

・まず、SpecialCells の xlCellTypeLastCell は、結構、「まぎれ」がある
 扱いがやっかいなしろものです。たとえば、どこかのセルが LastCell だったとして
 その後、そのセルをクリアしたり、その列を削除したり、その行を削除したりしても
 いったん認識されたセルが、ずっと LastCell になってしまい、保存なり、閉じて
 再読込なりをしないと正しい「LastCell」は取得できない場合があります。

・ただ、空白の列なのにオートフィルターの矢印がでているということですから
 上記の問題ではなく、空白に見える何かが入っているような気がします。
 (スペースとか)
 現在のリストを全て選択した上で、編集->ジャンプ->セル で 空白 を選んで
 実行してみてください。空白に見えても空白じゃないセルは選択されません。

・もう1つ。
 構文を拝見すると、セル領域.SpecialCells(xlCellTypeLastCell) と記述されています。
 このセル領域の「中で」最後のセルというつもりでしょうか?
 これはできません。(できれば便利ですが)
 どんなセル領域を与えようが、「そのシート上」の使用済みLastCell が取得されます。

【69944】Re:オートフィルタがおかしい
お礼  かかこ  - 11/9/27(火) 10:03 -

引用なし
パスワード
   ▼UO3 さん:
こんにちは、早速のご回答ありがとうございます、

>・まず、SpecialCells の xlCellTypeLastCell は、結構、「まぎれ」がある
> 扱いがやっかいなしろものです。

確かにこのシートは何度も行や列を削除したりしています。ただ最近は落ち着いて
(表のレイアウトが出来上がっていて)していなかったです。

>・ただ、空白の列なのにオートフィルターの矢印がでているということですから
> 上記の問題ではなく、空白に見える何かが入っているような気がします。
> (スペースとか)
> 現在のリストを全て選択した上で、編集->ジャンプ->セル で 空白 を選んで
> 実行してみてください。空白に見えても空白じゃないセルは選択されません。

やってみました。オートフィルタをかけて空白行なのに下向き矢印が出るところが一部だけ選択されます。
これはもしかしたら選択されてないところに何か入ってるかもしれないという
ことですね。調べてみます。

>・もう1つ。
> 構文を拝見すると、セル領域.SpecialCells(xlCellTypeLastCell) と記述されています。
> このセル領域の「中で」最後のセルというつもりでしょうか?
> これはできません。(できれば便利ですが)
> どんなセル領域を与えようが、「そのシート上」の使用済みLastCell が取得されます。

そうなんですか・・・ですがなぜか今までは可視セルの最終行がちゃんと選ばれてました。なぜでしょう。

【69945】Re:オートフィルタがおかしい
発言  UO3  - 11/9/27(火) 11:24 -

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

>そうなんですか・・・ですがなぜか今までは可視セルの最終行がちゃんと選ばれてました。なぜでしょう。

言葉が足りませんでした。
LastCellは、もちろん 可視セルの最後のセルを見つけます。
申し上げたかったことは、指定した領域内での最終セルではないですよということです。

新規ブックに以下を貼り付けて実行してみてください。

Sub Test()
  Dim i As Long, j As Long
  'まずA1〜J10 まで値をいれる
  For i = 1 To 10
    For j = 1 To 10
      Cells(i, j).Value = "X" & i & "-" & j
    Next
  Next
  
  'L20 に値をいれる
  Range("L20").Value = "XYZ"
  'A1:J10の領域内であれば J10 が最後のセルのはず
  MsgBox Range("A1:J10").SpecialCells(xlCellTypeLastCell).Address
  'さらに極端に
  MsgBox Range("A1").SpecialCells(xlCellTypeLastCell).Address
  
End Sub

【69946】Re:オートフィルタがおかしい
発言  Jaka  - 11/9/27(火) 14:31 -

引用なし
パスワード
   いまいち詳細がわかってないけど、
例えば、B列を「い」で抽出したさいに B15 を選択したいという事なんでしょうかね?

   A  B   C
5  あ  い  う
10 空  い  え
15 あ  い  空


単純に最後の行を知りたいのなら、こういう風にした方が。
SpecialCells(xlCellTypeLastCell)は、使用状況によって挙動が一定でないので普段は使わないですね。

オートフィルタ時最初と最後の行
    
With Sheets("Sheet1").AutoFilter.Range
  With .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
    一番目 = .Cells(1).Row
    With .Areas(.Areas.Count)
     最後 = .Cells(.Count).Row
    End With
  End With
End With
MsgBox "一番目 " & 一番目 & "行" & vbLf & _
    "最後行 " & 最後 & "行"

【69949】Re:オートフィルタがおかしい
お礼  かかこ  - 11/9/27(火) 19:52 -

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

ありがとうございます。
教えていただいたコード動かしてみました。
やっと、意味がわかりました。そういうことだったのですか。

私のシートも何かのデータがどこかに入っていてそこがLastCellと認識されてる
んですね。
原因はわかりませんが、ブックを立ち上げるたびにLastCellの位置が変わります。
今まで大丈夫だったのが不思議なくらいです。
まあおかげで今までの私のコードがだめということがわかりましたので
よかったです。
今作りしております。また報告いたします。

【69950】Re:オートフィルタがおかしい
お礼  かかこ  - 11/9/27(火) 19:56 -

引用なし
パスワード
   ▼Jaka さん:
ご回答ありがとうございます。

>いまいち詳細がわかってないけど、
>例えば、B列を「い」で抽出したさいに B15 を選択したいという事なんでしょうかね?
>
>   A  B   C
>5  あ  い  う
>10 空  い  え
>15 あ  い  空

そうです、そうです。やりたいのは、最初の行と最後の行を取得して、
for Next で順番に処理をしていく、ということです。

行番号ではなく行数を取得して、最初の行にその行数をたして1引いて
とかいろいろ試してましたが、うまくいかないので困っていました。

ご教示いただいたコードで早速試してみます。助かります。ありがとうございました。

【69961】Re:オートフィルタがおかしい
お礼  かかこ  - 11/9/28(水) 23:22 -

引用なし
パスワード
   ▼UO3さん、Jaka さん
ありがとうございました。
うまくいきました。勉強させていただいて感謝します。
また何かあったらお邪魔すると思いますが、
そのときはよろしくお願いします。

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