| vlookupどう使えばいいですか | |
|---|---|
[102335] vlookupどう使えばいいですか- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ 山下 健志 -(2007/11/01(17:29)) □U R L/
++++++++++++++++++++ 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/
| |
[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/
++++++++++++++++++++ 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/
| |
[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/
| |
| このトピックに書きこむ |
|---|