vlookupどう使えばいいですか | |
---|---|
[102335] vlookupどう使えばいいですか- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ 山下 健志 -(2007/11/01(17:29)) □U R L/ VBAの初心者です。 現在はシート1に"M0" と名前付け、シート2に"M1_M2"と名前をつけました。 シート1に、 Sub GenExpRnd1() 'M0到着分布' Dim NumRnd As Integer, i As Integer, a As Single NumRnd = 500 Application.DisplayAlerts = False Range("C16:D16").Merge Application.DisplayAlerts = True Range("C16") = "到着間隔" Range("B16") = "No" Range("G16") = "到着時間" Range("H16") = "行列人数" Range("I16") = "開始時間" Range("J16") = "終了時間" Range("K16") = "開始待ち時間" Range("L16") = "終了待ち時間" Range("C17,D17,G17,H17,I17").Value = 0 With Range("C16") '---セルC16に対して .HorizontalAlignment = xlHAlignCenter '---横位置 中央揃え .VerticalAlignment = xlVAlignCenter '---縦位置 中央揃え End With For i = 1 To (NumRnd - 1) a = ExpRnd1(60 / (22.652 * 2)) Range("C18").Value = a Range("C18").Cells(i).Value = a Range("d18").Value = Application.Round(Range("C18"), 2) Range("d18").Cells(i).Value = Range("d18") Range("B17").Value = 1 Range("B17").Cells(i).Value = i Range("B516").Value = 500 Next i End Sub Function ExpRnd1(ByVal a As Single) As Single Dim u As Single u = Rnd ExpRnd1 = -(1 / a) * Log(u) End Function Sub GenExpRnd2() 'M0サービス分布' Dim NumRnd As Integer, i As Integer, b As Single NumRnd = 500 Application.DisplayAlerts = False Range("E16:F16").Merge Application.DisplayAlerts = True Range("e16") = "サービス時間" With Range("e16") '---セルe16に対して .HorizontalAlignment = xlHAlignCenter '---横位置 中央揃え .VerticalAlignment = xlVAlignCenter '---縦位置 中央揃え End With For i = 1 To NumRnd b = ExpRnd2(60 / 24.284) Range("e17").Value = b Range("e17").Cells(i).Value = b Range("f17").Value = Application.Round(Range("e17"), 2) Range("f17").Cells(i).Value = Range("f17") Next i End Sub Function ExpRnd2(ByVal b As Single) As Single Dim u As Single u = Rnd ExpRnd2 = -(1 / b) * Log(u) End Function Sub M0() GenExpRnd1 GenExpRnd2 Range("G18:G516").Formula = "=D18 + G17" Range("J17").Value = Range("F17").Value Range("J18:J516").Formula = "=I18 + F18" Range("I18:I516").Formula = "=Max(J17,G18)" Range("H18:H516").Formula = "=Countif($J$17:J17, ""> ""&G18 )" Range("K17:K516").Formula = "=I17 - G17" Range("L17:L516").Formula = "=J17 - G17" End Sub Sub M0_M1() Dim NumRnd As Integer, i As Integer M0 Sheet2.M1 'シート2にあるマクロの名前 NumRnd = 500 Range("C520") = "M0_a" Range("B520") = "No" Range("D520") = "M0_e" Range("E520") = "M0_開始w" Range("F520") = "M1_a" Range("G520") = "M1行列人数" Range("H520") = "M1_s" Range("I520") = "M1_e" Range("J520") = "M1_開始_w" Range("C521:C670").Formula = "=G17" Range("D521:D670").Formula = "=J17" Range("E521:E670").Formula = "=K17" Range("B521").Value = 1 Worksheets("sheet2.xls").Select Application.ScreenUpdating = False Range("F521:F670").Formula = "=Vlookup(D521,sheet2!C$16:$L$516,5,FALSE)" For i = 1 To NumRnd - 350 Range("B521").Value = 1 Range("B521").Cells(i).Value = i Next i End Sub 以上のマクロを入力したが、実行速度が非常に遅く、なおかつ下の行列人数のところで、”インデックスが結う広範にありません”とデバッグのエラーメッセージが出ています。 また誰か見ていただけっるでしょうか。どうぞよろしくお願いします。 ++++++++++++++++++++ OS ⇒Windows XP Version⇒Excel 2002 ++++++++++++++++++++ |
[102338] Re[2]: vlookupどう使えばいいですか- ■記事引用/メール受信=ON■ □投稿者/ q6 6p -(2007/11/01(20:03)) □U R L/ こんばんは。 >Sub M0_M1() > > Dim NumRnd As Integer, i As Integer この後に Application.ScreenUpdating = False ...と入れてみたらどうなりますか? また、 'Worksheets("sheet2.xls").Select これって不要なんじゃ? '編集追記です。 上書き実行する場合は >Sub M0_M1() > > Dim NumRnd As Integer, i As Integer Application.ScreenUpdating = False Application.Calculation = xlCalculationManual : Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True >End Sub などと、.Calculationも制御したほうが良いかもしれません。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102342] Re[2]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/01(21:49)) □U R L/ こんばんわ 良く分からない所は、コメントアウトしています。 Private Sub GenExpRnd1() 'M0到着分布' Dim NumRnd As Integer, i As Integer, a As Single Dim MyA(1 To 499, 1 To 3) As Variant NumRnd = 500 With Range("C16:D16") Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With Range("B16:C16").Value = Array("No", "到着間隔") Range("G16:L16").Value = _ Array("到着時間", "行列人数", "開始時間", "終了時間", _ "開始待ち時間", "終了待ち時間") Range("B17").Value = 1 Range("C17,D17,G17,H17,I17").Value = 0 For i = 1 To (NumRnd - 1) a = ExpRnd1(60 / (22.652 * 2)) MyA(i, 1) = i + 1 MyA(i, 2) = a MyA(i, 3) = Application.Round(a, 2) Next i MyA(1, 2) = MyA(499, 2) MyA(1, 3) = MyA(499, 3) Range("B18").Resize(NumRnd - 1, 3).Value = MyA Erase MyA End Sub Private Function ExpRnd1(ByVal a As Single) As Single Dim u As Single u = Rnd ExpRnd1 = -(1 / a) * Log(u) End Function Private Sub GenExpRnd2() 'M0サービス分布' Dim NumRnd As Integer, i As Integer, b As Single Dim MyA(1 To 500, 1 To 2) As Double NumRnd = 500 With Range("E16:F16") .Cells(1).Value = "サービス時間" Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With For i = 1 To NumRnd b = ExpRnd2(60 / 24.284) MyA(i, 1) = b MyA(i, 2) = Application.Round(b, 2) Next i MyA(1, 1) = MyA(500, 1) MyA(1, 2) = MyA(500, 2) Range("E17").Resize(500, 2).Value = MyA Erase MyA End Sub Private Function ExpRnd2(ByVal b As Single) As Single Dim u As Single u = Rnd ExpRnd2 = -(1 / b) * Log(u) End Function Private Sub M0() GenExpRnd1 GenExpRnd2 Range("G18:G516").Formula = "=D18 + G17" Range("J17").Value = Range("F17").Value Range("J18:J516").Formula = "=I18 + F18" Range("I18:I516").Formula = "=Max(J17,G18)" Range("H18:H516").Formula = "=Countif($J$17:J17,"">""&G18)" Range("K17:L516").Formula = "=I17-$G17" End Sub Public Sub M0_M1() Dim NumRnd As Integer, i As Integer Dim MyA(1 To 150, 1 To 1) As Integer With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With M0 ' 不明 ↓ 'Sheet2.M1 'シート2にあるマクロの名前 NumRnd = 500 Range("B520:C520").Value = Array("No", "M0_a") Range("D520:J520").Value = Array("M0_e", "M0_e", "M0_開始w", _ "M1_a", "M1行列人数", "M1_s", "M1_e", "M1_開始_w") Range("C521:C670").Formula = "=G17" Range("D521:D670").Formula = "=J17" Range("E521:E670").Formula = "=K17" ' シート2に"M1_M2"と名前をつけました ? ↓ Range("F521:F670").Formula = "=Vlookup(D521,M1_M2!C$16:$L$516,5,FALSE)" For i = 1 To NumRnd - 350 MyA(i, 1) = i Next i Range("B521").Resize(NumRnd - 150).Value = MyA With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With Erase MyA End Sub 訂正:Public Sub M0_M1() 中の Range("B521").Resize(NumRnd - 150).Value = MyA は Range("B521").Resize(NumRnd - 350).Value = MyA でした。ついでに Range("D521:D670").Formula = "=J17" Range("E521:E670").Formula = "=K17" は Range("D521:E670").Formula = "=J17" と1行でもいいです。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102353] Re[3]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ 山下 健志 -(2007/11/02(00:04)) □U R L/ こんばんは。q6 6pさん、appleさん、ありがとうございます。 シートの名前は、普通のexcelで入れた名前なんて、それで教えていただいたとおりプログラムを変えてみたら、「値の更新:M2」というエラーが出てきました。 これはどう解決できますか。 またよろしくお願いします。 ++++++++++++++++++++ OS ⇒Windows XP Version⇒Excel 2002 ++++++++++++++++++++ |
[102355] Re[4]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/02(00:19)) □U R L/ こんばんわ >シートの名前は、普通のexcelで入れた名前なんて、それで教えていただいたとおり >プログラムを変えてみたら、「値の更新:M2」というエラーが出てきました ? です。 Range("F521:F670").Formula = "=Vlookup(D521,M1_M2!C$16:$L$516,5,FALSE)" がエラーという事ですか? 「普通のexcelで入れた名前なんて」 ? です。 シート2 の名前を変えて、シートタブに「M1_M2」となっているのではないのですか? この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102358] Re[5]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ 山下 健志 -(2007/11/02(01:01)) □U R L/ さっきぼくの説明がわかりにくかったので、すみません。 実はAsheet1の名前は、「M0」でAsheet2の名前は、「M1_M2」につけています。 vlookup関数を使疎き、その検索範囲はAsheet2の$C$16:$L$516ですが、この範囲はsheet2上、「M1」というマクロで計算されています。 で、マクロM1は、ご覧になったマクロM0とほぼ同じで、指数分布を計算しますが、パラメータのa = ExpRnd1(60 / (22.652 * 2))を a = ExpRnd1(60 / (53.46* 2))に変えただけなんです。 appleさんと他の達人様、またのご指導、よろしくお願いします。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102362] Re[6]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ q6 6p -(2007/11/02(01:18)) □U R L/ appleさんのご質問、 > Range("F521:F670").Formula = "=Vlookup(D521,M1_M2!C$16:$L$516,5,FALSE)" > >がエラーという事ですか? に答えましょうよ。 >この範囲はsheet2上、「M1」というマクロで計算されています。 >で、マクロM1は、ご覧になったマクロM0とほぼ同じで ...って事は、その『「M1」というマクロで』エラーが出てるという事はないですか? この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102363] Re[6]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/02(01:20)) □U R L/ こんばんわ >実はsheet1の名前は、「M0」でsheet2の名前は、「M1_M2」につけています 本当ですか? Sub Test() MsgBox Sheet2.Name End Sub としたらどういう結果になります? この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102380] Re[7]: vlookupどう使えばいいですか- ■記事引用/メール受信=ON■ □投稿者/ 山下 健志 -(2007/11/02(14:12)) □U R L/ こんにちは。皆様に教えていただいたとおりに実行したんでしたが、やはり 「メソッドまたはデータメンバが見つかりません」とか 「値の更新:M2」というコンパイルエラーが消えないんですよ。 その原因が シート2にあるマクロ「M1」をシート1に転写するときに、 sheet2.M1の宣言し方がおかしいですから、「値の更新:M2」のエラーが出てきた。そこでシートの名前を全部「Sheet」に戻したんですよ。しかし、実行したら、「メソッドまたはデータメンバが見つかりません」のエラーがそのままです。 上まで略 (⇒)Public Sub M0_M1() Dim NumRnd As Integer, i As Integer Dim MyA(1 To 150, 1 To 1) As Integer With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With M0 Sheet2.M1 NumRnd = 500 Range("B520:C520").Value = Array("No", "M0_a") Range("D520:J520").Value = Array("M0_e", "M0_e", "M0_開始w", _ "M1_a", "M1行列人数", "M1_s", "M1_e", "M1_開始_w") Range("C521:C670").Formula = "=G17" Range("D521:E670").Formula = "=J17" ' シート2に"M1_M2"と名前をつけました ? ↓ Range("F521:F670").Formula = "=Vlookup(D521,Sheet2!C$16:$L$516,5,FALSE)" For i = 1 To NumRnd - 350 MyA(i, 1) = i Next i Range("B521").Resize(NumRnd - 350).Value = MyA With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With Erase MyA End Sub で、シート2上にあるマクロM1は、ご覧になったマクロM0とほぼ同じで、指数分布を計算しますが、パラメータのa = ExpRnd1(60 / (22.652 * 2))を a = ExpRnd1(60 / (53.46* 2))に変えただけなんです。 appleさんと他の達人様、またのご指導、よろしくお願いします。 |
[102384] Re[8]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/02(14:45)) □U R L/ こんにちわ >シート2上にあるマクロM1 コードモジュールの使い方を勘違いしていませんか? 通常は、このレスを通してUPされているようなコードはすべて「標準モジュール」に書きます。 コードはすべて「標準モジュール」に移して下さい。まずはそこからです。 次に、一連のコードで複数のシートを操作するにはですが 「Range("F521:F670"). 」のように Range の親オブジェクトであるシートの指定を省略する 場合は、その操作しようとするシートをアクティブにして置かなければ上手くゆかない筈です。 ですが、「実行速度が非常に遅く」等を気にするなら、Sheets("Sheet1").Range("F521:F670"). のようにすれば、シートをアクティブにする必要はなくなります。 とりあえず、「シート2上にあるマクロM1」も提示して下さい。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102398] Re[9]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ 山下 健志 -(2007/11/02(20:07)) □U R L/ こんばんは。appleさん、本当にありがとうございます。 ご指導とおり、コードを全て標準モジュールに移しました。しかし、上のコンパイルエラーが消えないんですね。確かにシート1枚に対しモジュールコード一つを使うと思い、シート1のコードをMoudle1に、シート2のコードをMoudle2に移しました。Moudle2のコード中M2にあるガンマ乱数ですが、これからまずvlookup関数の難関をクリアして、それから進む予定です。 今までのコードを全て下に書きますが、その下にはMoudle2です。どこがいけないか、ぼくが超初心者で探ることができませんので、appleとみなさまにご指導よろしくお願いします。 'Moudle1 Private Sub GenExpRnd1() 'M0到着分布' Dim NumRnd As Integer, i As Integer, a As Single Dim MyA(1 To 499, 1 To 3) As Variant NumRnd = 500 With Range("C16:D16") Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With Range("B16:C16").Value = Array("No", "到着間隔") Range("G16:L16").Value = _ Array("到着時間", "行列人数", "開始時間", "終了時間", _ "開始待ち時間", "終了待ち時間") Range("B17").Value = 1 Range("C17,D17,G17,H17,I17").Value = 0 For i = 1 To (NumRnd - 1) a = ExpRnd1(60 / (22.652 * 2)) MyA(i, 1) = i + 1 MyA(i, 2) = a MyA(i, 3) = Application.Round(a, 2) Next i MyA(1, 2) = MyA(499, 2) MyA(1, 3) = MyA(499, 3) Range("B18").Resize(NumRnd - 1, 3).Value = MyA Erase MyA End Sub Private Function ExpRnd1(ByVal a As Single) As Single Dim u As Single u = Rnd ExpRnd1 = -(1 / a) * Log(u) End Function Private Sub GenExpRnd2() 'M0サービス分布' Dim NumRnd As Integer, i As Integer, b As Single Dim MyA(1 To 500, 1 To 2) As Double NumRnd = 500 With Range("E16:F16") .Cells(1).Value = "サービス時間" Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With For i = 1 To NumRnd b = ExpRnd2(60 / 24.284) MyA(i, 1) = b MyA(i, 2) = Application.Round(b, 2) Next i MyA(1, 1) = MyA(500, 1) MyA(1, 2) = MyA(500, 2) Range("E17").Resize(500, 2).Value = MyA Erase MyA End Sub Private Function ExpRnd2(ByVal b As Single) As Single Dim u As Single u = Rnd ExpRnd2 = -(1 / b) * Log(u) End Function Private Sub M0() GenExpRnd1 GenExpRnd2 Range("G18:G516").Formula = "=D18 + G17" Range("J17").Value = Range("F17").Value Range("J18:J516").Formula = "=I18 + F18" Range("I18:I516").Formula = "=Max(J17,G18)" Range("H18:H516").Formula = "=Countif($J$17:J17,"">""&G18)" Range("K17:L516").Formula = "=I17-G17" End Sub Public Sub M0_M1() Dim NumRnd As Integer, i As Integer Dim MyA(1 To 150, 1 To 1) As Integer With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With M0 Sheet2.M1 'シート2にあるマクロの名前 NumRnd = 500 Range("B520:C520").Value = Array("No", "M0_a") Range("D520:J520").Value = Array("M0_e", "M0_e", "M0_開始w", _ "M1_a", "M1行列人数", "M1_s", "M1_e", "M1_開始_w") Range("C521:C670").Formula = "=G17" Range("D521:E670").Formula = "=J17" Range("F521:F670").Formula = "=Vlookup(D521,sheet2!C$16:$L$516,5,FALSE)" For i = 1 To NumRnd - 350 MyA(i, 1) = i Next i Range("B521").Resize(NumRnd - 350).Value = MyA With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With Erase MyA End Sub 'Moudle2 Private Sub GenExpRnd3() 'M1到着分布' Dim NumRnd As Integer, i As Integer, a As Single Dim MyA(1 To 499, 1 To 3) As Variant NumRnd = 500 With Range("C16:D16") Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With Range("B16:C16").Value = Array("No", "到着間隔") Range("G16:L16").Value = _ Array("到着時間", "行列人数", "開始時間", "終了時間", _ "開始待ち時間", "終了待ち時間") Range("B17").Value = 1 Range("C17,D17,G17,H17,I17").Value = 0 For i = 1 To (NumRnd - 1) a = ExpRnd3(60 / (53.46)) MyA(i, 1) = i + 1 MyA(i, 2) = a MyA(i, 3) = Application.Round(a, 2) Next i MyA(1, 2) = MyA(499, 2) MyA(1, 3) = MyA(499, 3) Range("B18").Resize(NumRnd - 1, 3).Value = MyA Erase MyA End Sub Private Function ExpRnd3(ByVal a As Single) As Single Dim u As Single u = Rnd ExpRnd3 = -(1 / a) * Log(u) End Function Private Sub GenExpRnd4() 'M1サービス分布' Dim NumRnd As Integer, i As Integer, b As Single Dim MyA(1 To 500, 1 To 2) As Double NumRnd = 500 With Range("E16:F16") .Cells(1).Value = "サービス時間" Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With For i = 1 To NumRnd b = ExpRnd4(60 / 6.095) MyA(i, 1) = b MyA(i, 2) = Application.Round(b, 2) Next i MyA(1, 1) = MyA(500, 1) MyA(1, 2) = MyA(500, 2) Range("E17").Resize(500, 2).Value = MyA Erase MyA End Sub Private Function ExpRnd4(ByVal b As Single) As Single Dim u As Single u = Rnd ExpRnd4 = -(1 / b) * Log(u) End Function Private Sub M1() GenExpRnd3 GenExpRnd4 Range("G18:G516").Formula = "=D18 + G17" Range("J17").Value = Range("F17").Value Range("J18:J516").Formula = "=I18 + F18" Range("I18:I516").Formula = "=Max(J17,G18)" Range("H18:H516").Formula = "=Countif($J$17:J17,"">""&G18)" Range("K17:L516").Formula = "=I17-G17" End Sub Private Sub GenExpRnd5() 'M2到着分布' Dim NumRnd As Integer, i As Integer, c As Single Dim MyA(1 To 499, 1 To 3) As Variant NumRnd = 500 With Range("O16:P16") Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With Range("N16:O16").Value = Array("No", "到着間隔") Range("S16:X16").Value = _ Array("到着時間", "行列人数", "開始時間", "終了時間", _ "開始待ち時間", "終了待ち時間") Range("N17").Value = 1 Range("O17,P17,S17,T17,U17").Value = 0 For i = 1 To (NumRnd - 1) c = ExpRnd5(1 / (5.2 * 3)) MyA(i, 1) = i + 1 MyA(i, 2) = c MyA(i, 3) = Application.Round(c, 2) Next i MyA(1, 2) = MyA(499, 2) MyA(1, 3) = MyA(499, 3) Range("B18").Resize(NumRnd - 1, 3).Value = MyA Erase MyA End Sub Private Function ExpRnd5(ByVal c As Single) As Single Dim u As Single u = Rnd ExpRnd5 = -(1 / c) * Log(u) End Function Private Sub GammaRnd6() 'M2サービス分布' Dim NumRnd As Integer, i As Integer, d As Single, u As Single Dim MyA(1 To 500, 1 To 2) As Double NumRnd = 500 With Range("Q16:R16") .Cells(1).Value = "サービス時間" Application.DisplayAlerts = False .Merge Application.DisplayAlerts = True .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With For i = 1 To NumRnd u = Rnd d = Application.GammaInv(u, 2.297795591, 5.94047619) 'ガンマ乱数 MyA(i, 1) = d MyA(i, 2) = Application.Round(d, 2) Next i MyA(1, 1) = MyA(500, 1) MyA(1, 2) = MyA(500, 2) Range("Q17").Resize(500, 2).Value = MyA Erase MyA End Sub Private Sub M2() GenExpRnd5 GammaRnd6 Range("S18:S516").Formula = "=P18 + S17" Range("V17").Value = Range("R17").Value Range("V18:V516").Formula = "=U18 + R18" Range("U18:U516").Formula = "=Max(V17,S18)" Range("T18:T516").Formula = "=Countif($V$17:V17,"">""&S18)" Range("W17:W516").Formula = "=I17 - S17" End Sub ++++++++++++++++++++ OS ⇒Windows XP Version⇒Excel 2002 ++++++++++++++++++++ |
[102401] Re[10]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ ss -(2007/11/02(22:03)) □U R L/ Function ExpRnd〜が5つありますが、処理内容が同じなので 1つでいいのではと思います。 乱数はRandmizeで初期化できるはずです。 Subにも似たような?処理が多いので引数や変数をうまく使って Subを分割(似た処理を1つにする)すればコード量がコンパクトに なるのではと思います。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102402] Re[10]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/02(22:06)) □U R L/ こんばんわ 親トピックの「現在はシート1に"M0" と名前付け、シート2に"M1_M2"と名前をつけました。」 はやはり、「Sheet1 の処理については Sheet1 のコードモジュールに、Sheet2 の処理については Sheet2 のコードモジュールに書いた」という意味だったのですね。 それでも、「書きようによって」はコードは正しく動きます。 ですが、「シートのコードモジュールは、イベントコードの為に用意されている」というように 割り切ってしまった方がいいと思います。 [102384] にちょっと書いていますが、 「一連のコードで複数のシートを操作する」為には、 Sheets("Sheet1").Activete Range("A1").Value = 1 Sheets("Sheet2").Activete Range("B1").Value = 2 Sheets("Sheet1").Activete Range("C1").Value = 3 のようすれば、Sheet1 の A1 に 1、Sheet2 の B1 に 2、Sheet1 の C1 に 3 という処理が 出来ますが、それが「保証される」のは、「標準モジュール」に書いた時です。 もし、Sheet1 のコードモジュールに同じ事を書くと、Sheet2 の B1 に 2 の所でエラーに なります。これは、Range("B1") のように、親オブジェクトを省略すると、 必ず Sheet1 のというように、エクセルが解釈するような決まりになっているからです。 もし、Sheet2 のコードモジュールに同じ事を書くと、Sheet1 の A1 に 1 の所でエラーに なります。同じ理屈です。 それを避けるには、 Sheets("Sheet1").Range("A1").Value = 1 Sheets("Sheet2").Range("B1").Value = 2 Sheets("Sheet1").Range("C1").Value = 3 のようにすれば、シートのコードモジュールに書いたコードでもエラーにはなりませんが、 そもそも、シートのコードモジュールは、通常のプロシージャを書く場所では無いと理解して 下さい。 「標準モジュール」では、上記の2例とも正しく動きますが、どちらがスマートか 明らかでしょう。そして、シートを切り替えたりしていない分、実行速度も速くなります。 「ぼくが超初心者」 基本的な決まり事のいくつかの知識については、確かにそうかも知れませんが コードの内容を見る限り、「超初心者」では決して無いです。 特に「Moudle2」に移したコードですが、わたしのコードにならって変更されたのでしょうが、 それだけでも「超初心者」ではないですね。 また、わたしは気を効かせたつもりでしたのですが、「Private Sub 〜」「Private Fucttion 〜」 「Public Sub 〜」とかしましたが、今回は、それらの「Private、Public」は付けないことにします。 これも、次回のレスでちょっと説明しますが、 ' ひとつだけわたしの質問に答えて下さい。 Public Sub M0_M1() で、 M0 M1 を実行したあと、520 行以下に数式を書き込んだりするコードがありますが、 これは、「どのシート」に対して処理するものですか? この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102406] Re[11]: vlookupどう使えばいいですか- ■記事引用/メール受信=ON■ □投稿者/ 山下 健志 -(2007/11/02(23:25)) □U R L/ こんばんは。 >「Private、Public」は付けないことにします。 ご指導とおり、削除しました。 > Sheets("Sheet1").Activate Range("A1").Value = 1 Sheets("Sheet2").Activate Range("B1").Value = 2 Sheets("Sheet1").Activate Range("C1").Value = 3 これを宣言することが大事だと教えていただいたんですが、Moudle1のなかに書くなんですか。そして動のように書くんですか。確かにこれを宣言しないと、開始時間・待ち時間の計算式が実行結果で合っていますが、結果がマイナスでわかったからです。 > Public Sub M0_M1() で、 M0 M1 を実行したあと、520 行以下に数式を書き込んだりするコードがありますが、 これは、「どのシート」に対して処理するものですか? 検索値がシート1で、検索範囲がシート2をしたいつもりです。シート1の中、終了時間の値をシート2の到着時間から最も近い値を検索したいからです。 appleさん、他の皆様、よろしくお願いします。 |
[102408] Re[12]: vlookupどう使えばいいですか- ■記事引用/メール受信=OFF■ □投稿者/ apple -(2007/11/03(00:18)) □U R L/ こんばんわ >検索値がシート1で、検索範囲がシート2をしたいつもり わたしが聞きたかったのは、Sheet1 に数式を設定するのか、Sheet2 にするのかを確認したかった のです。Sheet1 にであろうとは思っていますが確認したかったのです。 わたしは、処理速度を速くする為に、「配列」を使ったりして、山下さんのコードを弄っては いますが、そもそもの目的も分からないし、知りたいとも思いません。 処理を速くするという事で、手伝っているにすぎません。 「エラーが出て、コードが止まってしまう」とならないようには解決出来ていますが、コードは もう少し提示しないで置きます。 一般関数の VLOOKUP については理解しているのですよね。 >終了時間の値をシート2の到着時間から最も近い値を検索したい 一度、一般操作のヘルプで VLOOKUP を調べて下さい。 VLOOKUP(検索値, 範囲, 列番号, 検索の型) の「検索値」を「範囲」に指定した1列目から、調べるのだから、 「範囲」と「 列番号」は違っていませんか? その数式だと、「終了時間の値をシート2の到着時間から」にはならないと思います。 また、「検索の型」が FALSE なら、「完全一致」です。 ' "Sheet1" の D521 以下の「到着時間」は" Sheet2" の J列から探すのではないのですか? 注: Private スコープと Public スコープ 簡単にいうと、標準モジュールで Public Sub 〜、Public Function 〜 としたプロシージャは 何処からでも呼び出して使う事が出来ます。(ただの Sub 〜 は、Public と同じ) Private としたものは、同じモジュールのコードからしか呼び出すことは出来ません。 (絶対に出来ないという事ではありませんが、余程の事情が無い限り、そんな使い方をする人は いないと思います。) わたしが、「気を効かしたつもり」になったのは、Private とすると、マクロの一覧には 表示されないようになるからなのですが、2つのモジュールのコードとなると、 呼べなくなる(エラーになる)場合も考えられるので、山下さんの知識が増えれば、その辺の 仕組みも分かると思いますので、使い分けはそれからでいいと思います。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[102424] Re[13]: vlookupどう使えばいいですか- ■ □投稿者/ 山下 健志 -(2007/11/04(00:18)) □U R L/ こんばんは。 apple先生、ご教授ありがとうございます。Private スコープと Public スコープの件についてよく理解しました。 昨日から試行錯誤の結果、まずは >' "Sheet1" の D521 以下の「到着時間」は" Sheet2" の J列から探すのではないのですか? につきましては、J列ではなく、G列でした。そしてvlookup関数式も問題が発生したんで、 Range("F521:F670").Formula = "=Vlookup(D521,sheet2!C$16:$L$516,5,FALSE)"→ Range("F521:F670").Formula = "=Vlookup(D521,sheet2!G$16:$L$516,1,True)"にしました。 次に、Moudleにおいたマクロの名前はM1のようにしたらいけないのようで、M_1にしたら、プログラムが動きました。原因は何でしょうかまだ究明できないですが、ひとまず一歩前進です。 最後には、モジュール1の中、マクロ「M0-M1」のなか、M0とモジュール2においたM1が不要で動けますんで、これが一番の山を乗り越えたじゃないかなと思います。 これからわからないことはいっぱい出てきますので、またのご指導、ご指摘、よろしくお願いします。 |
このトピックに書きこむ |
---|