戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
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
      
      以上のマクロを入力したが、実行速度が非常に遅く、なおかつ下の行列人数のところで、”インデックスが結う広範にありません”とデバッグのエラーメッセージが出ています。
      また誰か見ていただけっるでしょうか。どうぞよろしくお願いします。
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



      ++++++++++++++++++++
      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さんと他の達人様、またのご指導、よろしくお願いします。
      
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [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
      
      
      
      
      
       


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



      ++++++++++++++++++++
      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 〜」とかしましたが、今回は、それらの「PrivatePublic」は付けないことにします。
      これも、次回のレスでちょっと説明しますが、
      
      ' ひとつだけわたしの質問に答えて下さい。
      
      Public Sub M0_M1() で、
      M0
      M1 
      を実行したあと、520 行以下に数式を書き込んだりするコードがありますが、
      これは、「どのシート」に対して処理するものですか?
      
      
      
      
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [102406] Re[11]: vlookupどう使えばいいですか-

    記事引用/メール受信=ON■

    □投稿者/ 山下 健志 -(2007/11/02(23:25))
    □U R L/
      こんばんは。
      >「PrivatePublic」は付けないことにします。
      ご指導とおり、削除しました。
      > 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さん、他の皆様、よろしくお願いします。
      
      
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [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どう使えばいいですか-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ 山下 健志 -(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が不要で動けますんで、これが一番の山を乗り越えたじゃないかなと思います。
      これからわからないことはいっぱい出てきますので、またのご指導、ご指摘、よろしくお願いします。
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G