Excel VBA質問箱 IV

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

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


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

【51121】LOOPについて すず 07/8/29(水) 5:47 質問[未読]
【51125】Re:LOOPについて Loopくん 07/8/29(水) 9:38 発言[未読]
【51145】Re:LOOPについて すず 07/8/29(水) 22:51 回答[未読]
【51149】Re:LOOPについて Loopくん 07/8/30(木) 8:20 発言[未読]
【51171】Re:LOOPについて すず 07/8/31(金) 22:05 お礼[未読]
【51134】Re:LOOPについて ハチ 07/8/29(水) 13:58 発言[未読]

【51121】LOOPについて
質問  すず  - 07/8/29(水) 5:47 -

引用なし
パスワード
   はじめまして。

今EXCELで8行目から299行目まで、
すべて他のシートを参照して計算して反映する、
というVBAを組もうとしているのですが、
全部の行に対して、
Dim ws1 As Worksheet, ws2 As Worksheet, Rmax As Long,
  Set ws1 = ThisWorkbook.Worksheets("Sheet1")
  Set ws2 = ThisWorkbook.Worksheets("Sheet2")
  Rmax = ws2.Range("D65536").End(xlUp).Row
  ws1.Range("I8").Value = Application.WorksheetFunction.SumIf _
     (ws2.Range("D1:D" & Rmax), ws1.Range("F8").Value, ws2.Range("G1:G" & Rmax))
と置いていたら重過ぎて強制終了が掛かってしまいました。
何回立ち上げても強制終了が掛かりましたので、
重すぎるのだと思ったのですが。

これを「Sheet1のF列目が空になったら検索・反映をやめる」
といったようなものにスッキリ変換できないでしょうか?
"LOOP"というものでできますか?

しかし、
Dim ws1 As Worksheet, ws2 As Worksheet, Rmax As Long, i As Long
  Set ws1 = ThisWorkbook.Worksheets("Sheet1")
  Set ws2 = ThisWorkbook.Worksheets("Sheet2")
  Rmax = ws2.Range("D65536").End(xlUp).Row
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    MyStr = Range("F" & i)
    If MyStr <> "" Then
  ws1.Range("I8").Value = Application.WorksheetFunction.SumIf _
     (ws2.Range("D1:D" & Rmax), ws1.Range("F8").Value, ws2.Range("G1:G" & Rmax))
    End If
  Next i
と書きましたら、「インデックスが有効範囲にありません」と出てしまいました。
何故なのでしょうか?

教えてください!

【51125】Re:LOOPについて
発言  Loopくん  - 07/8/29(水) 9:38 -

引用なし
パスワード
   提示のコードで試したところコード自体問題はなかったですが・・・
どこで引っかかるのでしょうか?
ただ,
>  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
>    MyStr = Range("F" & i)
とA列の最終行を取得させてその回数分,F列の値を取得しているのに
>  ws1.Range("I8").Value = Application.WorksheetFunction.SumIf _
>     (ws2.Range("D1:D" & Rmax), ws1.Range("F8").Value, ws2.Range("G1:G" & Rmax))
でF8だけを検索条件にしているのはなぜでしょう?
結果も常にI8に出すようですし,ループの意味がないような気がしますが・・・

【51134】Re:LOOPについて
発言  ハチ  - 07/8/29(水) 13:58 -

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

>これを「Sheet1のF列目が空になったら検索・反映をやめる」
>といったようなものにスッキリ変換できないでしょうか?
>"LOOP"というものでできますか?

ここだけをコード化すると Do Until 〜 Loop では?
For Nextのほうがわかるなら、最終行を取得してLoopですね。

'例)A列が空白になるまで実行
Sub Test()
  Dim i As Long
  i = 1
  With ActiveSheet
    Do Until .Cells(i, 1).Value = ""
      .Cells(i, 1).Select  'テストでSelectしてみる
      MsgBox "実行"
      i = i + 1
    Loop
  End With
End Sub

【51145】Re:LOOPについて
回答  すず  - 07/8/29(水) 22:51 -

引用なし
パスワード
   >Loop さん
>ただ,
>>  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
>>    MyStr = Range("F" & i)
>とA列の最終行を取得させてその回数分,F列の値を取得しているのに
>>  ws1.Range("I8").Value = Application.WorksheetFunction.SumIf _
>>     (ws2.Range("D1:D" & Rmax), ws1.Range("F8").Value, ws2.Range("G1:G" & Rmax))
>でF8だけを検索条件にしているのはなぜでしょう?
>結果も常にI8に出すようですし,ループの意味がないような気がしますが・・・

ごめんなさい、コマンドの書き方が分からなかったのです。

このように
"Sheet1"の"F8"を見て、同じ物を"Sheet2"の"D列"から探しだし、
その値を"Sheet2"の"G列"から拾う、ということをしたかったのです。
同じように、次は"Sheet1"の"F9"を見て、次は"F10"を見て、というように。
これを1つ1つではなく、LOOPで何か上手いこといかないか、と。

【51149】Re:LOOPについて
発言  Loopくん  - 07/8/30(木) 8:20 -

引用なし
パスワード
   ▼すず さん:
>その値を"Sheet2"の"G列"から拾う
拾うで SUMIF なの?という疑問はありますが・・・
結果を I8, I9, I10 と次々に出すとして,

  Dim ws1 As Worksheet, ws2 As Worksheet, Rmax As Long, i As Long
  Set ws1 = ThisWorkbook.Worksheets("Sheet1")
  Set ws2 = ThisWorkbook.Worksheets("Sheet2")
  Rmax = ws2.Range("D65536").End(xlUp).Row
  i = 8
  Do Until ws1.Range("F" & i) = ""
    ws1.Range("I" & i) = Application.WorksheetFunction. _
      SumIf(ws2.Range("D1:D" & Rmax), ws1.Range("F" & i), ws2.Range("G1:G" & Rmax))
    i = i + 1
  Loop

こういうことですか?
あえて,Do Until 〜 Loop にしましたが,For Next でもできますよ!
勉強になりますので作成してみては・・・

【51171】Re:LOOPについて
お礼  すず  - 07/8/31(金) 22:05 -

引用なし
パスワード
   >Loopくん さん
できました! ありがとございます!!
これを理解できたら色々応用がききそうですね。
頑張ります!

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