[[20170606113859]] 『マクロの繰り返しについて』(ビギナー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの繰り返しについて』(ビギナー)

はじめまして
エクセル初心者ですが
マクロを組んでみたのですが

  A     B      C  
1 数値1 マクロ1結果 マクロ2結果 
2 数値2
3 数値3
4
 

という感じで配置されております。
マクロ1とマクロ2は数値1〜3の数値を基に結果が出ております。

このマクロ1とマクロ2下に下記の様10行オフセットしながら5回マクロを実行したいのですがどのようにすればよろしいでしょうか?
下記の倍は数値4〜6を基にB11とC11に結果表示させたいです。

   A     B      C  
11 数値4 マクロ1結果 マクロ2結果 
12 数値5
13 数値6
14

知識があまりなく困っており助けていただけると助かります。
よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows8 >


ビギナーさん

マクロで繰り返す方法は、

For 変数=a to b (Step C)
  処理
next 変数

という方法と

While 条件が成立している間
  処理
Wend

という方法があります。

ご希望は5回繰り返されたいのですから、

For I=1 to 51  step 10
  Cells(I,2)= マクロ1結果
  Cells(I,3)= マクロ2結果
Next I

という風になさればできると思います。
Offset関数は使っていませんが、ご理解いただけますでしょうか? 
  
(パオ〜〜ン) 2017/06/06(火) 12:02


 Sub TEST()

    Dim Rng As Range
    Dim i As Long

    Set Rng = Range("B1")
    For i = 0 To 5
        Rng.Offset(i * 10 + 1, 0).Value = マクロ1結果
        Rng.Offset(i * 10 + 1, 1).Value = マクロ2結果
    Next i

 End Sub

 Offsetを使うとこんな感じでしょうか。
(ろっくん) 2017/06/06(火) 12:13

 すみません。間違っていたので訂正します。

 Sub TEST()

    Dim Rng As Range
    Dim i As Long

    Set Rng = Range("B1")
    For i = 0 To 5
        Rng.Offset(i * 10, 0).Value = マクロ1結果
        Rng.Offset(i * 10, 1).Value = マクロ2結果
    Next i

 End Sub

 ちなみに繰り返し処理にはDo〜Loopステートメントもあります。

 パオ〜〜ンさん
 余談ですみません。
 While〜Wend ステートメントは最近あまり使われなくなりましたね。
 おそらくですが Do〜Loopで代用ができ、Exit Doなどで抜ける処理が
 できないためでしょうかね。
(ろっくん) 2017/06/06(火) 12:38


返信ありがとうございます。
やってみましたがうまくいきませんでした。
当方の説明が悪かったようで

   A     B               C  
11 数値4 マクロ1をつかった結果    マクロ2を使った結果 
12 数値5
13 数値6
14

B1とB11は計算結果なので違う値になってほしいですが
説明難しいのですがB11でもマクロ1を実行したいといえば
伝わりますでしょうか?

すみませんがよろしくお願いします。


 基本は書きこむセルを変更したように計算対象のセルも変更することだがそちらで応用できないようであればもともとの
 VBAを示してみてくれ。

 あと、返信は編集からではなく下にある「コメント」からおこなってくれ。
(ねむねむ) 2017/06/06(火) 13:09

初心者なものですみません。
以後気を付けます。

Sub 発動()
'
' Macro0 Macro
'

    マクロ1
  マクロ2  

 End Sub

現状上記のようなマクロ1とマクロ2を実行できるようにマクロを作っております。

よろしくお願いします。

(ビギナー) 2017/06/06(火) 13:14


ビギナーさん

そのマクロ1とマクロ2のコードが知りたいのですが。。。
現在は 発動 というマクロで マクロ1 と マクロ2を動かしてあるのですね。

それを拝見すると、まとめた形でご提示できるものと思います。
(パオ〜〜ン) 2017/06/06(火) 14:25


返信ありがとうございます。
マクロのコードですが

Sub マクロ1()
'
' Macro1 Macro
'

    Dim AAA As String
    Dim BBB As Double
    Dim CCC As String

    Dim DDD As String
    Dim EEE As String
    Dim FFF As String, GGG As String
    Dim HHH As String
    Dim III As String
    Dim JJJ As String
    Dim KKK As String
    Dim LLL As String
    Dim MMM As String

    Dim cal_01 As Double

    AAA = ThisWorkbook.Worksheets("sheet1").Cells(9, 4).Text
    BBB = ThisWorkbook.Worksheets("sheet1").Cells(10, 4).Text
    CCC = ThisWorkbook.Worksheets("sheet1").Cells(11, 4).Text

    DDD = ThisWorkbook.Worksheets("sheet1").Cells(13, 4).Text
    EEE = ThisWorkbook.Worksheets("sheet1").Cells(14, 4).Text
    FFF = ThisWorkbook.Worksheets("sheet1").Cells(15, 4).Text
    GGG = ThisWorkbook.Worksheets("sheet1").Cells(16, 4).Text
    HHH = ThisWorkbook.Worksheets("sheet1").Cells(17, 4).Text
    III = ThisWorkbook.Worksheets("sheet1").Cells(9, 13).Text
    JJJ = ThisWorkbook.Worksheets("sheet1").Cells(18, 4).Text
    KKK = ThisWorkbook.Worksheets("sheet1").Cells(19, 4).Text
    LLL = ThisWorkbook.Worksheets("sheet1").Cells(20, 4).Text
    MMM = ThisWorkbook.Worksheets("sheet1").Cells(21, 4).Text

    cal_01 = Val(Right(CCC, 5)) / BBB
    ThisWorkbook.Worksheets("sheet1").Cells(5, 10) = cal_01

    If BBB >= 0.01 And BBB <= 1# Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 14) = ThisWorkbook.Worksheets("sheet2").Cells(10, 4)    

    ElseIf BBB >= 1.001 And BBB <= 2# Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 14) = ThisWorkbook.Worksheets("sheet2").Cells(11, 4)    

    ElseIf BBB >= 2.001 And BBB <= 3# Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 14) = ThisWorkbook.Worksheets("sheet2").Cells(12, 4)    

    Else
         ThisWorkbook.Worksheets("sheet1").Cells(9, 14) = "?????"
    End If

'
End Sub


Sub マクロ2()
'
' Macro2 Macro
'

    Dim AAA As String
    Dim BBB As Double
    Dim CCC As String

    Dim DDD As String
    Dim EEE As String
    Dim FFF As String, GGG As String
    Dim HHH As String
    Dim III As String
    Dim JJJ As String
    Dim KKK As String
    Dim LLL As String
    Dim MMM As String

    Dim cal_01 As Double

    AAA = ThisWorkbook.Worksheets("sheet1").Cells(9, 4).Text
    BBB = ThisWorkbook.Worksheets("sheet1").Cells(10, 4).Text
    CCC = ThisWorkbook.Worksheets("sheet1").Cells(11, 4).Text

    DDD = ThisWorkbook.Worksheets("sheet1").Cells(13, 4).Text
    EEE = ThisWorkbook.Worksheets("sheet1").Cells(14, 4).Text
    FFF = ThisWorkbook.Worksheets("sheet1").Cells(15, 4).Text
    GGG = ThisWorkbook.Worksheets("sheet1").Cells(16, 4).Text
    HHH = ThisWorkbook.Worksheets("sheet1").Cells(17, 4).Text
    III = ThisWorkbook.Worksheets("sheet1").Cells(9, 13).Text
    JJJ = ThisWorkbook.Worksheets("sheet1").Cells(18, 4).Text
    KKK = ThisWorkbook.Worksheets("sheet1").Cells(19, 4).Text
    LLL = ThisWorkbook.Worksheets("sheet1").Cells(20, 4).Text
    MMM = ThisWorkbook.Worksheets("sheet1").Cells(21, 4).Text

    cal_01 = Val(Right(CCC, 5)) / BBB
    ThisWorkbook.Worksheets("sheet1").Cells(5, 10) = cal_01   

    If DDD = "a" Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = ThisWorkbook.Worksheets("sheet2").Cells(14, 3)    

    ElseIf DDD = "b" Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = ThisWorkbook.Worksheets("sheet2").Cells(15, 3)

    ElseIf DDD = "c" Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = ThisWorkbook.Worksheets("sheet2").Cells(16, 3) 
    End If

    If DDD = "d" Then
    If HHH = "e" Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = ThisWorkbook.Worksheets("Sheet2").Cells(9, 3)
    End If
    End If

    If DDD = "f" Then
    If HHH = "g" Then
    If BBB >= 0.01 And BBB <= 0.03 Then
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = ThisWorkbook.Worksheets("sheet2").Cells(8, 3)
    Else
         ThisWorkbook.Worksheets("sheet1").Cells(9, 5) = "?????"
    End If
    End If
    End If

'
End Sub

のようなマクロのコードです。
実際はマクロ10位まであり、発動を押すと表の中に値が反映される状態です。
今ある表を下に5個ほど作成したいと思っております。

よろしくお願いします。

(ビギナー) 2017/06/06(火) 15:41


ビギナーさん

マクロ1では、sheet1 の J5とN9の値を決めています。
マクロ2では、sheet1 の J5とE9の値を決めています。

マクロはマクロ1〜マクロ10位まであるのですね。
で、発動というマクロを起動すると、表の中に値が反映されるのですね。

申し訳ありませんが、発動というマクロのコードはどのようになっているのでしょうか?

マクロ1とマクロ2だけでは、J5とN9とE9の値以外は決まりません。

マクロ1の結果と言っても、行を変えてそのまま貼り付けても、相変わらず J5とN9 の値を入れるだけです。

(パオ〜〜ン) 2017/06/06(火) 16:23


ビギナーさん

追加で、 Min_tolerance という関数? は何なのでしょう? 不勉強で知りません。
ご教示いただければありがたいのですが・・・
(パオ〜〜ン) 2017/06/06(火) 16:31


返信ありがとうございます。
マクロ1はsheet1のN9の値
マクロ2はsheet1のE9の値
を決めております。

発動のコードは少し前に書かせていただいております。
よろしくお願いします。

このままセル指定していってもいいのですが恐ろしく長文になるので
表同士の間隔は一定なのでloopなどの繰り返しでどうにか短くできないかと思い質問しております。

よろしくお願いします。
(ビギナー) 2017/06/06(火) 16:58


ビギナーさん

マクロ1〜マクロ10位まであるのではないのでしょうか?

発動というマクロで示していただいたのは、マクロ1とマクロ2だけですが・・・・

それとも今マクロ1とマクロ2だけなのを、5回繰り返して下へ表を伸ばして処理できるようにしたい、 ということでしょうか?

N9、E9の値を着ているマクロを
場所によって  N19とE19  N29 とE29  〜 としたいということでしょうか?

最初に
1行目の数値1に対して マクロ1 マクロ2

11行目の数値4に対して マクロ1 マクロ2 とお書きでしたが、

1行目のマクロ1とマクロ2は N9、E9の値を決め、
11行目の数値4に対するマクロ1とマクロ2は N19、E19の値を決めるようにしたいということでしょうか?
(パオ〜〜ン) 2017/06/06(火) 17:08


度々返信ありがとうございます。
マクロは1〜10ほどありますが長すぎてすべて掲載するの厳しいので
出来るだけ短いものを掲載しておいります。

ぱおーんさんのおっしゃるように
1行目のマクロ1とマクロ2は N9、E9の値を決め、
11行目の数値4に対するマクロ1とマクロ2は N19、E19の値を決めるようしたいです。
よろしくお願いします。
(ビギナー) 2017/06/07(水) 09:05


ビギナーさん

再度整理してみます。

マクロ1を整理すると
Sub マクロ1()

 '
 ' Macro1 Macro
 '
    Dim cal_01 As Double
    Dim S1  As Worksheet
    Dim S2  As Worksheet

    Set S1 = Sheets("sheet1")
    Set S2 = Sheets("sheet2")

    cal_01 = Val(Right(Min_tolerance, 5)) / S1.Range("D10")
   S1.Range("J5").Value = cal_01

    Select Case S1.Range("D10").Value
    Case 0.01 To 1#
         S1.Range("N9").Value = S2.Range(J4).Value
    Case Is < 2#
         S1.Range("N9").Value = S2.Range(K4)
    Case Is < 3#
         S1.Range("N9").Value = S2.Range(L4)
    Case Else
         S1.Range("N9").Value = "????"
    End Select

End Sub
となり sheet1のN9を sheet2のJ4などなどから値を決めています。

マクロ2は
Sub マクロ2()
'

 ' Macro2 Macro
 '
    Dim cal_01 As Double
    Dim S1  As Worksheet
    Dim S2  As Worksheet

    Set S1 = Sheets("sheet1")
    Set S2 = Sheets("sheet2")

    cal_01 = Val(Right(Min_tolerance, 5)) / S1.Range("D10")
    S1.Range("J5") = cal_01

    Select Case S1.Range("D13").Value
    Case "a"
        S1.Range("E9").Value = S2.Range("C14").Value
    Case "b"
        S1.Range("E9").Value = S2.Range("C15").Value
    Case "c"
        S1.Range("E19").Value = S2.Range("C16").Value
    Case "d"
        If S1.Range("D17").Value = "e" Then
            S1.Range("E9").Value = S2.Range("C9")
        End If
    Case "f"
        If S1.Range("D17").Value = "e" Then
            If S1.Range("D10").Value >= 0.01 And S1.Range("D10").Value <= 0.03 Then
                S1.Range("E9").Value = S2.Range("C8")
            End If
        Else
            S1.Range("E9").Value = "?????"
        End If
    End Select

 End Sub

となりsheet1のE9の値をsheet2のC8等々から決めています。

最初に仰った

 >マクロ1とマクロ2は数値1〜3("A1"〜~"A3")の数値を基に結果が出ております。
とはどこで結びつくのでしょうか?

 >下記の倍は数値4〜6を基にB11とC11に結果表示させたいです。
 >
 >  A     B      C
 > 11 数値4 マクロ1結果 マクロ2結果

数値4〜6はsheet1のA11〜A13だと思いますが、これはマクロ1、マクロ2でどの様に絡めれば良いのでしょうか?今のままでは数値4(A11)〜数値6(A13)はマクロ1マクロ2の中には出てき方がわかりません。

まだ何か私が知らない別の条件などがあって、私が理解できないのでしょうか?

(パオ〜〜ン) 2017/06/07(水) 10:06


返信ありがとうございます。
数値4〜6値を使いsheet2から参照させたいと思っております。

ぱおーんさんのおっしゃられている通り現状では数値4〜6に関しては組み込んでおりませんので
値は出ませんよね・・・

やりたいことは
数値1〜3の部分が表1だとすると
数値4〜6は表2
現状自分が分かる方法で書いていくと実際は表10以上まであるので今のセル指定のやり方ではかなりの長文になってしまうので
いい方法はないものかと思い質問させていただきました。

(小心者) 2017/06/07(水) 10:32


ビギナーさん改め小心者さん

なんだか後から後から条件が出てきているような(^^;;

ということは、回答はお持ちのようですね。
繰り返しの処理ではうまくいかない、ということでしょうか?

何らかの関係性があれば、繰り返し処理も使えるのでしょうが..

最初に繰り返しのマクロをお伝えした後、
結果が出てこない、と仰っていらっしゃいましたが、必要な条件を教えていただけないので、当然といえば当然ですね。

こんなときは地道にいくしかないのかもしれません。

また、何かありましたら、よろしく。
(パオ〜〜ン) 2017/06/07(水) 11:27


返信ありがとうございます。
繰り返しのやり方がわからなかったので最小限の繰り返し数が分かれば
あとは自分でアレンジできるかと思い少なめに数字を言っておりました。
一応最初の方に5回繰り返したいと書いたのですが・・・
説明が下手ですみません。

また何かいい方法あればご教授よろしくお願いします。
(小心者) 2017/06/07(水) 11:34


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.