
セルA7から下へ向かってデータが入っています。その数をセルA1に入れたいと思い、
「 Cells(1, 1) = Range("a7", Range("a7").End(xlDown)).Rows.Count 」
こんなマクロを書きました。出展は
「 http://park7.wakwak.com/~efc21/cgi-bin/exqaloung … 」です。
ここで、下記のようなデータを入れて試してみました。()内が期待する値で、[]内が実際の値です。
<テスト1> <テスト2> <テスト3> <テスト4> <テスト5>
セルA7 あああ あああ あああ
セルA8 いいい いいい いいい
セルA9 ううう
セルA10
セルA11 おおお
-----------------------------------------
期待する値 0 1 2 0 2
実際の値 65530 65530 2 2 2
と、このように期待する値が得られません。何が間違っているのでしょうか。
丸1日考えているのですが原因が分かりません。よろしくお願いします。
(文字幅がおかしくて見にくいと思いますがよろしくお願いします)
No.3ベストアンサー
- 回答日時:
こんにちは。
正しいとか間違っているというよりも、「期待する値」に、特別な法則を持っている、と思います。
Cells(1, 1) = Range("a7", Range("a7").End(xlDown)).Rows.Count
End プロパティは、値のあるセルを下に向かって探せ、ということです。だから、A7 から、その下を最後まで探して、その行数を出せ、ということでは、意味が違いますね。
質問者さんの直感なのでしょうか、「期待する値」の求め方は、関数タイプですね。「最初の空白行を探せ」ということですね。
関数なら、こうなります。
=MATCH(TRUE,INDEX(ISBLANK(A7:A100),,),0)-1
7行目より手前か、引数の範囲の外に数式を置いてください。循環参照になります。
もちろん、この数式をマクロに代入しても構いませんが、少し工夫が必要です。
以下のマクロと比較すると、上記の数式に軍配が上がりそうですね。Excelのワークシートはマクロよりも難しいですね。
'------------------------------------
Sub Test1()
Dim i As Integer
Dim ret As Long
Const col As Integer = 5
'書き出す行...15 行目
Cells(15, col).Resize(, 5).ClearContents
For i = 1 To col
ret = spBlankRow(Cells(7, i)) '7行目から
Cells(15, i).Value = ret - 7
Next
End Sub
Function spBlankRow(rng As Range) As Long
Dim r As Range
On Error Resume Next
Set r = Range(rng, Cells(Rows.Count, rng.Column)).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
spBlankRow = r.Cells.Cells(1).Row
End Function
ちょっと言い訳:
最初、ユーザー定義関数だけで作ろうと思いましたが、SpecialCells で範囲を認識させるには、コマンドに命令を与える信号が必要ですが、ユーザー定義だけでは、そのコマンドに命令が与えられないので、プロシージャ型になっています。
No.4
- 回答日時:
#3の回答者です。
「#1 のお礼」に対するレス
Range("A7").End(xlDown) というのは、
A7にカーソルを置いて、Ctrl + ↓ という結果と変わらないということです。
次の下のセルから、値の入っているセルを探しているわけです。
バグではないのですが、VBAをいつも使っている者からすると、ワークシートの仕様を映しているだけだとしか言いようがありません。VBA全体を体系的に、Office, Excel, VBAという三つに分かれます。その中で、Excel の仕様だけ、とって付けたような感じがしますし、その分、難しい問題が表れてきます。
しかし、そっくり同じだとは言えない部分も持っています。例えば、JIS関数やCODE関数が、VBAでは、そのまま使えません。
他にもいくつかありますが、今回の #3 の
範囲.SpecialCells(xlCellTypeBlanks)
も、この範囲を、同じ列の最後の行まで指定しても、
範囲.SpecialCells(xlCellTypeBlanks).Select
Select される範囲は、認識できる最後の行までなので、数行しかないことが分かるはずです。
解説ありがとうございます。
「Ctrl + ↓ という結果と変わらない」と言うことで、いろいろやってみました。
「値のあるセルを下に向かって探せ」というより、「値のないセルから値のあるセルに変わるセルを下に向かって探せ」という感じですね。電気回路で言うところの立ち上がりエッジを探すようなイメージですね。
解説を読んで意味がわかってきました。
私がバグではないかと思ったのは、いろいろ方法を探す中で、
「指定行から空白セルまでの行数を数えるには?」という質問に対する回答が「Range("A7", Range("A7").End(xlDown)).Rows.Count」だったり、
「xldownで探すと空白行で止まってしまうから、一番下からxlupで上に向かって探せ」
などの説明を読んでそれなりに納得していたからでした。
おかげさまですっきりしました。
また、「=MATCH(TRUE,INDEX(ISBLANK(A7:A100),,),0)-1」もすばらしいです。似たような所まで行ったのですができませんでした。
No.1
- 回答日時:
とりあえずベタに
Sub Macro2()
Dim idx As Long
For idx = 7 To 65536
If Cells(idx, "A").Value = "" Then
Cells(1, 1).Value = idx - 7
Exit For
End If
Next idx
End Sub
Range("A7").End(xlDown)では
7行目 ああああ
8行目 (空白)
9行目 いいいい
のときは9行目を示しますから使いにくいのではないでしょうか
回答ありがとうございます。
>のときは9行目を示しますから使いにくいのではないでしょうか
これですが、
7行目 ああああ
8行目 (空白)
9行目 いいいい
のときは「3」になります。この場合はご指摘の通り「Range("A7").End(xlDown)」が9行目を示しているのかもしれません。しかし、
7行目 ああああ
8行目 (空白)
9行目 いいいい
10行目 うううう
の時は10行目を示し、値は4になるような気がしますが、実際には値は3です。
さらに不思議なのは、
7行目 ああああ
8行目 いいいい
9行目 (空白)
10行目 うううう
とすると、値は2になります。
エクセルのバグのような気がしますがどうでしょう。
もしかするとエクセル2000だけの現象でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/26 13:19
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Visual Basic(VBA) Excelのマクロについて教えてください。 3 2022/06/30 09:36
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) Excleマクロ セル値の代入と文字列の結合について 3 2022/10/05 16:47
- Excel(エクセル) Excel VBAで、行の高さを、上下1文字分程度高くしたい 3 2023/04/23 00:17
- Excel(エクセル) エクセルの昇順での数値入力のミスの見つけ方を教えてください。 4 2022/06/26 20:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
値が入っているときだけ計算結...
-
尿検査前日に自慰行為した時の...
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
-
彼女のことが好きすぎて彼女の...
-
検便についてです。 便は取れた...
-
至急!尿検査前日にオナニーし...
-
excelでsin二乗のやり方を教え...
-
【Excelで「正弦波」のグラフを...
-
EXCELで条件付き書式で空白セル...
-
VLOOKUP関数を使用時、検索する...
-
2つの数値のうち、数値が小さい...
-
MIN関数で空白セルを無視したい...
-
Excel 0目標に対して数字があ...
-
EXCELで式からグラフを描くには?
-
尿検査の前日は自慰控えたほう...
-
Excel条件付書式(残業45時間以...
-
精子に血が・・・
-
エクセルで空白セルを含む列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
至急!尿検査前日にオナニーし...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
MIN関数で空白セルを無視したい...
-
小数点以下を繰り上げたものを...
-
風俗店へ行く前のご飯
-
エクセルで空白セルを含む列の...
-
Excel 数値の前の「 ' 」を一括...
-
【Excelで「正弦波」のグラフを...
-
納豆食べた後の尿の納豆臭は何故?
-
EXCELで式からグラフを描くには?
-
ある範囲のセルから任意の値を...
おすすめ情報