こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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 です。

投稿日時 - 2015-02-10 11:34:23

QNo.8914663

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

取り急ぎ、気が付いたことを追記、まで。

投稿日時 - 2015-02-10 15:47:47

お礼

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

投稿日時 - 2015-02-12 10:12:15

ANo.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のままです

此処が問題点では?

お役に立てていたならば幸いです。

投稿日時 - 2015-02-10 15:47:10

ANo.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
' ' --------------------------------------------------------------

投稿日時 - 2015-02-10 15:21:55

あなたにオススメの質問