• 締切済み

excel VBAでのループの方法

excel VBAでループの方法がわかりません、何方か教えて頂けませんか。 現在,下記様なコードを作成して一応目的に近くなりましが、1か所方法がわかりません。 sheets(時刻)の、(N6:N45 )の時刻データをsheets(基準値時刻)の(AI5:AI44)に転記して、その 転記されたデータを使い時刻を描画して、またsheets(時刻)を参照してこんどは、4列右の(R6:R45)のデータ読み取り、転記場所は、sheets(基準値時刻)の(AI5:AI44)の前回と同じセルに転記し、 そのノテータ を使い時刻を描画します。この繰り返しを行いたいのですが、 を[ j ≖ worksheets("時刻").cells(cnt2,10).value ] の列の10の数値を10,14,18、・・・と変化させたい のですが、うまくいきません。  読み取るデータは4列ずつ右に移動、転記場所は同じ場所、1回の読み込み、転記、描画が完了 してから、読み取るデータの位置のみ変更(4列右へ移動)、後の動作は同じ。 この繰り返しをしたいのです。 '-----------時刻取得・転記------------ for x = 1 to 50 For cnt2 = 6 To 45 Step 1      '6行から45行を1stepずつ j = Worksheets("時刻").Cells(cnt2, 10).Value '時刻sheetsから時刻取得  Worksheets("基準値時刻").Cells(cnt2 - 1, 35).Value = j '取得時刻を基準値時刻sheetへ   Next cnt2 '---------------時刻を描画-------------- For cnt4 = 5 To 44 Step 2 k = Worksheets("基準値時刻").Cells(cnt4, 38).Value l = Worksheets("基準値時刻").Cells(cnt4, 39).Value m = Worksheets("基準値時刻").Cells(cnt4 + 1, 38).Value n = Worksheets("基準値時刻").Cells(cnt4 + 1, 39).Value With Worksheets("勾配計算").Shapes.AddLine(k, l, m, n) .Line.Weight = 1 .Line.ForeColor.RGB = vbBlue End With Next cnt4 Next x 以上がコードの一部です。よろしくお願いいたします。   環境は, OSは  windows 8.1 です。

みんなの回答

回答No.3

あっそうか!(#1です。) > 転記場所は、sheets(基準値時刻)の(AI5:AI44)の前回と同じセルに転記し、 38:39列=AL:AM に、AI列を参照した数式が設定してあって、 その計算結果を元に直線コネクタを描画する、ということかしら? ならば、都度転記する理由もいくらか理解できます。 その場合、そして補足が必要な場合は、 AL:AM はどんな数式なのかも報せて下さいね。 場合によっては、その演算もVBAに任せた方が、 処理は安定するかも知れないので、そういった含みも確認してみて下さい。 取り急ぎ、気が付いたことを追記、まで。

diwk85
質問者

お礼

 ありがとう御座いました。ご指摘頂きました点を検討しました。そして いろいろと試みました。その結果、無事解決できました。 すぐにご解答頂きながら遅くなりまして申し訳ありませんでした。  毎回、独りよがりな質問をして、みなさんにご迷惑かけております。今回はと思い注意しましたが 説明不足でした。 今後ともよろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.2

For cnt2 = 6 To 45 Step 1      '6行から45行を1stepずつ j = Worksheets("時刻").Cells(cnt2, 10).Value '時刻sheetsから時刻取得  Worksheets("基準値時刻").Cells(cnt2 - 1, 35).Value = j '取得時刻を基準値時刻sheetへ   Next cnt2 を Worksheets("基準値時刻").range(Cell(5, 35),ceii(44,35)).Value = Worksheets("時刻").range(Cell(6, 10),cell(45,10)).Value に変え、 Worksheets("基準値時刻").range(Cell(5, 35),ceii(44,35)).Value = Worksheets("時刻").range(Cell(6, 10+x*4-1),cell(45,10+x*4-1)).Value と、する で、如何ですか? 挙げられたものでは 読込み元cells内の10の値が xの影響を受けていません よね? ずっと10のままです 此処が問題点では? お役に立てていたならば幸いです。

すると、全ての回答が全文表示されます。
回答No.1

こんにちは。 読解に自信が持てませんから推察を交えての暫定回答です。 ★の行、2ヶ所、書換えています。 一発でニーズを捉え切れているか疑問が残りますから、保全の為、 ブックのコピーを作ってからコピー側で動作を確認してみて下さい。  Worksheets("基準値時刻") への参照が煩雑なので、  With フレーズを使って全体をブロックにしてあります。  .Cells から始まる参照は、  すべてWorksheets("基準値時刻").Cells の意味です。 > 転記場所は、sheets(基準値時刻)の(AI5:AI44)の前回と同じセルに転記し、 ループの中で繰り返し同じ場所に転記するのは、 結果的にループの最後の処理しか反映されないですよね? (元データの最終列だけ記録として残すのなら、それはループの中に書く必要はないですし) なので、非常に特殊な扱い方です。 特別な理由(例えば元データの列単位で処理を中断したものを閲覧したい?とか) が無いならば、見る者(時が経ち開発意図を忘れた頃の自分を含む) を困惑させる原因になりますから(今回、回答がなかなか付かない理由もこれ)、 (転記の処理過程を省き)'基準値時刻'シートの値を直接参照するように した方が、解り易いのかも知れません。 何か理由があってのことなら、 ご自身が今知っているだけでは、不安が残りますから、 スクリプト中のコメント、質問文、に明記した方がいいです。 一応、想定した中で確率が高そうに思える前提への答として、 以下のコードを書いています。 動作を確認し、望んだ結果が得られない場合は、 望んだ結果とどう違うのか明らかにしてください。 その際、 '時刻'シートのデータサンプルを一例(+何時から何時までとか)、 '勾配計算'シートのレイアウト概要 などの説明を添えておけば、こちらでも実際に動作確認が出来るようになり、 より的確な対応が可能になると思います。 他、 説明では"N列から"なのか"J列から"なのか、とか、 何列めまでループするのか、等、不足した情報も付け加えておいてください。 (以下はJ列から、50回、右に4列ずつステップするようにループする例です。) ' ' -------------------------------------------------------------- Dim j As Variant Dim k As Single, l As Single, m As Single, n As Single ' 座標(時刻) Dim x As Long, cnt2 As Long, cnt4 As Long ' ループカウンタ ' ' --------------------------------------------------------------   With Worksheets("基準値時刻")     '-----------時刻取得・転記------------     For x = 10 To 206 Step 4 ' ★←ココ★何列めから何列めまでなのか指定してください       For cnt2 = 6 To 45 ' Step 1     '6行から45行を1stepずつ         j = Worksheets("時刻").Cells(cnt2, x).Value ' ' ★←ココ★時刻sheetsから時刻取得         .Cells(cnt2 - 1, 35).Value = j '取得時刻を基準値時刻sheetへ       Next cnt2       '---------------時刻を描画--------------       For cnt4 = 5 To 44 Step 2         k = .Cells(cnt4, 38).Value         l = .Cells(cnt4, 39).Value         m = .Cells(cnt4 + 1, 38).Value         n = .Cells(cnt4 + 1, 39).Value         With Worksheets("勾配計算").Shapes.AddLine(k, l, m, n)           .Line.Weight = 1           .Line.ForeColor.RGB = vbBlue         End With       Next cnt4     Next x   End With ' ' --------------------------------------------------------------

すると、全ての回答が全文表示されます。

関連するQ&A