Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2007)
ある文字を除いた最終行の取得方法
投稿日時: 18/12/26 17:54:36
投稿者: FILETUBE

こんばんは。
1つ教えて下さい。
 
B列を使用して最終行を取得したいのです。
7行目から明細が始まり、入力していきます。
未入力の場合は空白です。
 
但し518行目が合計行とし、B列には合計の文字が入力されています。
 
vLstsk = wkssk.Range("B" & Rows.Count).End(xlUp).Row
vLstsk = wkssk.Range("B1").SpecialCells(xlLastCell).Row
 
で最終行を取得しますと518となってしまいます。
明細行が510行を超えた場合、明細行を挿入し合計行は下の方にずらします。
 
例えば700とか1000に。
 
最終行から見て合計の文字以外の入力最終行はどのようにして
取得するのでしょうか?
 
分かる方おられましたら、教えて頂けないでしょうか。
宜しくお願いします。

回答
投稿日時: 18/12/26 18:22:39
投稿者: WinArrow
投稿者のウェブサイトに移動

ヒント
 
Sub test()
Dim 行1 As Long, 行2 As Long
 
    行1 = Range("A" & Rows.Count).End(xlUp).Row
    Debug.Print 行1
    行2 = Range("A" & 行1).End(xlUp).Row
    Debug.Print 行2
End Sub

回答
投稿日時: 18/12/26 18:26:42
投稿者: WinArrow
投稿者のウェブサイトに移動

↑は、考え方のヒントです。
データ行と合計行の間には、空白行が存在するという前提です。
 
データ行と合計行の間には、空白行が存在しないこともある
ならば、それなりの判断が必要です。
また、最終行が「合計」でない可能性もあるならば、
条件を追加してください。

回答
投稿日時: 18/12/26 18:31:01
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
最初から合計行を用意しておく
ことには、あまり感心しません。
入力処理に最後に「合計行」を作成する。
再入力の際、「合計行」があるならば、削除する。
このような対応の方が、500件以上は,
空白行を挿入するなど・・・・余計なことを考えなくてもよいです。

投稿日時: 18/12/26 19:49:56
投稿者: FILETUBE

回答ありがとうございます。
 
Range("A" & Rows.Count).End(xlUp).Rowが517で
Range("A" & 行1).End(xlUp).Rowが8になります。
 
申し訳ありません
ここから大小の比較?引き算でもするのでしょうか?

回答
投稿日時: 18/12/26 20:21:24
投稿者: simple

> vLstsk = wkssk.Range("B" & Rows.Count).End(xlUp).Row
> vLstsk = wkssk.Range("B1").SpecialCells(xlLastCell).Row
> で最終行を取得しますと518となってしまいます。

   
  なってしまいます、というかそれは自然な結果ですよね。
  最終行から上にジャンプした位置ですから。
 
> 最終行から見て合計の文字以外の入力最終行はどのようにして
> 取得するのでしょうか?

 最終行が求まったら、それから上に1つずつ、
 合計以外の文字があるかどうか調べていけばよいのではないですか?
  繰り返し処理(Do Loopなり、For .. Nextなり)をするなかで、
  簡単に調べられると思いますが。
  つまり、
    @ "合計"文字を含まない。
  かつA ""ではない
  の条件で判定すればよいでしょう。

回答
投稿日時: 18/12/26 21:01:46
投稿者: WinArrow
投稿者のウェブサイトに移動

「合計行」と「データ行」の間が空白行であることが前提です。
 
空白に見えているセルに、数式が入っていませんか?

投稿日時: 18/12/26 21:28:44
投稿者: FILETUBE

回答ありがとうございます。
確かに他に手段がなければ
Loopして取得するしかないと思います。
 
空白の判断のセルは日付の入力項目ですので月日表示の
セルの書式設定しかしていません。
最終行の項目は必ず「合計」となります。
 
WinArrowさんのヒントで何が見えてくるのでしょうか?

回答
投稿日時: 18/12/26 21:44:00
投稿者: WinArrow
投稿者のウェブサイトに移動

FILETUBE さんの引用:
回答ありがとうございます。
 
Range("A" & Rows.Count).End(xlUp).Rowが517で
Range("A" & 行1).End(xlUp).Rowが8になります。
 
申し訳ありません
ここから大小の比較?引き算でもするのでしょうか?

行1の値が「517」で、
行2の値が「8」
ということですか?
どうも「行1」の値がおかしいと思いますが・・・・

投稿日時: 18/12/26 22:49:02
投稿者: FILETUBE

何度もありがとうございます。
別のブックで検証したいと思いますが
実際はいくつになるべきなのでしょうか。

回答
投稿日時: 18/12/26 23:28:31
投稿者: WinArrow
投稿者のウェブサイトに移動

テストデータです
 
新しいブックを作成してください
A列に表示形式:mm/ddを設定してください
A列 1行目〜10行目まで、日付(適当で結構)を入力してください。
セルA20に"合計"を入力してください。
 
VBE画面で標準モジュールに
Sub test()
 Dim 行1 As Long, 行2 As Long
   
     行1 = Range("A" & Rows.Count).End(xlUp).Row
     Debug.Print 行1
     行2 = Range("A" & 行1).End(xlUp).Row
     Debug.Print 行2
End Sub
 
 
testを実行してください。
行1と行2の値がイミディトウィンドウに表示されます。
行1が20
行2が10
と表示されればOK
 
シートの設定内容が、上記と異なるところを探して見てください。
どこか説明不足の箇所がないでしょうか?

投稿日時: 18/12/27 03:23:05
投稿者: FILETUBE

WinArrowさん、大変丁寧な回答ありがとうございました。
早速、試してみます。

投稿日時: 18/12/27 13:09:17
投稿者: FILETUBE

WinArrowさん、試してみました。
 
確かに20と10と表示され
10の値が取得できます。
 
見た目は空白なのですが、何かが入ってるって事でしょうか。
 
 

投稿日時: 18/12/27 13:30:40
投稿者: FILETUBE

WinArrowさん、何度も大変丁寧な回答ありがとうございました。
 
すいません、行位置は取得できました。
 
今回 End(xlup)の使い方、大変参考になりました。
 
また宜しくお願いします。