Excel VBA質問箱 IV

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

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


7893 / 13644 ツリー ←次へ | 前へ→

【36199】setステートメントのエラー 仕事で無理矢理orz 06/3/24(金) 12:04 質問[未読]
【36200】Re:setステートメントのエラー やっちん 06/3/24(金) 12:34 発言[未読]
【36202】Re:setステートメントのエラー 仕事で無理矢理orz 06/3/24(金) 12:52 質問[未読]
【36203】Re:setステートメントのエラー やっちん 06/3/24(金) 12:59 発言[未読]
【36204】Re:setステートメントのエラー やっちん 06/3/24(金) 13:04 発言[未読]
【36205】Re:setステートメントのエラー 仕事で無理矢理orz 06/3/24(金) 13:15 質問[未読]
【36207】Re:setステートメントのエラー やっちん 06/3/24(金) 13:29 発言[未読]
【36208】Re:setステートメントのエラー Kein 06/3/24(金) 13:30 発言[未読]
【36214】Re:setステートメントのエラー 仕事で無理矢理orz 06/3/24(金) 15:51 発言[未読]
【36216】Re:setステートメントのエラー 仕事で無理矢理orz 06/3/24(金) 17:47 質問[未読]
【36217】Re:setステートメントのエラー awu 06/3/24(金) 19:17 回答[未読]

【36199】setステートメントのエラー
質問  仕事で無理矢理orz  - 06/3/24(金) 12:04 -

引用なし
パスワード
   Sub 検索集計()
 Set wh1 = ThisWorkbook.Worksheets("sheet1")
 Set wh2 = ThisWorkbook.Worksheets("sheet2")
 Set dayrg = wh2.Range(Cells(21, "B"), Cells(21, "B").End(xlDown))

上記のコードでsheet2を表示している状態でマクロを実行すれば問題ないのですが、それ以外のシートからマクロを実行するとset dayrgの部分でエラーがでてしまいます。
setステートメントでrangeを代入するときは対象範囲があるシートがアクティブでないとだめなのでしょうか?
素人質問ですいませんがよろしくお願いします。

【36200】Re:setステートメントのエラー
発言  やっちん  - 06/3/24(金) 12:34 -

引用なし
パスワード
   ▼仕事で無理矢理orz さん:
こんにちは。
一度ははまる落とし穴です。
Rangeの中のCellsにもシートの指定が必要です。
> Set dayrg = wh2.Range(Cells(21, "B"), Cells(21, "B").End(xlDown))
 Set dayrg = wh2.Range(wh2.Cells(21, "B"), wh2.Cells(21, "B").End(xlDown))

【36202】Re:setステートメントのエラー
質問  仕事で無理矢理orz  - 06/3/24(金) 12:52 -

引用なし
パスワード
   >こんにちは。
>一度ははまる落とし穴です。
>Rangeの中のCellsにもシートの指定が必要です。
>> Set dayrg = wh2.Range(Cells(21, "B"), Cells(21, "B").End(xlDown))
>  Set dayrg = wh2.Range(wh2.Cells(21, "B"), wh2.Cells(21, "B").End(xlDown))

>やっちんさん
即答ありがとうございました。ばっちり解決しました!!!
これは気づきませんでした・・・orz

そして早速次の箇所で詰まってます><

  For Each rg In dayrg
   If rg.Value >= month Then
    If rg.Value <= DateAdd("m", 1, month) - 1 Then
     total = total + rg.Offset(0, 2).Value
    End If
   End If
  Next rg

dayrgで指定した範囲を検索して値を集計していくという部分なのですが、
offset(0,3)の場合のみ集計ではなく最後に一致した行の値を取得したいんです。
この検索方法では最後若しくは最初(●番目)にhitしたところからオフセットして値を取得は可能でしょうか?
初心者なので質問がこれでいいのかすら怪しいですがよろしくお願いいたします。。。

【36203】Re:setステートメントのエラー
発言  やっちん  - 06/3/24(金) 12:59 -

引用なし
パスワード
   ▼仕事で無理矢理orz さん:
>offset(0,3)の場合のみ集計ではなく最後に一致した行の値を取得したいんです。
>この検索方法では最後若しくは最初(●番目)にhitしたところからオフセットして値を取得は可能でしょうか?
>初心者なので質問がこれでいいのかすら怪しいですがよろしくお願いいたします。。。
変数を別に用意して
集計をしているタイミングでセットするとできるのではないでしょうか?
最後の値が必要なら上記の方法でできます。
最初の値が必要なら、セットされていない場合のみセットするようにすれば
最初の値を保持できます。

【36204】Re:setステートメントのエラー
発言  やっちん  - 06/3/24(金) 13:04 -

引用なし
パスワード
   >>この検索方法では最後若しくは最初(●番目)にhitしたところから
集計をしているタイミングでカウントアップしていけば
何番目にHitしたかはわかります。

【36205】Re:setステートメントのエラー
質問  仕事で無理矢理orz  - 06/3/24(金) 13:15 -

引用なし
パスワード
   たびたびありがとうございます。●rz

for each〜nextステートメントにカウントアップをつけることができるんですか!?!?!?!?!?

for each rg in dayrg
 for i * to **
 〜〜〜〜〜〜〜
 next i
next rg

こんな感じでしょうか?・・・・自信がありませんorz

【36207】Re:setステートメントのエラー
発言  やっちん  - 06/3/24(金) 13:29 -

引用なし
パスワード
   ▼仕事で無理矢理orz さん:
 total = total + rg.Offset(0, 2).Value
上のところで条件にあったものの集計が行われていますよね?
この下に例えば
cnt=cnt+1
とするとその時点で何番目に条件にHitしたかがわかります。

3番目に条件にHitしたところの値がほしい場合
cnt=cnt+1
if cnt = 3 then
  wk = rg.Offset(0, 3).Value
endif

【36208】Re:setステートメントのエラー
発言  Kein  - 06/3/24(金) 13:30 -

引用なし
パスワード
   >for each〜nextステートメントにカウントアップをつけることができるんですか
カウンタ変数を「別に」用意しておけば出来ます。それより↓のコードの意味は
何でしょーか ? 理路整然と説明できますか ?

>If rg.Value >= month Then
>  If rg.Value <= DateAdd("m", 1, month) - 1 Then

例えばMonth関数は、引数にDate型の値を渡さないと戻り値が得られませんが・・。

【36214】Re:setステートメントのエラー
発言  仕事で無理矢理orz  - 06/3/24(金) 15:51 -

引用なし
パスワード
   >>for each〜nextステートメントにカウントアップをつけることができるんですか
>カウンタ変数を「別に」用意しておけば出来ます。それより↓のコードの意味は
>何でしょーか ? 理路整然と説明できますか ?
>
>>If rg.Value >= month Then
>>  If rg.Value <= DateAdd("m", 1, month) - 1 Then
>
>例えばMonth関数は、引数にDate型の値を渡さないと戻り値が得られませんが・・。

やっちんさん
度々丁寧な解答をありがとうございます。
cntをつかってやってみます。

keinさん
紛らわしくて申し訳ないのですが、monthは関数ではなくてdateで宣言した変数です・・・。
monthには常に月初のが来るようにしているのでdateadd〜の部分で月末を指定し、その月内に日付があるものを探すように作っています。
うまく説明ができなくて申し訳ありませんorz

【36216】Re:setステートメントのエラー
質問  仕事で無理矢理orz  - 06/3/24(金) 17:47 -

引用なし
パスワード
   度々すみません。

 Set wb = Workbooks("期間集計試作.xls")
 Set dbwb = Workbooks("DB.xls")
 Set ws1 = wb.Worksheets("集計シート")
 Set dbws = dbwb.Worksheets   'dbwbの全シートを格納

これを実行すると4行目で"型が一致しません"というエラーがでてしまいます・・・。
どこが間違いかすらわからなくてorz
どなたかお願いします><

【36217】Re:setステートメントのエラー
回答  awu  - 06/3/24(金) 19:17 -

引用なし
パスワード
   > Set dbws = dbwb.Worksheets   'dbwbの全シートを格納

変数 dbws を Worksheet に宣言していませんか?

dbwbの全シートを格納   なら

Dim dbws As Object としてみてください。

dbwbブックの各シートが、オブシェクトの配列変数に格納されます。

dbws(1) ----> Sheet1 とか


それから

> monthは関数ではなくてdateで宣言した変数です・・・。

関数名として予約されている名称なので、変数として使用すべきではないと思いますよ。

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