[No.10 Select Case XX To XX と Is >= XX] [No.11 InputBox関数で簡単な値を受け取る] [No.12 入力結果の判断いろいろ] [No.13 Excel セルに名前を付けてみる] [No.14 Excel 隣のシートを参照して逃げる] |
||
No.10 | 2002/11/27 Select Case XX To XX と Is >= XX |
[ページTOPへ戻る] |
<Select Case XX To XX と Is >= XX>
こんにちは、 回りくどい解説中の三流プログラマーKen3です。 今回は、 Select Case文 で 範囲のチェックをやってみたいと思います。 そんなたいしたことじゃないのでご安心を。 /* * 1.Select Case XX To XX / Is >= XX を使ってみよう */ 今回は、自分は、使ったこと無い、 ア.Select Case Case XX To XX イ.Select Case Case Is >= XX を簡単に書いてみます。 前回、ElseIfを使って、1から100の数字を判断してみました。 >1から100の乱数を発生させ、今日の運勢 >最高 81〜100 >いい感じ 61〜80 >ふつう 41〜60 >少し悪い 21〜40 >最悪 1〜20 >とメッセージを出すプログラムを書いてみたいと思います。 下記、サンプルプログラム。 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 ア.Select Case Case XX To XX で、三流君が説明したい、 今回の、Case XX To XX ってなに? まずは、サンプルから、 Sub test8() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 Select Case n '(*2) n を評価する Case 81 To 100 '(*3)81〜100か判断します。 MsgBox n & "%、最高です" Case 61 To 80 MsgBox n & "%、いい感じです" Case 41 To 60 MsgBox n & "%、普通です" Case 21 To 40 MsgBox n & "%、少し悪いです" Case Else '(*4)全ての条件にあてはまらない時。(1 To 20でも可) MsgBox n & "%、最悪です" End Select '() End Sub まぁ、見たまんまなのですが、 Select Case n '(*2) n を評価する Case 81 To 100 '(*3)81〜100か判断します。 MsgBox n & "%、最高です" Case 61 To 80 MsgBox n & "%、いい感じです" (*2)で判断元の数値はnとしてます。 ポイントの書き方で、 (*3) Case 81 To 100 これで、nが81から100と範囲で判断することが出来ます。 (*4) Case Else '(*4)全ての条件にあてはまらない時。(1 To 20でも可) MsgBox n & "%、最悪です" Case Elseと書くと、 全ての条件に一致しない時に実行するプロックを書くことが出来ます。 範囲チェックしたい時などに使ってみてください。 イ.Select Case Case Is >= XX 次に、Case Is >= ですが、 読者さんより、下記のメールをいただきました。 H.Iさん wrote... >で、今回の「If〜ElseIf」の代替案として「Select」文を使った方が >すっきりとするかな?と思ってメールしてみました。 >(初歩的な事で恐縮ですが) >例えば: > > 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 > >を > > Select Case n > Case Is >= 80 : MsgBox n & "%、最高です" > Case Is >= 60 : MsgBox n & "%、いい感じです" > Case Is >= 40 : MsgBox n & "%、普通です" > Case Is >= 20 : MsgBox n & "%、少し悪いです" > Else : MsgBox n & "%、最悪です" > End Select > >なんてのはどうでしょうか? > ---- メールどうもです。 Case Is >= 80 って書けるんですね。 Sub test9() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 Select Case n ' n を評価する Case Is > 80 '(*5)まず80より上か判断する MsgBox n & "%、最高です" Case Is > 60 '(*6)次に、60より上か判断する MsgBox n & "%、いい感じです" Case Is > 40 MsgBox n & "%、普通です" Case Is > 20 MsgBox n & "%、少し悪いです" Case Else '(*7)全ての条件にあてはまらない時。 MsgBox n & "%、最悪です" End Select '() End Sub (*5)(*6)のように、 Case Is > 80 '(*5)まず80より上か判断する MsgBox n & "%、最高です" Case Is > 60 '(*6)次に、60より上か判断する MsgBox n & "%、いい感じです" と書くことが出来ます。 もちろん、 Case Is < 21 とか、等号を逆にして、最悪からもOKです。 /* * 2.書き方の工夫、見やすい書き方 */ 三流君に最後質問いい? なんですか? 読者のサンプルに、 > Case Is >= 80 : MsgBox n & "%、最高です" って:を使って? 1行に書いてあるんだけど、なに?これ? あっ、通常は1行に1命令なんですが、 :(コロン)で区切って、1行に2命令以上書けるんですよ。 Sub test10() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((100 * Rnd) + 1) '(*1) 1 から 100 までの乱数を発生させます。 Select Case n ' n を評価する Case Is <= 20: MsgBox n & "%、最悪です" Case Is <= 40: MsgBox n & "%、少し悪いです" Case Is <= 60: MsgBox n & "%、普通です" Case Is <= 80: MsgBox n & "%、いい感じです" Case Is <= 100: MsgBox n & "%、最高です" End Select End Sub みたいな感じで、:を使用して、簡潔に書くことも出来ます。 また、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 と書いてるIf文を、 Sub test2() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*1) 1 から 3 までの乱数を発生させます。 '結果を判断し、Msgboxで表示する If n = 1 Then MsgBox "グーを出しました" If n = 2 Then MsgBox "チョキを出しました" If n = 3 Then MsgBox "パーを出しました" End Sub みたいに、 Thenのあと、1行の簡単な命令の場合書くことが出来ます。 でも、命令が1行でも必ずブロック形式の、 If 条件 Then 命令 Else 命令 End If で書く人も居るし、、、 動くことが一番大事ですが、 慣れてきたら、見やすく書くことも必要です。 修正時や解析時も、見易く書かれていると修正し易いです。 /* * 3.終わりの挨拶 */ 今回は、 軽めに、Select Case文で範囲のチェック を少し書いてみました。 感想・質問などあったら、掲示板に書いてもらえるとうれしいです *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。
No.11 | 2002/11/28 InputBox関数で簡単な値を受け取る |
[ページTOPへ戻る] |
<InputBox関数で簡単な値を受け取る>
こんにちは、 わかりにくい解説中でおなじみの(笑)三流プログラマーKen3です。 今回は、 InputBox関数で簡単な値を受け取ってみたい と思います。 なんだか、表示や処理ばかりで、楽しくなかったので、 少しは動きのあるプログラムを作ってみたいなぁって思います。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 Excelで実行できるサンプルを http://www.ken3.org/vba/lzh/vba011.lzh からダウンロード可能にしました。使ってみてください。 /* * 1.InputBox関数で簡単な値を受け取る */ 書式は、 InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) で文字列型 (String) の値を返します。 ア.InputBox関数 通常、InputBox関数を使うのは簡単な入力とかかなぁ。 下記、あなたの名前は?と問い合わせて、 ダイアログボックスを表示して文字列型 (String) の値を受け取ります。 Sub test() Dim strNAME As String '(*1)値を受け取るため文字型の変数を宣言 'ここで、文字を入れる、、 strNAME = InputBox("アナタの名前は?") '(*2)ユーザーに入力させる '結果表示 MsgBox strNAME & "さん、がんばってください" '(*3)結果のメッセージを表示する End Sub '---- (*1)InputBoxから文字列型の値を受け取るので、 Dim strNAME As String と変数宣言を行います。 (*2)プロンプトに"アナタの名前は?"とメッセージを表示し、 ユーザーに入力させるダイアログが表示されます。 (*3)いつもの結果表示です。 実行すると、 名前の入力ダイアログが表示され、文字を入力できます。
入力後、結果が表示されます。
イ.タイトルバーにタイトルを表示してみよう。 三流君に質問、 InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) なのに、 strNAME = InputBox("アナタの名前は?") しか、書かなかったでしょ、なんで?いいの? あっ、これですか? [, title] [, default] などは、パラメーターなのですが、省略できるんですよ。 [, title]を指定すると、こんな感じになります。 Sub test2() Dim strNAME As String '(*1)値を受け取るため文字型の変数を宣言 'ここで、文字を入れる、、 strNAME = InputBox("アナタの名前は?", "お名前確認") '(*4)タイトル指定 '結果表示 MsgBox strNAME & "さん、がんばってください" '(*3)結果のメッセージを表示する End Sub (*4) strNAME = InputBox("アナタの名前は?", "お名前確認") みたいにすると、 タイトルバーに"お名前確認"、 "アナタの名前は?" と表示され、入力するダイアログが現れます。
ウ.デフォルト値を指定、 じゃ、[, default]に "匿名希望" ってやると、どうなるの? 人に聞かないで、イロイロやってみてよ。 Sub test3() Dim strNAME As String '(*1)値を受け取るため文字型の変数を宣言 'ここで、文字を入れる、、 strNAME = InputBox("アナタの名前は?", "お名前確認", "匿名希望") '(*5) '結果表示 MsgBox strNAME & "さん、がんばってください" '(*3)結果のメッセージを表示する End Sub (*5) strNAME = InputBox("アナタの名前は?", "お名前確認", "匿名希望") としているので、いままで空白だった入力エリアに、 匿名希望と表示されてます。
コツじゃないけど、問い合わせ風のメッセージにすると、 入れる人が迷わないので、いいのでは?と思います。 strNAME = InputBox("希望年収は?") みたいに、メッセージを?の疑問系にして、 strNAME = InputBox("希望年収は?", "希望年収の入力処理") と、タイトルバーにはXXX処理と入れてあげ、 strNAME = InputBox("希望年収は?", "希望年収の入力処理", "400") 空白から入れさせるのも、、な時やほとんど同じ値が入力される時は、 デフォルト値のパラメーターを使用します。 こんな感じで、簡単な入力は、 InputBox を使用すると出来ます。 通常は、フォームを作成して、 テキストボックスで値を受け取ったり、 処理を行うのかなぁ。 (ユーザーフォームの使用も簡単なので、近いうちに。。。) /* * 2.Excel VBA Application.InputBox */ 今日はExcelユーザーにオマケです。 ダマされたと思って、下記のコードを Excel VBAで実行してください(Excel 97で確認しました) Sub aaa() aa = Application.InputBox("XXX 入力してください") MsgBox aa End Sub 普通のInputBoxと違い、 セルを選択できるじゃないですか? チョット感動。 *だけど、シャレタサンプル、、思いつかない。 ヘルプを見ると、、、、(みなさん、ご自身で見て下さいね。。。) なんて、言って逃げんなよ、サンプル出せよハヤク。 う〜ん、、サンプルをハヤクかぁ、、、 うまい料理なら客は待つけど(サンプルの味・中身で勝負?) それとも、 そこそこのものを速くで勝負したら?(手抜き料理でも客を待たせないのも一つの手?) ヘルプを見て自分の家で作ってくださいのほったらかしはマズイかぁ。 モスとマックどっちが好きか? なんて話は置いといて(そんな話はしてないか(笑)) まずはサンプルから、 ア.InputBox関数 通常、InputBox関数を使うのは、 ダイアログボックスを表示して文字列型 (String) の値を受け取ります。 Sub test() Dim strMOJI As String 'ここで、文字を入れる、、 strMOJI = InputBox("好きな人の名前を入れてください") '入力文字数のチェック If Len(strMOJI) = 0 Then MsgBox "ノリの悪いヤツだなぁ、面白くないなぁ" Exit Sub End If '結果表示 If MsgBox(strMOJI & "さんに告白したの?", vbYesNo) = vbYes Then MsgBox "やりますねぇ" Else MsgBox "がんばってくださいね" End If End Sub '---- strMOJI = InputBox("好きな人の名前を入れてください") みたいな感じで、使います。 用途は、簡単な文字の受け取りでしたね。 イ..InputBoxメソッド(Excelの場合) さてやっと問題のメソッドの方ですが、下記のような使い方が可能です。 Sub aaa() Dim objHANI As Range Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8) objHANI.Font.Bold = True '選択範囲に対して、フォントを太字にする End Sub 見た目、画面にはセルを選択と出ているので、 同じなのですが、 シートをクリックしたりドラックしたりすると、 番地の文字が表示されます。 詳しくは.InputBox(メソッド)のヘルプを確認してほしいのですが、 Type:=8とすると文字列ではなくセル参照 (Range オブジェクト)を返してくれます。 選択した範囲のオブジェクトが代入されるので、 .Font.Bold = True とセルを操作してみました。
いろいろと実験してみると面白いですよ。 まぁ、こんな感じかなぁ。 /* * 3.終わりの挨拶 */ 今回は、 InputBox関数で簡単な値を受け取る と おまけで、 Excel VBA の Application.InputBox を使用して・・ を少し書いてみました。 感想・質問などあったら、掲示板に書いてもらえるとうれしいです *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。
No.12 | 2002/11/30 入力結果の判断いろいろ |
[ページTOPへ戻る] |
<入力結果の判断いろいろ>
こんにちは、 昔のメルマガを参考に楽して発行中の三流プログラマーKen3です。 今回は、 InputBox関数で簡単な値を受け取り、 If文などで判断処理を行います。 そろそろ知りたいユーザーFormの処理はまだ先かなぁ。 ツマラナイ解説で読者が逃げる前に、 なるほど!ってのを1つぐらい書かないとマズイんだけど。 今日は、いろいろな書き方してみるので、笑ってください。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 *今回手抜きで画像とサンプル作ってません、、 /* * 1. InputBoxで入力、結果を単純に表示 */ まず、ユーザーから入力を受けつけないといけませんね、 で、知ってるのはInputBoxステートメントなので、 これを使用します。(フォーム入力はまだ先です、すみません) 初めは軽く、 1.グー 2.チョキ 3.パー を入力するプログラムを作成したいと思います。 流れは、 1.InputBoxでユーザーに入力させる 2.入力結果を判断し、結果を文字で表示する。 1の時、グー 2の時チョキ 3の時パー Sub test() Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*3) 結果を表示する If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" If strNO = "3" Then MsgBox "パーを出しました" End Sub (*1)は、文字型の値を受け取りたいので、宣言しています。 (*2)のInputBoxダイアログで、入力を行います。 (*3)で、入力結果を表示します。 簡単過ぎましたか? あれ?三流君がはじめに解説してたIf文って、 If strNO = "1" Then MsgBox "グーを出しました" End If とEnd Ifがあったのに、 If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" のでもいいの?End If無いよ? Then の 後ろに一行で書くことも出来るんですよ。 1命令の時は、短いので、この書き方が好きな人も居るし、 If strNO = "1" Then MsgBox "グーを出しました" End If って必ず書く人も居ます。 あっ、前にもチラっと書きましたね。 なんとなく書き方のコツ、違いがわかったけど。 これで、入力と表示、できたっぽいですね、 では、またね。次回のメルマガで会いましょう。 *速く次のメルマガの原稿書かなきゃね。 三流君チョット待ったぁ〜 なに?今日はもうカンバンだよ(閉店だよ) 何も入れないでリターンキー押された時どうなるか?やってみた? 4って入力したらどうなるの? OKじゃなくって、キャンセルボタン押されたら? あれ?何も表示されない・・・ そっか、Ifの条件式にあてはまらないから、 何も表示されないんだ。 ちっ、手間かけさせやがって じゃ1,2,3以外の時は、 「正しい値を入力して下さい」 と出しますか。 ちゃんとやってよね、まったく。テストしろよ。まぁそれが三流らしいのかな。 うるせえ〜(笑) /* * 2.<>とAndを入れて、1〜3以外を個別にチェック */ <>とAndを入れて、1〜3以外を個別にチェック Sub test2() Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*3) 結果を表示する If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" If strNO = "3" Then MsgBox "パーを出しました" '(*4)1,2,3以外か判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then MsgBox "正しい値を入力して下さいね" End If End Sub (*4)の If strNO <> "1" And strNO <> "2" And strNO <> "3" Then こんな感じで、 <>演算子の等しくないを使って、 1でもなく2でもなく3でも無い時は、って判断してみました。 なにそれ?、その場当たり的な条件の追加方法は三流君らしいけど。 ハヤク、帰りたいんだよ。あと、何か質問あるの? プログラムの流れがなんか変じゃないですか? If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" If strNO = "3" Then MsgBox "パーを出しました" と1、2、3の判断をやってから、 また、 '(*4)1,2,3以外か判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then MsgBox "正しい値を入力して下さいね" End If と、判断してるし。 うるせなぁ、動けばいいんだよ、動けば。 時間無いしメンドウだなぁ、まとめりゃいいんだろ、まとめれば。。。 /* * 3.OR使用とIf文をネストしてみました */ ほらよ、今度は、 OR使用とIf文をネストしてみたぞ。 Sub test3() Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '結果の表示 '(*5)1,2,3の正しい数値かはじめに確認する If strNO = "1" Or strNO = "2" Or strNO = "3" Then If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" If strNO = "3" Then MsgBox "パーを出しました" Else MsgBox "正しい値を入力して下さいね" End If End Sub こんな感じで、入力後に、 '(*5)1,2,3の正しい数値かはじめに確認する If strNO = "1" Or strNO = "2" Or strNO = "3" Then で、頭で、 1か2か3のどれかだったらと判断し、 続いて、 If strNO = "1" Then MsgBox "グーを出しました" If strNO = "2" Then MsgBox "チョキを出しました" If strNO = "3" Then MsgBox "パーを出しました" でチェック、 1か2か3以外だったらの処理で、 Else MsgBox "正しい値を入力して下さいね" End If でエラーメッセージ表示。 これをIf文のネストって言うんだよ。 わかった?これでいい? 何?得意になって話してんだろうね。 さっきとあまり変わらないジャン。 なんだとぉ〜。 じゃ、少し流れを見直して、変数1つ使って短くしてやるよ。短く。 /* * 4.結果の変数を1つ用意して・・・ */ まず、プログラムの流れを変えます。 1.データ入力 2.メッセージの初期値を、初めにエラーにしておく 3.次に入力値を判断し 1の時グー 2の時チョキ 3の時パーを代入 4.結果を表示 にしてみました。 Sub test4() Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 Dim strMSG As String '(*6)結果表示用 '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*7)入力値を判断して結果を代入 strMSG = "正しい値を入力して下さいね" 'エラーをはじめに代入 If strNO = "1" Then strMSG = "グーを出しました" 'メッセージ変更 If strNO = "2" Then strMSG = "チョキを出しました" If strNO = "3" Then strMSG = "パーを出しました" '(*8)変数の値(strmsgの中身)を表示する MsgBox strMSG End Sub (*6)でstrMSG 結果表示用変数を定義します。 ポイントが(*7)で、 まず、 strMSG = "正しい値を入力して下さいね" でエラーメッセージを代入します。 次に、 1か判断1ならグーを代入 If strNO = "1" Then strMSG = "グーを出しました" 2か判断2ならチョキ If strNO = "2" Then strMSG = "チョキを出しました" 3か判断3ならパー If strNO = "3" Then strMSG = "パーを出しました" (*8)で変数の中身を表示します。 変数を使って、先にエラーメッセージを代入しておく ってのは、どうでしょうか? へぇ〜、こんな書き方もあるんだぁ。 初めにエラーメッセージの文章を代入して、 正しい値が入らなかったら、メッセージはエラーのままねぇ。 なんか変わり者の三流君みたいでイヤだなぁ、 プログラムが見にくいよ、なんとかならないの? 少し変わった味付けすれば、あきらめて、おとなしく帰ると思ったのによ。 /* * 5.Select Case Elseで簡単に? */ いろいろがんばったね三流君、 ボクが言いたかったのは、 Select Case 文でCaseElseってあったんじゃない? って言いたかったんだけど、まぁイイヤ。 こんなのは、ダメ? Sub test5() Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 Dim strMSG As String '(*6)結果表示用 '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*9)Select Case Elseで判断 Select Case strNO Case "1": strMSG = "グーを出しました" 'メッセージ代入 Case "2": strMSG = "チョキを出しました" Case "3": strMSG = "パーを出しました" Case Else: strMSG = "正しい値を入力して下さいね" '(*10) End Select '(*11)変数の値(strmsgの中身)を表示する MsgBox strMSG End Sub '(*9)Select Case Elseで判断 みたまんまでそのままひねらないで条件を書いてると思うけど。 三流君的には?どうですか?(読者さん的にもどうでしょうか?) まぁ、縦にスッキリといってるような、感じもするけど、 オレ、Select Case Else あんまり書かないから。 /* * 6.終わりの挨拶 */ 好みの問題でしょう。 私は長い髪の女性が好きだからね。 えっ、この前はショートカット大好きって言ってたジャン、おいおい。 みなさんは、どのパターンが好きですか? あっ、プログラムのほうですよ(笑) 同じ処理でも個性がありますよね。 今日書いたことは、 ・<>で等しくない ・And Or を使って複数の条件を判断 ・If文、一行で書けるよ ・If文のネスト(階層構造) ・結果の変数を使用したやりかた(エラーで初期化しておく) ・Case Else: を使用 でした。 イロイロと書きまくっただけなので、質問などあれば、 掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi やメールに気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 ショートもロングもOK、女の子大好き、三流プログラマーKen3でした。 PS.あっ、完璧でキレイ過ぎる子はなんとなく嫌いかなぁ(おいおい)
No.13 | 2002/12/03 Excel セルに名前を付けてみる |
[ページTOPへ戻る] |
<Excel セルに名前を付けてみる>
こんにちは、 昔のメルマガを参考に楽して発行中の三流プログラマーKen3です。 チョット退屈してきた人も居ると思うので、 今回は、 修正に強いプログラム作りの参考になれば と 思い、 Range(番地)の参照方法から、 Excelのセルに付けた名前を使用する処理を書きたいと思います。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. Excel セルに名前を付けて使用する */ みなさんは、セルに名前を付けて、使用したことありますか? なに?それ? えっと、下記のような表を作りました。 A列 B列 1 単価 10 2 在庫数 200 3 在庫金額 2000 ここで、B3に入っている計算式は?どんな式でしょうか? 簡単に書くと、 =B1*B2 でしょ。 はい、正解です。 なめてんじゃねえょ。 まぁまぁ、そんなに興奮しないで、、 気を取り直して続けると、 在庫金額って、単価*在庫数ですよね、 なので、=B1*B2ですよね。 話を進めると、 Excelの機能でセルに名前を付ける機能があって、 メニューから挿入--名前--定義 を選択します。 名前に単価を入力、 参照範囲に$b$1を選択してOKを押します。 同様に メニューから挿入--名前--定義 名前に在庫数、参照範囲に$b$2を入れ、OKを押します。 これで、下記のような使用方法が可能です。 =単価*在庫数 をB3のセルに入力します。 おっ、なんとか出来たみたいですね。 だから?何?って感じだけど。 セルに名前を付けておくと便利でしょ? どこがぁ? /* * 2.VBAから値を参照、セットするには */ おっと、これは、VBA系のメルマガだったっけ。 VBAから値を参照、セットするには、 Rangeオブジェクトを使用します。 簡単に書くと、 Sub Macro1() Range("単価") = 20 End Sub みたいな使い方が可能となります。 Sub Macro1() Range("B1") = 20 End Sub より、わかり易いでしょ。 まぁ、何とも言えないよね。 う〜ん、コイツを説得するのには時間がかかりそうだなぁ、、、 手間かけて、あと2押しぐらいするか。 /* * 3.Excelのフォーマットに名前付きのセルを使用すると */ チョット前、MDBと同フォルダのExcelファイルを開く ( http://www.ken3.org/backno/backno_vba02.html#7 参照) をやったよね。 たしか、 AccessからExcelファイルを開いて、データをセット セット位置は、 ID・・・・・・セルB4 Name・・・・・セルC4 Address ・・・セルB6 TEL ・・・・・セルD7 にセットする。 だったよね。 で、完成したAccessのサンプルのソースは、 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 と、なんかやってたよね、ぐちゃぐちゃと。 それで、今回のポイントなんだけど、 '*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] とAccessのフォームから開いたExcelのセルにデータをセットしてるんだけど、 TYPE.xlsのセルに名前を付けて使用すると、 '*2 Range(セルに付けた名前).Value ="XXXX" でデータをセットする oApp.Range("ID").Value = Me![ID] oApp.Range("氏名").Value = Me![Name] oApp.Range("住所").Value = Me![Address] oApp.Range("電話番号").Value = Me![TEL] B4などのセル番地から、付けた名前で参照できます。 それが何か? 別にB4とかC4でいいんじゃない? 仕様書にB4にIDをセット、C4にNameをセット 明確に書いてあるんだからさ。 そうなんだけど、う〜ん、、、手ごわいなぁ。 よし次は、得意の架空の作り話だ。 /* * 4.将来、フォーマットを修正した時に効果が出る */ 一行目にタイトル行を追加したい と 客先から依頼が来ました。 そしたら、アナタの修正手順は?どんな感じですか? Excel TYPE.xlsを開いて、一行挿入して、タイトル入力後に上書き保存、 Access側のセット処理は、 oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] を oApp.Range("B5").Value = Me![ID] oApp.Range("C5").Value = Me![Name] oApp.Range("B7").Value = Me![Address] oApp.Range("D8").Value = Me![TEL] と セット位置を+1すれば修正完了でしょ。 チョロイ修正でしたね。 簡単に修正完了かぁ〜じゃなくって、 Excelでセルに名前を付けてると、 一行挿入しても、名前の位置は相対的に移動するので、 Access側の '*2 Range(セルに付けた名前).Value ="XXXX" でデータをセットする oApp.Range("ID").Value = Me![ID] oApp.Range("氏名").Value = Me![Name] oApp.Range("住所").Value = Me![Address] oApp.Range("電話番号").Value = Me![TEL] は、変更無しでそのままでOKなんですよ。(これホント!) 実行できるサンプル http://www.ken3.org/vba/lzh/vba013.lzh を落して、 行の追加や列の追加、 フォーマットを変更して、 遊んでみてください。 /* * 5.終わりの挨拶 */ 今日書いたことは、 ・Excelのセルに名前を付ける方法 ・Range("単価") = 20 でVBAから使用可能です ・応用すると、変更の少ないプログラム書けるよ でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 いろいろな環境に対応できない不器用な、三流プログラマーKen3でした。
No.14 | 2002/12/04 Excel 隣のシートを参照して逃げる |
[ページTOPへ戻る] |
<Excel 隣のシートを参照して逃げる>
こんにちは、 メルマガ発行中の三流プログラマーKen3です。 今回は、 意外な解決方法のメールを貰ったので、 チョット発行してみます。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. いつもの前置き */ 前回の Excel セルに名前を付けて使用する で、 セルに名前を付けて、 Sub Macro1() Range("単価") = 20 End Sub とか使えるよ、使ってね。 と やりました。 応用すると、変更の少ないプログラム書けるよ なんて言ってましたね。 In message "[VBAで楽しく No.013] - Excel セルに名前を付けてみる", >AccessからExcelファイルを開いて、データをセット >セット位置は、 >ID・・・・・・セルB4 >Name・・・・・セルC4 >Address ・・・セルB6 >TEL ・・・・・セルD7 >にセットする。 詳細は、 http://www.ken3.org/backno/backno_vba03.html#13 から参照可能です。 In message "[VBAで楽しく No.013] - Excel セルに名前を付けてみる", >一行目にタイトル行を追加したい >と >客先から依頼が来ました。 > >そしたら、アナタの修正手順は?どんな感じですか? > >Excel TYPE.xlsを開いて、一行挿入して、タイトル入力後に上書き保存、 >Access側のセット処理は、 > oApp.Range("B4").Value = Me![ID] > oApp.Range("C4").Value = Me![Name] > oApp.Range("B6").Value = Me![Address] > oApp.Range("D7").Value = Me![TEL] >を > oApp.Range("B5").Value = Me![ID] > oApp.Range("C5").Value = Me![Name] > oApp.Range("B7").Value = Me![Address] > oApp.Range("D8").Value = Me![TEL] >と >セット位置を+1すれば修正完了でしょ。 >チョロイ修正でしたね。 上記の単純にAccess側で、データセットのセル位置を修正する方法 と 下記のExcel側でセルに名前を付けておき、Access側は無修正 勝手にExcelファイルを自由に修正できるよ。 In message "[VBAで楽しく No.013] - Excel セルに名前を付けてみる", >Excelでセルに名前を付けてると、 >一行挿入しても、名前の位置は相対的に移動するので、 >Access側の > '*2 Range(セルに付けた名前).Value ="XXXX" でデータをセットする > oApp.Range("ID").Value = Me![ID] > oApp.Range("氏名").Value = Me![Name] > oApp.Range("住所").Value = Me![Address] > oApp.Range("電話番号").Value = Me![TEL] >は、変更無しでそのままでOKなんですよ。(これホント!) なんて、書いてました。 /* * 2.ある読者から意外な方法のメールをいただく。 */ Access側は無修正 勝手にExcelファイルを自由に修正できるよ。 に対して、 ある読者から意外な方法のメールをいただきました。 なんて、いつものようにヒッパッタケド、 たぶんみんな知ってる方法で、 シートを隣にコピーして、 タイトルやフォーマットを変更する。 変更された位置に隣の元シートを参照する式を入れる。 =Sheet1!$B$4 みたいに、隣を参照する。 このファイルを保存して次回から使うとOKなんだってさ。 (テストファイルどうもです、参考になりました、盲点?かなぁ。 あと、メルマガ上でお礼を言われると恥ずかしいかな?それともうれしいかなぁ?) へぇ〜 この方法でも、 Access側が、B4にデータをセットしても、 隣から=Sheet1!$B$4と参照するからOKなんですね。 *まぁ、必要無いシートが残ってしまうけどね。(最後の抵抗、、、) データの流れは、 Accessでボタンが押される。 フォームの値を開いたExcelシートB4にセットされる。 と、同時に隣のシートで=Sheet1!$B$4と参照するから なるほどねぇ、これもプログラムを修正しない手かぁ。 この方法を送ってくれた 自称三流事務員さんは、 Excelで作業をしていると、 A社向けフォーマット、B社向け・・・F社向け と 同じ項目を違う書式で印刷しているので、 =シート!セル番地(=Sheet1!$B$4) でいつも小細工してるんだって。 すごい、使える一流事務員さんだよ じなくって、 Excelの豊富な機能を使って工夫して処理することも重要かなぁ。。。 と ふと思いました。 掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi やメールで気軽に意見やこんな方法など書いてくれるとうれしいです *何も出ないけど(笑)、中にはキビシイ書き込みも掲示板にあったけど、 がんばってやっていきますか。 /* * 3.勝手にプログラムの話へ */ 今までの流れをふまえ、プログラム系の話に強引に持って行く。 Accessフォームの値をExcelにセットする 処理を少し工夫して下記のようにしてみる。 In message "[VBAで楽しく No.013] - Excel セルに名前を付けてみる", >AccessからExcelファイルを開いて、データをセット >セット位置は、 >ID・・・・・・セルB4 >Name・・・・・セルC4 >Address ・・・セルB6 >TEL ・・・・・セルD7 >にセットする。 これを、 ID・・・・・・シート名DATAのセルA1番地 Name・・・・・シート名DATAのセルA2番地 Address ・・・シート名DATAのセルA3番地 TEL ・・・・・シート名DATAのセルA4番地 に変更する。 Excel側では、実際の表を =DATA!A1 =DATA!A2 =DATA!A3 =DATA!A4 と参照設定して表を作成する。 これなら、Accessからのデータセット処理も変更無く、 Excel側では自由にフォーマットが作成でき、 また、複数のXX社向けフォーマットにも対応可能となる。 客先からフォーマット変更を頼まれても、 イヤな顔をしないで、対応できますね。 (おいおい、それは別問題でどんな時もイヤな顔するのはマズイって) また、客先の人が少しできる人なら、 データはAccessからセットされるので、 自由にシートを追加して、活用して下さい。 なんて、少しカッコつけた会話が可能かなぁ。 /* * 4.終わりの挨拶 */ 今回は、Excel使いの事務員さんから 別な角度のメールをいただいたので、 少し書いてみました。 プログラム同様、いろいろな方法があるんだなぁ と 思いました。 拾い読みして、 1つでも何かの参考となれば幸いです。 発想力を磨こうとあらためて思った、三流プログラマーKen3でした。
目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。 時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。 |
項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多い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:[三流君の作業日記]/
[サンプルコードのゴミ箱]/
広告-[通販人気商品の足跡]