[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.005 変数・乱数・定数

変数・乱数・定数

メルマガ発行内容

<変数・乱数・定数>

今回は、 変数・乱数・定数 と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で宣言してみてください。

フィードバック

英数字を組み合わせた乱数はどうすれば発生できるのでしょうか

>英数字を組み合わせた乱数はどうすれば発生できるのでしょうか。

乱数でアルファベットを使用したい時は、
0から25など数字を乱数で発生させて、'A'+発生させた文字数としてみるのは?

Sub aaa()

  Dim n As Integer
  Dim moji As String

  Randomize   ' 乱数発生ルーチンを初期化します。
  n = Int(25 * Rnd())
  MsgBox n  'これだけだと、数値なので

  '文字を作る
  moji = Chr(Asc("A") + n)  'Asc("A")キャラA+nにする
  MsgBox moji  '作った文字を表示する

End Sub
↓5文字作るなら、ループでまわして1文字1文字&でプラスしてみました。
Sub bbb()

  Dim i As Integer, n As Integer
  Dim moji As String
  Dim strA As String

  'ループで5文字作成する。
  strA = ""  '文字列を空にする
  Randomize   ' 乱数発生ルーチンを初期化します。
  For i = 1 To 5
    n = Int(25 * Rnd())  '乱数を発生させる
    moji = Chr(Asc("A") + n)  '文字を作る
    strA = strA & moji  '作った文字をプラスして文字列を作る
  Next

  MsgBox strA

End Sub
あっ、ごめんなさい、 >英数字を組み合わせた乱数はどうすれば発生できるのでしょうか。 英数字でしたかぁ・・・ それなら0〜9までは、数字で10からAにしてみます
Sub ccc()

  Dim i As Integer, n As Integer
  Dim moji As String
  Dim strA As String

  Randomize   ' 乱数発生ルーチンを初期化します。

  strA = ""  '文字列を空にする
  For i = 1 To 5  'ループで5文字作成する。
    n = Int(35 * Rnd())  '0〜35まで乱数を発生させる
    If n < 10 Then  '10以下は、0〜9の数字文字とする
        moji = Chr(Asc("0") + n)  '文字コード"0"+n
    Else
        moji = Chr(Asc("A") + (n - 10)) '文字"A"+(n-10) nを調整する
    End If
    strA = strA & moji  '作った文字をプラスして文字列を作る
  Next

  MsgBox strA  '結果の表示

End Sub
↑こんな感じで、少し小細工してみました。 Asc("A") を Asc("a") に変えると、小文字になるのでお好きなほうを使ってみてください。 何かの参考となれば幸いです。
VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.005を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・