Excel VBA質問箱 IV

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

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


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

【18635】結果をもとに処理をくり返すには? sakura 04/10/2(土) 15:19 質問[未読]
【18636】Re:結果をもとに処理をくり返すには? ちゃっぴ 04/10/2(土) 15:36 回答[未読]
【18639】Re:結果をもとに処理をくり返すには? Hirofumi 04/10/2(土) 15:57 回答[未読]
【18656】Re:結果をもとに処理をくり返すには? sakura 04/10/3(日) 16:05 お礼[未読]
【18658】Re:結果をもとに処理をくり返すには? Hirofumi 04/10/3(日) 17:06 回答[未読]
【18643】Re:結果をもとに処理をくり返すには? ichinose 04/10/2(土) 20:26 発言[未読]
【18659】Re:結果をもとに処理をくり返すには? sakura 04/10/3(日) 17:08 お礼[未読]
【18660】Re:結果をもとに処理をくり返すには? Hirofumi 04/10/3(日) 17:27 発言[未読]
【18661】Re:結果をもとに処理をくり返すには? ちゃっぴ 04/10/3(日) 17:40 発言[未読]
【18663】Re:結果をもとに処理をくり返すには? ichinose 04/10/4(月) 8:36 発言[未読]
【18700】Re:結果をもとに処理をくり返すには? sakura 04/10/6(水) 12:15 お礼[未読]
【18672】Re:結果をもとに処理をくり返すには? [名前なし] 04/10/4(月) 22:31 発言[未読]
【18698】Re:結果をもとに処理をくり返すには? sakura 04/10/6(水) 12:00 回答[未読]

【18635】結果をもとに処理をくり返すには?
質問  sakura  - 04/10/2(土) 15:19 -

引用なし
パスワード
   Sub obvの計算()

  Select Case Range("j403").Value
   Case Is > 0
    Range("k403").Value = "=k404+g403"
   Case Is = 0
    Range("k403").Value = "=k404"
   Case Is < 0
    Range("k403").Value = "=k404-g403"
  End Select
  
 
  Select Case Range("j402").Value
   Case Is > 0
    Range("k402").Value = "=k403+g402"
   Case Is = 0
    Range("k402").Value = "=k403"
   Case Is < 0
    Range("k402").Value = "=k403-g402"
  End Select
  
  Select Case Range("j401").Value
   Case Is > 0
    Range("k401").Value = "=k402+g401"
   Case Is = 0
    Range("k401").Value = "=k402"
   Case Is < 0
    Range("k401").Value = "=k402-g401"
  End Select
  
 上に記述したように基本的には同じ処理を一つ上のセルでもくり返したいのですが
いろいろためしたのですがエラーになります。全くの初心者で周りにくわしい人もいませんので回答をいただければ幸いです。

【18636】Re:結果をもとに処理をくり返すには?
回答  ちゃっぴ  - 04/10/2(土) 15:36 -

引用なし
パスワード
   >    Range("k401").Value = "=k402+g401"

これだと[k401]のセルに"=k402+g401"と表示されるだけですが、
それでいいのでしょうか?

計算した値を表示させたいなら、
Range("k401").Value = Range("k402").Value + Range("k401").Value

という風にしてやります。

> 上に記述したように基本的には同じ処理を一つ上のセルでも
> くり返したいのですが

ループ構文(For〜Next, Do〜Loop)を勉強ください。

今回の場合、順番に1つ上のセルを計算するということなので、
ループは下からまわします。

For〜Nextのサンプル

Dim i As Long

For i = 403 To 401 Step -1
  Select Case Cells(i, 10).Value
 
  '以下省略
Next i

【18639】Re:結果をもとに処理をくり返すには?
回答  Hirofumi  - 04/10/2(土) 15:57 -

引用なし
パスワード
   こんなで善いかも?

Option Explicit

Sub obvの計算()

  Dim i As Long
  
  With ActiveSheet
    For i = 403 To 401 Step -1
      Calc .Cells(i, "J")
    Next i
  End With

End Sub

Private Sub Calc(rngTarget As Range)

  Dim vntValue As Variant
  
  With rngTarget
    vntValue = Val(.Value)
    Select Case vntValue
      Case Is > 0
        .Offset(, 1).Value _
          = .Offset(1, 1).Value + .Offset(, -3).Value
      Case Is = 0
        .Offset(, 1).Value _
          = .Offset(1, 1).Value
      Case Is < 0
        .Offset(, 1).Value _
          = .Offset(1, 1).Value - .Offset(, -3).Value
    End Select
  End With
  
End Sub

【18643】Re:結果をもとに処理をくり返すには?
発言  ichinose  - 04/10/2(土) 20:26 -

引用なし
パスワード
   ▼sakura さん、皆さん、こんばんは。

> 上に記述したように基本的には同じ処理を一つ上のセルでもくり返したいのですが
>いろいろためしたのですがエラーになります。全くの初心者で周りにくわしい人もいませんので回答をいただければ幸いです。

セルに数式を入れる場合は、セルの相対参照の特徴を使うと

'=======================================================
Sub test()
  With Range("k401:k403")
   .Formula = "=IF(J" & .Row & ">0,K" & .Row + 1 & _
         "+G" & .Row & ",IF(J" & .Row & _
         "=0,K" & .Row + 1 & ",K" & .Row + 1 & "-G" & .Row & "))"
   '      ↑の連結文字列、この場合は(k401:k403)、
   '       "=IF(J401>0,K402+G401,IF(J401=0,K402,K402-G401))" となります。
   '
   End With
End Sub


ループでまわす勉強も大事なのですけど、こんな方法もありと言う事で・・。

【18656】Re:結果をもとに処理をくり返すには?
お礼  sakura  - 04/10/3(日) 16:05 -

引用なし
パスワード
   ▼Hirofumi さん:
ありがとうございました
ためしええみました。
たぶん、私の説明不足で、すべての行で引き算がくり返されます
jれつがマイナスの値だった場合は、kれつの一つ下の値からg列の値を引いてk列に書きこむ。j列が0であれば、k列の一つ下の値をk列にそのままかきこむ
j列がプラスの値の場合は、k列の一つ下の値にg列の値を足してk列に書きこむ
というふうにしたかったのです
ちなみに
G     H    I    J    K
   ( ここから上に値が変わりながら日々書き足されていく)
160    6,000    -1,000    -5,000  (ここは-437-160=-597)
89    9,000    -2,000       0  (ここは-437)
122    5,000    -1,000    1,000  (ここは-559+122=-437)
222    15,000    -8,000    -2,000    -559
357    14,000    -12,000    -12,000    -337
144    8,000    -6,000    -4,000    20
164    8,000    -7,000        164 (始まりの値)

【18658】Re:結果をもとに処理をくり返すには?
回答  Hirofumi  - 04/10/3(日) 17:06 -

引用なし
パスワード
   >ためしええみました。
>たぶん、私の説明不足で、すべての行で引き算がくり返されます
>jれつがマイナスの値だった場合は、kれつの一つ下の値からg列の値を引いてk列に書きこむ。j列が0であれば、k列の一つ下の値をk列にそのままかきこむ
>j列がプラスの値の場合は、k列の一つ下の値にg列の値を足してk列に書きこむ
>というふうにしたかったのです
>ちなみに
>G     H    I    J    K
>   ( ここから上に値が変わりながら日々書き足されていく)
>160    6,000    -1,000    -5,000  (ここは-437-160=-597)
>89    9,000    -2,000       0  (ここは-437)
>122    5,000    -1,000    1,000  (ここは-559+122=-437)
>222    15,000    -8,000    -2,000    -559
>357    14,000    -12,000    -12,000    -337
>144    8,000    -6,000    -4,000    20
>164    8,000    -7,000        164 (始まりの値)

変ですね、この表のG列160の値が、G401に成るようにコピーして
マクロを走らすと、上の表の様に
K403の値=-437
K402の値=-437
K401の値=-597
に成りますけど?

【18659】Re:結果をもとに処理をくり返すには?
お礼  sakura  - 04/10/3(日) 17:08 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございました
試してみました。
とちゅうで計算が終わってしまいました。
たぶん説明不足だったのだと思います 


ちなみに
G     H       I      J      K
   ( ここから上に値が変わりながら日々書き足されていく)
160    6,000    -1,000    -5,000  (ここは-437-160=-597)
89    9,000    -2,000       0    (ここは-437)
122    5,000    -1,000    1,000   (ここは-559+122=-437)
222    15,000    -8,000    -2,000    -559 
357    14,000   -12,000    -12,000    -337
144    8,000    -6,000    -4,000     20
164    8,000    -7,000            164 (始まりの値)

【18660】Re:結果をもとに処理をくり返すには?
発言  Hirofumi  - 04/10/3(日) 17:27 -

引用なし
パスワード
   此れも変ですね?
ichinose さんのコードを動かすとやはり、私の結果と同じ
詰まり、ここがコウなると書いてきている表に成りますよ?
Testしている、表の行位置、列位置が違っているのでは?

【18661】Re:結果をもとに処理をくり返すには?
発言  ちゃっぴ  - 04/10/3(日) 17:40 -

引用なし
パスワード
   >此れも変ですね?
>ichinose さんのコードを動かすとやはり、私の結果と同じ
>詰まり、ここがコウなると書いてきている表に成りますよ?
>Testしている、表の行位置、列位置が違っているのでは?

ちょっと思ったのですが、皆さんが書いたコードを理解されたのでしょうか?
おそらく理解されていないと思いますので、わからないところを
一点一点ヘルプ等で調べて、確実に理解しましょう。

コードの意味を理解できればどこが悪いかわかるはずなので、
(おそらくあなたのシートデータが間違っていると思いますが)
対応できるはずです。

教えてもらったコードを使用するとして、それをメンテナンスするのは
sakuraさんなので、理解しないと困るのはあなたですよ。

【18663】Re:結果をもとに処理をくり返すには?
発言  ichinose  - 04/10/4(月) 8:36 -

引用なし
パスワード
   ▼sakura さん、皆さん、おはようございます。

>試してみました。
>とちゅうで計算が終わってしまいました。
>たぶん説明不足だったのだと思います 
>
>
>ちなみに
>G     H       I      J      K
>   ( ここから上に値が変わりながら日々書き足されていく)
160    6,000    -1,000    -5,000  (ここは-437-160=-597)←401行
>89    9,000    -2,000       0    (ここは-437)
>122    5,000    -1,000    1,000   (ここは-559+122=-437)
>222    15,000    -8,000    -2,000    -559 
>357    14,000   -12,000    -12,000    -337
>144    8,000    -6,000    -4,000     20
>164    8,000    -7,000            164(始まりの値)←407行

↑この表に対して、私が投稿したコードを何も変更せずに実行すれば、

>とちゅうで計算が終わってしまいました。

となりますよ!!
上記の表の先頭行が401行だとすると、「164(始まりの値)」という値が入っている
せるは、K407ですよね?

よって、マクロによって、設定するセル範囲は、K401〜K406ということに
なりますね?
前回のコードの
>With Range("k401:k403")



With Range("k401:k406")

に変更して下さい。

最終行が事象によって変わる場合があるのなら、

With Range("k401", Cells(Rows.Count, 11).End(xlUp).Offset(-1, 0))

このように変更して下さい。

【18672】Re:結果をもとに処理をくり返すには?
発言  [名前なし]  - 04/10/4(月) 22:31 -

引用なし
パスワード
   ▼sakura さん:
ひとつお聞きしますが、この処理は数式だけで出来ると思うのですが、
VBAでやる理由はなんなのでしょうか?

VBAの勉強のためですか?

【18698】Re:結果をもとに処理をくり返すには?
回答  sakura  - 04/10/6(水) 12:00 -

引用なし
パスワード
   ▼[名前なし] さん:

>ひとつお聞きしますが、この処理は数式だけで出来ると思うのですが、
>VBAでやる理由はなんなのでしょうか?
>
>VBAの勉強のためですか?
たくさんのデータを日々計算したいからですう

【18700】Re:結果をもとに処理をくり返すには?
お礼  sakura  - 04/10/6(水) 12:15 -

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

>>>With Range("k401:k403")
>
>を
>
>With Range("k401:k406")
>
>に変更して下さい。
>
>最終行が事象によって変わる場合があるのなら、
>
>With Range("k401", Cells(Rows.Count, 11).End(xlUp).Offset(-1, 0))
>
>このように変更して下さい。
いまいろいろ試してます。最初に初心者と書きこみましたが、ド素人のまちがいでした。
書いてあること理解するのにもかなりの時間を要しますので
まだかかりそうです。ちゃんとできたら報告します。皆さんありがとうございました。

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