[No.5 変数・乱数・定数 ]
[No.6 ファイルの起動場所を知る方法 ]
[No.7 MDBと同フォルダのExcelファイルを開く]
[No.8 配列とArray関数]
[No.9 If文で範囲のチェック]
www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.5 2002/11/19
変数・乱数・定数
[ページTOPへ戻る]

<変数・乱数・定数>

今回は、 変数・乱数・定数 とXX数で攻めてみたいと思います。 /* * 1.変数ってなんですかぁ? */ 一直線プログラムはプログラムじゃない? なんて声が聞こえてきそうですが、 分岐、ループの前に、今回は、 変数 を軽めに書こうと思います。 Sub test() MsgBox "プログラムは、上から下に流れます" MsgBox "まんなか、、" MsgBox "今日も一日がんばりましょう" MsgBox "こんな感じです" End Sub と前回は上から下へ固定の動きをするプログラムを書いてました。 変数って、言葉で説明すると説明しにくいんだけど (それは、三流君が説明ベタってことだよねぇ(笑)) はじめは、 値を入れる、記憶するハコ(メモリ)に名前を付けて使う って感じで覚えておいてもらえると、ありがたいです。 またまたぁ、どんな感じだっての? Sub test2() Dim a As Integer a = 10 MsgBox a End Sub まず、変数を使用するには、変数宣言をします。 宣言の方法は、 Dim a As Integer dim 変数名 as 変数の型です。 aって名前のInteger型の変数をこれから使うよ(確保します) a = 10 変数aに10を代入します。 MsgBox a メッセージボックス関数で変数aを表示します。 質問、Integer型って何よ?初耳です私。 まぁ、a=10は代入ってのは、なんとなくわかるけど。。。さ。 変数の型ってのは、いっぱいあって主なのだけ書くけど、 整数型 (Integer) 2 バイト -32,768 〜 32,767 長整数型 (Long) 4 バイト -2,147,483,648 〜 2,147,483,647 単精度浮動小数点数型 (Single) 4 バイト 倍精度浮動小数点数型 (Double) 8 バイト 文字列型 (String) (可変長) 10 バイト + 文字列の長さ 0 〜 2GB 日付型 (Date) 8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日 オブジェクト型 (Object) 4 バイト オブジェクトを参照するデータ型 なんてのがあります。 で? でっと言われてもなぁ。 使用するものに合った型を選んでください。とそっけなく言ってみたり。 次のサンプルを見て下さい。 Sub test3() '変数の定義 Dim a As Integer Dim b As Integer Dim c As Integer '代入と計算 a = 5 b = 7 c = a * b MsgBox c '結果表示 End Sub まぁ、余裕ですね? a,b,cの名前を付けた変数を宣言して、 aに5をBに7を代入、 cには、a*bの計算結果が代入されます。 で、結果を表示。 三流君さぁ、オイラ、Excelで表作ったりしてるんだよ、 C3のセルに=a1*b1とかやってるし、 あまりなめたマネしないでくれる? もしかして、*は×で/が÷ですなんて説明するつもり?だったとか? ギク、、、+−*/はご存知でしたか。 そっか、Excelで計算式作ってるから、みなさん、式はOKかなぁ。 変数って言ってるけど、セルの番地みたいなもんと軽く覚えてもらえば、 いいのか。セルも値が入るハコだしねぇ。 Dim a1 As Integer の整数型でa1を宣言する まぁ、イメージの問題なので、わかりやすいほうで。 だと、下記は理解に苦しむ式になるのでは? Sub test4() '変数の定義 Dim a As Integer '初期値の代入 a = 1 '計算式 a = a + 1 a = a + 1 MsgBox a '結果表示 End Sub ポイントは、a = a + 1ですね。 数学だとありえない等式だ、、、なんて言わないで、 =記号は代入だと覚えてください。 先に右辺の計算 a+1を行い、結果をaに代入します。 この感覚を違和感無く使えるようにすぐなるんだけど。 結果は?(自分で試してみてください) 変数には、いろいろな型がある、 =は代入です。 いろいろ引っ張りまわしたけど、今回はこれだけでよかったのかも。 /* * 2.定数って知ってますか? */ a = a + 1 の変数は、チョット置いといて、 定数って、いきなり言われても???だと思います。 有名な定数で、vbCrLfってのかあります。 使い方は、 Sub test1() MsgBox "三流君" & vbCrLf & "丁寧に解説しろ" End Sub なんて感じで使用します。 このテストを実行すると、画面に 三流君 丁寧に解説しろ と改行されて、表示されます。 あっそ、で三流君、このvbCrLfってのは、なに? 別の人から、 キャリッジ リターン chr(13) と ライン フィード chr(10) を組み合わせると、改行されるって聞いたことあるけど、 それとは、ちがうの? えっと、同じなのですが、 書き方として、 Sub test2() MsgBox "三流君" & Chr(13) & Chr(10) & "丁寧に解説しろ" End Sub と書くと、13ってなに?10って?になるので、 定数として、 Chr(13) + Chr(10) を vbCrLfとして扱えるんですよ。 そのほうが、わかりやすいでしょ? Sub test3() MsgBox "三流君" & Chr(9) & "丁寧に解説しろ" End Sub だと、9ってなに?ってことになりませんか? vbTab Chr(9) タブ文字 なんですねぇ。 VBAで使う定数は、 パターン的にvb****と名前がついているので、 出てきたらみてください。 なんか、イマイチしっくりこないなぁ。 あとは、関数のパラメーターとかでよく見かけると思います。 Sub test4() MsgBox StrConv("abCDef", vbWide) End Sub のvbwideってのも定数です。 これらの定数は Visual Basic で定義されているものです。 なので、実際の値の代わりに使用できます。 まだ、よくわかんないけど、慣れてくれば違和感無くvb**って使えるのかなぁ。 /* * 3.乱数って知ってますか? */ 変数、定数、、と来たから、 今回は強引に乱数を行ってみたいと思います。 乱数って、いきなり言われても???だと思います。 小学校の国語の先生は言いました、 漢字には意味があると、 乱れた数なんですね(乱れるのは酒の席だけにしろ?) 三流君がまた、わけわかんないこと言ってるよ、 小学校は担任だろ、中学から国語の先生・数学の先生に分かれるんでしょ。。。 いつもの前置きはこれくらいにして、 業務プログラムなどではめったに使用しないのですが、 ゲームとかでパソコンにサイコロを振らせたい時、 ランダムな数字がほしい時に使用します。 使い方は簡単で、 Sub test() Dim saikoro As Integer Randomize ' 乱数発生ルーチンを初期化します。 saikoro = Int((6 * Rnd) + 1) ' 1 から 6 までの乱数を発生させます。 MsgBox "サイコロの数は、" & saikoro & "です" End Sub って感じです。 実行してみると毎回値が違っていると思います たまに同じ値が連続するけど。 ポイントは、 数値を受け取りたいので、 Dim saikoro As Integer とInt型の変数を宣言します。 次に、Randomizeステートメントで乱数表を初期化します。 ここがメインかなぁ、 saikoro = Int((6 * Rnd) + 1) で 1 から 6 までの乱数を発生させます。 最後に結果を表示させます。 6 * Rnd + 1 で1から6なので、 RPGなどで、12面ダイズの値がほしければ saikoro = Int((12 * Rnd) + 1) として下さい。 丁半博打の場合は、 saikoro = Int((6 * Rnd) + 1) + Int((6 * Rnd) + 1) ってのもありですね。 インチキ恋愛運測定機は Sub test2() Dim abc As Integer Randomize ' 乱数発生ルーチンを初期化します。 abc = Int((100 * Rnd) + 1) ' 1 から 100 までの乱数を発生させます。 MsgBox "今日の恋愛運は、" & abc & "%です" End Sub です、信じるも信じないもあなたの心一つです(謎) /* * 4.Constで定数宣言 */ Constで定数宣言を書いてみたいと思います。 No.003で解説した下記のプログラムだと、 ファイルの場所が、 "D:\vba002\TYPE.xls" とプログラム中に3ヶ所埋まってます。 /vba/backno/vba003.html In message "[VBAで楽しく No.003] - Dir関数でファイルの存在をチェックする", >Private Sub コマンド0_Click() >On Error GoTo Err_コマンド0_Click > > Dim oApp As Object > > '*3ファイルの存在をチェックする > If Dir("D:\vba002\TYPE.xls") = "" Then > MsgBox "D:\vba002\TYPE.xls を 確認して下さい" > Exit Sub '途中で抜ける > End If > > Set oApp = CreateObject("Excel.Application") > oApp.Visible = True > 'Only XL 97 supports UserControl Property > oApp.UserControl = True > > '*1↓頭にCreateObjectで作成した変数を追加しただけ > oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" > '^^^^ > > '*2 Range("A1").Value ="XXXX" でデータをセットする > oApp.Range("B4").Value = Me![ID] > oApp.Range("C4").Value = Me![Name] > oApp.Range("B6").Value = Me![Address] > oApp.Range("D7").Value = Me![TEL] > >Exit_コマンド0_Click: > Exit Sub > >Err_コマンド0_Click: > MsgBox Err.Description > Resume Exit_コマンド0_Click > >End Sub フォルダーの変更をした時には、全てのヶ所を修正しないといけません。 そこで、 Constを使用した定数宣言を行います。 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Const strXLSFILE As String = "D:\vba002\TYPE.xls" '*4^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim oApp As Object 'ファイルの存在をチェックする If Dir(strXLSFILE) = "" Then MsgBox strXLSFILE & " を 確認して下さい" Exit Sub '途中で抜ける End If Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:=strXLSFILE '^^^^ '*2 Range("A1").Value ="XXXX" でデータをセットする oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub 使用方法は、 Const 変数名 as Type = 値 と書きます。 Const strXLSFILE As String = "D:\vba002\TYPE.xls" If Dir(strXLSFILE) = "" Then と使用しているので、環境が変化した時は、 頭の Const strXLSFILE As String = "D:\vba002\TYPE.xls" を Const strXLSFILE As String = "F:\DATA\make\TYPE.xls" など書き直せば動作するので、 メンテナンスがラクです。 固定の値を使用する時は、 Constで宣言してみてください。

No.6 2002/11/20
ファイルの起動場所を知る方法
[ページTOPへ戻る]

<ファイルの起動場所を知る方法>

こんにちは、Ken3です。 今回は、VB,Access,Excelなどで、 ファイルの起動場所を知る方法 です。 VB,Access97/2000,Excelによって、違うので、4パターン書きました。 実行できるサンプルを http://www.ken3.org/vba/lzh/vba006.lzh からダウンロード可能にしました。使ってみてください。 Excel,Access,VB の順番に解説します。 /* * 1.Excel97/2000 VBA ここはどこ?私は誰? */ Excelファイルが、 どこから起動したか(どこに保管されているか) 知りたい時、ありませんか? えっ、無い。。。さようなら。 じゃなくて、相対パスとかで、 処理したいとき、知っていると便利だと思うので、説明します。 *各処理言語によって、微妙にちがう、、、VBAで一緒にならないの?かなぁ ----- Sub Record1() MsgBox "Application.Path = " & Application.Path MsgBox "Application.Name = " & Application.Name MsgBox "ActiveWorkbook.Path = " & ActiveWorkbook.Path MsgBox "ActiveWorkbook.Name = " & ActiveWorkbook.Name End Sub ----- を実行してみてください。 Application.Pathかな?と思ったのですが、 これは、Excel本体のインストールされているパスで、 目的のほうは、 ActiveWorkbook.Pathです。 う〜ん。。。 実行結果:



/* * 2.Access97/2000 VBA ここはどこ?私は誰? */ ア.Access97 MDBの位置です。 ----- Private Sub B_RUN_Click() MsgBox "CurrentDb.Name = " & CurrentDb.Name MsgBox "CurrentDb.Version = " & CurrentDb.Version End Sub ----- よく、わからなかったので、 CurrentDbを開いて、.Nameを見てます。 *ここの.Nameってパス付きなんだよね、、、逆に.Pathがなかったような? 実行結果:

イ.Access2000 MDBの位置です。 でもAccess2000だと、 CurrentProject. ってオブジェクトがあって、 プロパティの .Name .Path を使うと楽に取れそうです。 Option Compare Database Option Explicit Private Sub B_RUN_Click() MsgBox "CurrentDb.Name = " & CurrentDb.Name MsgBox "CurrentDb.Version = " & CurrentDb.Version MsgBox "CurrentProject.Name = " & CurrentProject.Name MsgBox "CurrentProject.Path = " & CurrentProject.Path '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^こんな感じ End Sub う〜ん、、、 実行結果:

/* * 3.VB5 ここはどこ?私は誰? */ 次にVB5です(私の環境VB5です、、、) ---- Private Sub Command1_Click() MsgBox "App.Path = " & App.Path MsgBox "App.EXEName = " & App.EXEName End Sub ---- あれ、Appなの、、こんどは。。。 で、.EXENameですか、、、 実行結果:

/* * 4.終わりの挨拶 */ 今回は、 起動場所を知る方法を 書いてみました。 Excel,Access,VB と微妙に違ったので、なぜ?と思いました。 まぁ、気にしない、気にしない、、、 感想・質問などあったら、掲示板に書いてもらえるとうれしいです 三流プログラマーのKen3でした。

No.7 2002/11/23
MDBと同フォルダのExcelファイルを開く
[ページTOPへ戻る]

<MDBと同フォルダのExcelファイルを開く>

こんにちは、Ken3です。 前回、VB,Access,Excelなどで、 ファイルの起動場所を知る方法 をやったので、 今回は、単に応用して、 AccessのMDBと同フォルダのExcelファイルを開いてみたいと思います。 前回からの復習も兼ねて、いつものように遠まわしで説明してるので、 暇な人はお付き合いを。 実行できるサンプルを http://www.ken3.org/vba/lzh/vba007.lzh からダウンロード可能にしました。使ってみてください。 /* * 1.仕様、やりたいこと */ プログラムを組む前には、どんなことやりたい? こんなこと? など、作りたい最終結果のイメージをもらいます。 In message "[VBAで楽しく No.002] - AccessからExcel出力", > >現在、Access2002にてデータを管理する物を作って、 > >仕事で使用しているのですが、 > >これまでは、抽出データをレポートに出力するだけでよかったのですが、E > >xcelの定型フォーマットへ出力することになりました。 > > > >Helpでは、「TransferSpreadsheet」 メソッドで出来る様な事は記載されて > >いるのですが、決まったフォーマットへデータの埋め込みは > >出来そうも有りません。 > >どのようにやったら、実現出来るのでしょうか? > > > >例 > > > >ID・・・・・・セルB4 > >Name・・・・・セルC4 > >Address ・・・セルB6 > >TEL ・・・・・セルD7 > > > >こんな感じで、このデータはこのセルといった具合に > >出力セルを指定したいのです。 --- とか、やりたいことを聞きます。 まぁ、ここからの仕様の理解度、プログラムへの落し方が 意外と評価をわけたり、腕の見せ所なんだけど、 /* * 2.仕様の理解度? まずは、固定処理 */ えっと、AccessからExcelファイルを開いて、 データをセットすればいいんだろ? Excelのファイルは、 D:\vba002\TYPE.xls を開いて、 フォーム上の値を ID・・・・・・セルB4 Name・・・・・セルC4 Address ・・・セルB6 TEL ・・・・・セルD7 にセットすればいいや と理解した場合は、 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" '^^^^ '*2 Range("A1").Value ="XXXX" でデータをセットする oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub とこんな感じかなぁ。 /vba/backno/vba002.html に画像付きで詳細あるけど、 最低限の、Excelを開いて、データをセットすることは出来たのかなぁ。 /* * 3.エラーチェックを追加、修正ヶ所を少なくする。 */ まぁ、次のレベルに進むと(自然に慣れて来るんだけど) エラー処理やプログラムの修正ヶ所を少なくする、 なんて工夫を身につけると思います。 /vba/backno/vba003.html に詳細あるけど、 In message "[VBAで楽しく No.003] - Dir関数でファイルの存在をチェックする", mag2 ID 0000099159さん wrote... >Dir("ファイル名") >で見つからなかった時に長さ0の文字列を返してくるので、 >If Dir("D:\vba002\TYPE.xls") = "" Then >でチェックできます。 > >Private Sub コマンド0_Click() >On Error GoTo Err_コマンド0_Click > > Dim oApp As Object > > '*3ファイルの存在をチェックする > If Dir("D:\vba002\TYPE.xls") = "" Then > MsgBox "D:\vba002\TYPE.xls を 確認して下さい" > Exit Sub '途中で抜ける > End If > > Set oApp = CreateObject("Excel.Application") > oApp.Visible = True > 'Only XL 97 supports UserControl Property > oApp.UserControl = True > > '*1↓頭にCreateObjectで作成した変数を追加しただけ > oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" > '^^^^ > > '*2 Range("A1").Value ="XXXX" でデータをセットする > oApp.Range("B4").Value = Me![ID] > oApp.Range("C4").Value = Me![Name] > oApp.Range("B6").Value = Me![Address] > oApp.Range("D7").Value = Me![TEL] > >Exit_コマンド0_Click: > Exit Sub > >Err_コマンド0_Click: > MsgBox Err.Description > Resume Exit_コマンド0_Click > >End Sub > >*3 >みたいな感じでファイルの存在をチェックできます。 > >へぇ〜、よかったね。 >でも、 >D:\vba002\TYPE.xls >固定なんでしょ? >Dドライブの無いマシーンにインストールする時は、 >プログラム直さないと動作しないジャン? > >oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" >を >oApp.Workbooks.Open FileName:="C:\vba002\TYPE.xls" >とかにね。 --- Dir関数を使って、 Excelの元ファイルが存在するかの エラーのチェックは出来たよね。 ここで問題だったのが、 固定で、 D:\vba002\TYPE.xls となってましたよね。 小細工で一ヶ所修正すればOKにするために、 Constで変数宣言を行いました。 http://www.ken3.org/backno/backno_vba02.html#5-4 に詳細あるけど、 In message "[VBAで楽しく No.005] - 変数・乱数・定数", >フォルダーの変更をした時には、全てのヶ所を修正しないといけません。 >そこで、 >Constを使用した定数宣言を行います。 > >Private Sub コマンド0_Click() >On Error GoTo Err_コマンド0_Click > > Const strXLSFILE As String = "D:\vba002\TYPE.xls" > '*4^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > Dim oApp As Object > > 'ファイルの存在をチェックする > If Dir(strXLSFILE) = "" Then > MsgBox strXLSFILE & " を 確認して下さい" > Exit Sub '途中で抜ける > End If > > Set oApp = CreateObject("Excel.Application") > oApp.Visible = True > 'Only XL 97 supports UserControl Property > oApp.UserControl = True > > '*1↓頭にCreateObjectで作成した変数を追加しただけ > oApp.Workbooks.Open FileName:=strXLSFILE > '^^^^ > > '*2 Range("A1").Value ="XXXX" でデータをセットする > oApp.Range("B4").Value = Me![ID] > oApp.Range("C4").Value = Me![Name] > oApp.Range("B6").Value = Me![Address] > oApp.Range("D7").Value = Me![TEL] > >Exit_コマンド0_Click: > Exit Sub > >Err_コマンド0_Click: > MsgBox Err.Description > Resume Exit_コマンド0_Click > >End Sub > >使用方法は、 >Const 変数名 as Type = 値 >と書きます。 >Const strXLSFILE As String = "D:\vba002\TYPE.xls" > >If Dir(strXLSFILE) = "" Then >と使用しているので、環境が変化した時は、 >頭の >Const strXLSFILE As String = "D:\vba002\TYPE.xls" >を >Const strXLSFILE As String = "F:\DATA\make\TYPE.xls" >など書き直せば動作するので、 >メンテナンスがラクです。 と Constを使用すると、プログラムの修正が楽なんですよ なんて、強引にConstの説明に使用してましたね。 長いよ説明が・・・で何がいいたいの? えっと、 エラーチェックは入れましょうね と プログラムを修正しやすくするには かなぁ。 さらに一歩進めて、 プログラムを直さなくても動作する そんなことは出来ないの? /* * 4.MDBと同フォルダのExcelファイルを開く */ さて、長かった前置きもこれくらいにして、 MDBと同フォルダのExcelファイルを開く をやってみましょう。 プログラムの仕様、やりたいことを少し変更します。 動作仕様 Accessのフォームからデータセットのボタンが押されたら、 MDBと同一のフォルダー\TYPE.xls (Excelのフォーマットファイル) を開いて、 フォーム上の値を ID・・・・・・セルB4 Name・・・・・セルC4 Address ・・・セルB6 TEL ・・・・・セルD7 にセットする。 同一のフォルダー\TYPE.xls が 存在しない場合は、 「インストールを確認して下さい」 とメッセージを表示し、何もしないで終了する。 なんか長くなったよね、 えっと、AccessのMDB起動位置を知るには、 http://www.ken3.org/backno/backno_vba02.html#6-2 で、 CurrentDb.Name なんて説明してたっけ、 ここに、D:\xxxx\yyyy\zzz.mdbが入っているから、 ここからフォルダーを抜き出して、 と 処理を追加すると下記のようになります。 Aさん、Bさんのマシーンでインストール位置が違っても、 同じフォルダーにMDBとXLSを置いておけば 動作します。 少しは、カッコいいプログラムになったかなぁ。 えっ、まだまだだって? いろいろとアナがあるけど、また今度かなぁ。 *気が付いてるバグ、D:のルートだとバグるよ(笑) 実行できるサンプル http://www.ken3.org/vba/lzh/vba007.lzh を落して、遊んでみてください。 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim strXLSFILE As String 'Excelのファイル名格納場所 Dim oApp As Object 'Excelを操作するオブジェクト変数 Dim strMDBPATH As String Dim strWORK As String Dim i As Integer 'カウンター変数 'Accessの起動位置を取得 CurrentDb.NameにD:\xxxx\yyyy\zzz.mdbが入っている strWORK = CurrentDb.Name '後ろから1文字単位で¥を探す For i = Len(strWORK) To 1 Step -1 If Mid(strWORK, i, 1) = "\" Then Exit For '¥だったら抜ける Next i 'D:\xxxx\yyyy\zzz.mdb --> D:\xxxx\yyyy\ にする strMDBPATH = Mid(strWORK, 1, i) 'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + TYPE.xls strXLSFILE = strMDBPATH & "TYPE.xls" 'ファイルの存在をチェックする If Dir(strXLSFILE) = "" Then MsgBox strXLSFILE & " を 確認して下さい" Exit Sub '途中で抜ける End If Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:=strXLSFILE '^^^^ '*2 Range("A1").Value ="XXXX" でデータをセットする oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub /* * 5.終わりの挨拶 */ 今回は、 過去のメルマガの復習? と 環境の変化に強いプログラムって? を少し書いてみました。 感想・質問などあったら、掲示板に書いてもらえるとうれしいです 三流プログラマーのKen3でした。

No.8 2002/11/24
配列とArray関数
[ページTOPへ戻る]

<配列とArray関数>

こんにちは、 回りくどい解説中の三流プログラマーKen3です。 今回は、変数の配列をやってみたいと思います。 配列っていっても、そんなたいしたことじゃないのでご安心を。 /* * 1.配列変数って?なに?どう使うの? */ Sub test4() Dim a(4) As String '(*1) a(0) = "デフォルトのベースは0から" '(*2) a(1) = "始まりました" '(*3) a(2) = "解説かぁ、、、" a(3) = "配列ねぇ、何だろうね" a(4) = "単に(n)で参照、、う〜ん" MsgBox a(1) MsgBox a(3) '(*4) End Sub 上記、簡単なサンプルなのですが、 dim の変数宣言でいつもと違うのが Dim a(4) As String '(*1) ^^^↑の(4) ですね。 これは、変数aを0から4まで取ります。 値の格納は、普通に、 a(0) = "デフォルトのベースは0から" '(*2) と変数名(インデックス番号)で行えます。 a(1) = "始まりました" '(*3) は、変数aのインデックス1に"始まりました" を代入です。 MsgBox a(3) '(*4) は、メッセージボックスで変数aインデックス3の値を表示します。 だから何?って感じですよね(笑) 1から3の乱数を発生させて、 1の時グー 2の時チョキ 3の時パー と 表示さるプログラム、If文使用で書きました。 Sub test2() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*1) 1 から 3 までの乱数を発生させます。 '結果を判断し、Msgboxで表示する If n = 1 Then '(*2) nが1か判断する MsgBox "グーを出しました" End If If n = 2 Then MsgBox "チョキを出しました" End If If n = 3 Then MsgBox "パーを出しました" End If End Sub 流れは、 ア.変数宣言・初期化などの前準備、 イ.1から3の乱数を発生させる(*1) ウ.結果を判断し、1の時グー,2の時チョキ,3の時パーを表示させる(*2) でした。 これを配列変数を使った方法に変更すると、 Sub test4() Dim n As Integer '値を格納する変数を定義する Dim a(3) As String '(*1) グー,チョキ,パーを格納する配列変数を定義 '(*2)前準備で結果メッセージを格納しておく a(1) = "グー" a(2) = "チョキ" a(3) = "パー" '乱数を発生させ、コンピュータの手を決める Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*3) 1 から 3 までの乱数を発生させます。 '結果の表示 MsgBox a(n) & "を出しました" '(*4) 結果を表示する End Sub まずは、変数宣言です。 Dim n As Integer '値を格納する変数を定義する Dim a(3) As String '(*1) グー,チョキ,パーを格納する配列変数を定義 まぁ、前準備の変数宣言です。 次がポイントで、結果を事前にセットします。 '(*2)前準備で結果メッセージを格納しておく a(1) = "グー" a(2) = "チョキ" a(3) = "パー" 普通に考えて、a(1)に文字列グーを代入って感じですね。 で、乱数を発生させて、コンピュータの手を決めます。 最後に、 '結果の表示 MsgBox a(n) & "を出しました" '(*4) 結果を表示する で結果を表示してます。 変数aの(n)番目に&演算子で"を出しました"を連結させて表示します。 同じ処理結果のプログラムでも、いろいろな書き方が出来ます。 なんか、いろいろ書きましたが、 あまり気にしないで下さい、慣れると思います。 /* * 2.初期化でArrayを使用する */ Array 関数ってのがあって、 配列が格納されたバリアント型 (Variant) の値を返します。 なんて言われても、?ですよね。 Sub Macro1() Dim n As Integer '値を格納する変数を定義する Dim a As Variant '*1 変数をVariantで宣言 '(*2)結果メッセージをArrayで代入する a = Array("", "グー", "チョキ", "パー") '乱数を発生させ、コンピュータの手を決める Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) ' 1 から 3 までの乱数を発生させます。 '結果の表示 MsgBox a(n) & "を出しました" ' 結果を表示する End Sub 変化した部分は、 Dim a As Variant '*1 変数をVariantで宣言 とa(10)みたいに配列の要素数を書かないで、 As Variantと書いて、 '(*2)結果メッセージをArrayで代入する a = Array("", "グー", "チョキ", "パー") ここで代入してます。 小細工で"",を始めに書いて、0番目の代入を飛ばしてます。 なんとなく、 a(1) = "グー" a(2) = "チョキ" a(3) = "パー" でタテに書いたほうがわかりやすいんだけど・・・ そんな意見もありますね。 /* * 3.終わりの挨拶 */ 今回は、 軽めに、配列変数とは? を少し書いてみました。 感想・質問などあったら、掲示板に書いてもらえるとうれしいです *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。

No.9 2002/11/26
If文で範囲のチェック
[ページTOPへ戻る]

<If文で範囲のチェック>

こんにちは、 回りくどい解説中の三流プログラマーKen3です。 今回は、 If文とSelect Case文 で 範囲のチェックをやってみたいと思います。 そんなたいしたことじゃないのでご安心を。 /* * 1.If文で範囲チェック */ If文で範囲チェックをやってみたいと思います。 複数条件のIf文ですが、そんなたいしたことじゃないのでご安心を。 複数条件って言うと、何を思い浮かべますか? えっと、お金持ちでカッコイイ男性、で、ジジ・ババ抜きなら最高 働くなら、労働時間が短い か 自宅から近くの職場 じゃなくって、(それもありだけど?) 1から100の乱数を発生させ、今日の運勢 最高   81〜100 いい感じ 61〜80 ふつう  41〜60 少し悪い 21〜40 最悪    1〜20 とメッセージを出すプログラムを書いてみたいと思います。 If n = 2 Then MsgBox "チョキを出しました" End If と単独の条件は、やりましたね。 If文では、And 演算子 Or 演算子 を使用して、複数の条件を書くことが出来ます。 簡単に書くと、 If 評価する男性 = 金持ち And 評価する男性 = カッコイイ then と書くと、男性が金持ちで なおかつ 男性がカッコイイ両方の条件を満たす時、 If 給料 = 高い Or 場所 = 近い then と書くと、給料が高い か 場所が近い時 どちらかの条件がOKの時です。 ふざけてないで、真面目に解説しろ?って、 話を戻して、 1から100の乱数を発生させ、今日の運勢 最高   81〜100 と表示なので、 数値が81より大きく、100より小さい時なので、 If 乱数 >= 81 And 乱数 <= 100 then If n >= 81 And n <= 100 then となります。 ここから、簡単に書くと、 Sub test5() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 '判断する If n >= 81 And n <= 100 Then '(*2) nが81以上、nが100以下 MsgBox n & "%、最高です" End If If n >= 61 And n <= 80 Then MsgBox n & "%、いい感じです" End If If n >= 41 And n <= 60 Then MsgBox n & "%、普通です" End If If n >= 21 And n <= 40 Then MsgBox n & "%、少し悪いです" End If If n >= 1 And n <= 20 Then MsgBox n & "%、最悪です" End If End Sub ポイントは、 '判断する If n >= 81 And n <= 100 Then '(*2) nが81以上、nが100以下 MsgBox n & "%、最高です" End If の場所です。 nが81以上、nが100以下と二つの条件を判断し、処理を行ってます。 不等号の意味は、そのままで、 if a = 1 aが1の時 if a > 5 aが5より大きい時、6,7,8.... if a >= 5 aが5以上(5含む) 5,6,7,8... if a < 5 aが5より小さい時、4,3,2,1,0,-1,-2.... if a <= 5 aが5以下(5含む) 5,4,3,2... if a <> 5 aが5以外の時、 3,4,6,7... です。 一般的に、左側に変数、右側に定数・変数を書く人が多いです。 が、 逆に書くこともできます。 Sub test6() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 '判断する If 80 < n And n <= 100 Then MsgBox n & "%、最高です" End If If 60 < n And n <= 80 Then MsgBox n & "%、いい感じです" End If If 40 < n And n <= 60 Then MsgBox n & "%、普通です" End If If 20 < n And n <= 40 Then MsgBox n & "%、少し悪いです" End If If 0 < n And n <= 20 Then MsgBox n & "%、最悪です" End If End Sub こんな感じでもOKです。 なんとなく、n > 10 より 10 < n が好きな三流君でした。 同じ処理結果のプログラムでも、いろいろな書き方が出来ます。 なんか、いろいろ書きましたが、 And と Or で複数条件が書けるです。(今回Orはやってませんが) あまり気にしないで下さい、慣れると思います。 できる読者さんの心の中? まだまだ、平気、余裕だね(ホントか?(笑)) /* * 2.If 〜 ElseIfを使ってみよう */ 自分では、あまりつかわない、 If 〜 ElseIf を使ってみたいと思います。 えっ、自分で使わないものを人に教えるなって? まぁまぁ、そんなこと言わないで、拾い読みして下さいよ。。。 少し上で(笑)、If文で範囲チェックを行うプログラムを作りました。 >1から100の乱数を発生させ、今日の運勢 >最高   81〜100 >いい感じ 61〜80 >ふつう  41〜60 >少し悪い 21〜40 >最悪    1〜20 >とメッセージを出すプログラムを書いてみたいと思います。 で、下記の長ったらしいプログラムを書きましたね。 Sub test6() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 '判断する If 80 < n And n <= 100 Then MsgBox n & "%、最高です" End If If 60 < n And n <= 80 Then MsgBox n & "%、いい感じです" End If If 40 < n And n <= 60 Then MsgBox n & "%、普通です" End If If 20 < n And n <= 40 Then MsgBox n & "%、少し悪いです" End If If 0 < n And n <= 20 Then MsgBox n & "%、最悪です" End If End Sub ポイントは、 If 80 < n And n <= 100 Then MsgBox n & "%、最高です" End If で、 80より上で100以下、 60より上で80以下、 とAnd演算子を使用して、順順にチェックしていきました。 人間だったら、こんな考え?の人も居るかも。 57って数字を目で見たら、 81〜じゃないな、 61〜じゃないな 41〜、、おっ、ここだ、でメッセージは普通を出力。 何が言いたいの?三流君、、、 えっとですね、 今回のメッセージ表示は、 80以上だったら、 60以上だったら、 40以上だったら、 20以上だったら、 それ以外 って考え方も出来て、 If文の構文に、ElseIfってのがあって、 プログラムで書くと、 Sub test7() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 '判断する (*2) If 80 < n Then '80より上か? MsgBox n & "%、最高です" ElseIf 60 < n Then '次に60より上か?チェック MsgBox n & "%、いい感じです" ElseIf 40 < n Then MsgBox n & "%、普通です" ElseIf 20 < n Then MsgBox n & "%、少し悪いです" Else '全ての条件にあてはまらない時。 MsgBox n & "%、最悪です" End If End Sub となります、 なんか、見にくくなった?なんて感想もありですが、 ポイントは、 If 80 < n Then '80より上か? MsgBox n & "%、最高です" ElseIf 60 < n Then '次に60より上か?チェック MsgBox n & "%、いい感じです" の ElseIf 60 < n Then で、次の条件をチェックしています。 いろいろと試してみて下さい。 /* * 3.終わりの挨拶 */ 今回は、 軽めに、If文で範囲チェック を少し書いてみました。 感想・質問などあったら、掲示板に書いてもらえるとうれしいです *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]