[PR]今日のニュースは
「Infoseek モバイル」


VBA?第6回(最終回)  実践で、実力UPしよう!!
 (【EXCEL2000】を使用して、説明しています!!
シートとVBAの組合せ
今回の狙い目
●VLOOKUP関数を使ってみよう!!
●コンボボックスや印刷ボタンを作ってみよう!!
●印刷マクロを作ってみよう!!
ハガキ印刷に挑戦!!
 ハガキ印刷になると、はがき用のレイアウトを
 考えないといけないよねぇ〜
 ワードのように、幅、長さの調整がmm単位で
 調整することができないのがネックですね!!
 
一応幅は 「標準」スタイルのフォントの "0"が何文字入るかを示して
 います。そしてセルの高さの単位はポイントで示しています。
 1 ポイントは 1/72 インチ、約 0.35 mm になります。

 え〜と、芳坂 和行(ほうさか かずゆき)さんが作成している、
 実はとても便利なツールがあります
 紹介しておきますね、(オススメです!!)
 「ものさしマクロ」っていうんですけどアドレスは↓
 http://homepage2.nifty.com/housaka/index.html
 ここでDLするといいでしょう!!
 単位のことも、詳しく書かれていますので、参考にするといいですねぇ

 たこちゅーは、オートシェイプの直線を使って、長さを調整したりもします
 印刷と画面の表示の長さとは必ず一致するものではありませんが
 ある程度なれてくると比率などでカバーできます。
 要は、これも慣れで、ある程度までは感で合わす事ができるように
 なるもんです。
 え〜と、余談ですが、作成したエクセルファイルは最後にDLできるように
 します。(∩_∩)ゞ
 
 さて、話は元にもどります。
 とりあえず、下のようなレイアウトで作成してみました
 印刷範囲は、このハガキサイズ分だけに設定しておきます
 印刷範囲を設定して、ファイル→印刷範囲の設定
 これでOK!! (^・^)


VLOOKUP関数 (初級編でも説明していますよ!!q(^◎^*)p)
 これは、もちろん、皆さん知ってますよねぇ、
 これを知っていないと前に進めません!!
 でも、簡単に説明しておきますね、
  =VLOOKUP($O$2,表,5)
 ↑の式で説明しますね、
 郵便番号(この場合「543」のセルですが)欄にこの式が入力されています。
 O2は横にある番号の数字のあるセル(5の入ったセル)のことです。
 $は絶対値を表します。(これをコピーすると、どこに貼り付けても
 絶対値は変わらないので、便利なんです。)
 次は、「表」ですが、これは、名簿のデータ範囲に名前をつけました。
 つまり一番左がこの「表」の一番左の数字に対応します。
 $O$2=5 つまり5に対応します
 そして、右側の数字は表の5列目、名簿、郵便番号の列に対応するわけですね
 「五丁目六番一号」の欄は、数式に工夫を凝らしています
 ="    " &  IF(VLOOKUP($O$2,表,14)="" , "" , VLOOKUP($O$2,表,14 )
 & "丁目") & IF(VLOOKUP($O$2,表,15)="" , "" , VLOOKUP($O$2,表,15)
 & "番") & IF(VLOOKUP($O$2,表,16)="","",VLOOKUP($O$2,表,16)&"号")

 例えば、最初の"   "は少し空けることによって、少し真中にくるように設定しています
 次のIF分ですが、丁目に対応するセルが空白だったら空白、それ以外だったら
 &"丁目"がありますので 対応する文字と丁目が組合わせられることになります
 つまり↑の例では 五丁目となるわけです。
 番、号も同じです。そして、それぞれを&で組合わせています。
 
 スクロールバーをつけて、プロパティでリンク先を【番号】の数字セルO2
 に合わせておいてください。あとは、入力でしたスクロールバーの
 プロパティ設定でいいでしょう!!
 
 さぁ、これで。スクロールバーを動かすと、次々名簿に対応して替わって
 いくのがわかります。

●コンボボックスを作ってみよう!!
 
 コントロールルールボックスから↑のように
 コンボボックスを選択、図のようにコンボボックスを作成する
 1 プロパティを見てみよう!!

 プロパティでFontは少し大きめに、たこちゅーは20Ptに設定
 
 IMEMode は4のひらがなモードに設定
 LinkedCell R2
 ListFillRange A30:A34
 と設定してみてください!!A30:34という記述はだめです。
 まぁ、そう入れても受付けてくれませんけどね!!ゞ( ̄∇ ̄;)

 え〜と、その範囲にはこのようなデータを入力しておきます
 
 
 そうすると、コンボボックスは、このように表示されました
 
 コンボボックスに直接、文字を入力し、【Enter】キーを押せば
 その文字も入力されます。
 ●印刷ボタンを作ろう!!
  1 ボタン作成
  
  ↑のように、【現印刷】ボタン、【連続印刷】ボタンを作ってみよう!!
  方法は同じように、コントロールツールボックスでコマンドボタンを押下し
  任意の大きさのボタンを作成する。
  ボタンは【CommandButton1】、【CommandButton2】と表示されているはずだ!!
  名前を【現印刷】と【連続印刷】に替えるには、直接ボタンから文字を編集する
  方法は、 コマンドボタンを選択して右クリック、コマンドボタンオブジェクトを選択
  編集が出てくるのでそれを選択すれば、編集可能になる

  間接的な方法は、コントロールツールボックスでプロパティを選択後
  Captionのところで文字編集したのち、Fontで文字の大きさや書式を選択すればよい!!

  数字を入力するさい、今回の場合にはセルの幅、高さにとらわれしまって
  入力する場所がうまく作れない。そこで、ついでに
  テキストボックスという、旨い小道具がツールボックスにあるので、
  それを、使って入力できる箱を作ってみようと思う!!
  要領は、簡単だ!!
  テキストボタン
  このボタンを押せば、テキストボックスが作成される。
  先ほどと同じように、プロパティで文字の書式、大きさなどを設定しておく
  ここは数字だけの入力になるので、とくにIMEMode2のfmIMEModeOff
  これでここでは必ず、日本語Offの半角しか入らない状態になる。
  背景の色は、BackColor で変更できる
  文字の色はForeColorだ!!
  文字だけの表示 (今回の場合は、開始、終了)
  ではラベルを使ってみよう!!
  ラベルラベルはこのアイコンだ!!
  設定は、テキストボックスと同じだが、テキストボックスとおおきな違いは
  Value つまり値の収得ができないのである。プロパティを見ればわかります!!
  
     
  2 コード作成
  次に、↑の右クリックで、【コードの表示】を選択してみよう!!
  コントロールツールボックスで選択してもいいし、ボックスを選択状態で
  ダブルクリックでも、【コードの表示】は可能だ!!
  そうすると↓のように
  コードが自動的に挿入されたはずだよ!!
 
  Private Sub CommandButton1_Click() '印刷

   End Sub


  Private Sub CommandButton2_Click() '連続印刷

   End Sub

 (1)現印刷
 印刷は、PrintOutメソッドを使います!!
 PrintOutメソッドは、引数全て省略可能できす。
 シートモジュールで記述する場合、指定しなければ
 そのシートが対象ですので、あとは、シートの印刷範囲だけを
 エクセル上で先に指定しておけば
  PrintOut この1行だけでOK!!です
  
 つまり、
     Private Sub CommandButton1_Click() '印刷
       PrintOut
    End Sub
 (2)連続印刷
    これはテキストボックス2つを使用します
    開始のテキストボックスを  TextBox1
    終了のテキストボックスを  TextBox2
    とします。
    変数を入れておきましょう!!
     Dim N1 As Integer ,N2 As Integer ,No As Integer 'と宣言しておいて
       N1 = Val(TextBox1)
       N2 = Val(TextBox2)
    TextBoxは、言葉どおりテキストが主になっています
    たとえば、数字の1は 文字として"1"と認識されてしまいます
    これを、そのまま変数に代入してやると、N1は文字と認識
    N1は整数と宣言しているわけですから、ここでエラーになってしまいます
    そこで*1Val関数を使います。
    Val関数は文字で表された半角数字を、数字に変換してくれる便利な関数です
    半角数字以外の文字は無視されます。(以降、半角数字は数字)
    途中数字以外の文字ががあるとそこでSTOPして以降無視されます
    つまり、先頭に数字以外のある文字があれば、無視つまり0です
    そして先頭に数字文字があれば、数字の最後まで読み込み、
    途中数字以外の文字があれば、そこまで読んでくれるということです
    スペースは無視されます
    
    番号の入っているセルにForを使って、開始から終了までの数値を代入します
    For No = N1 To N2
     Range("O2") = No '番号が入力されているセルの位置
     PrintOut
    Next No

    でも、これだと開始と終了の大きさが逆になるとFor・・がエラーになるので
    IF関数を入れて制御させておきましょう!!
    つまり
    Dim Q as Integer
    If  N1>N2 Then 
    'MsgBox関数    *2(ヘルプをそのまま記述:MsgBox.text)
     Q=MsgBox("開始設定値が終了値より大きいです" & Chr(13) & _
       "終了値を開始設定値に合わせて、印刷を実行しますか?",52,"印刷ページ設定")
       If  Q=7 Then
         MsgBox "印刷中止しました!!"
        Exit Sub
      End If
     N1 = N2
   End If

 プログラム記述
Private Sub CommandButton2_Click() '連続印刷
 Dim N1 As Integer, N2 As Integer, No As Integer 'と宣言しておいて
   N1 = Val(TextBox1)
   N2 = Val(TextBox2)
 If N1 > N2 Then
   Q = MsgBox("開始設定値が終了値より大きいです" & Chr(13) & _
   "終了値を開始設定値に合わせて、印刷を実行しますか?", 52, "印刷ページ設定")

   If Q = 7 Then
    MsgBox "印刷中止しました!!"
    Exit Sub
   End If

  N1 = N2
 End If

 For No = N1 To N2
   Range("O2") = No
   PrintOut
 Next No

End Sub
●今回使ったエクセルファイル
  what_vba01.xls (90KByte) ←DLできます!!

Val関数 【*1へ戻る】
  Val関数は文字で表された数字を、数字に変換してくれる便利な関数です
  数字以外の文字は無視、
  途中数字以外の文字ががあるとそこでSTOPして以降無視する
   つまり、先頭に数字以外のある文字があれば、無視つまり0です
  そして先頭に数字文字があれば、数字の最後まで読み込み、
  途中数字以外の文字があれば、そこまで読んでくれるということです
  スペースは無視されます

  例(□はスペースをあらわす)
      あ1→ 0 、 11あ→11 1□1あ1→11
    単純に考えれば次のようにすればいいでしょう


MsgBox関数 【*2へ戻る】 ちょっと解説しますねぇ!!q(^◎^*)p
 MsgBox( "文字を入れます1000文字ぐらいまで可" , スタイルを設定, "タイトル名" )
 スタイル設定ですが、ここは整数でも可ですので、たこちゅーは整数をよく使います
 そして、下の数値で第1グループと第2グループの数値を加算したものを使います
 文字、スタイル、タイトル名は省略できます。すべて省略すれば 0 となり
 第1グループの vbOKOnlyが選択されます、つまり【OK】ボタンだけの表示となります

第1グループ(ボタンの型を選択します)
 vbOKOnly        0   [OK] ボタンのみを表示します。
 vbOKCancel       1   [OK] ボタンと [キャンセル] ボタンを表示します。
 vbAbortRetryIgnore 2   [中止]、[再試行]、および [無視] の 3 つのボタンを表示し
                 ます。
 vbYesNoCancel    3   [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを
                 表示します。
 vbYesNo        4   [はい] ボタンと [いいえ] ボタンを表示します。
 vbRetryCancel    5   [再試行] ボタンと [キャンセル] ボタンを表示します。

第2グループ (メッセージのアイコン選択します)
 vbCritical       16   警告メッセージ アイコンを表示します。
 vbQuestion     32   問い合わせメッセージ アイコンを表示します。
 vbExclamation   48   注意メッセージ アイコンを表示します。
 vbInformation   64   情報メッセージ アイコンを表示します。

そして、MsgBoxの戻り値は、整数で返されることに注目します!!

定数    値   説明
vbOK    1   [OK]
vbCancel 2   [キャンセル]
vbAbort   3   [中止]
vbRetry  4   [再試行]
vbIgnore  5   [無視]
vbYes   6   [はい]
vbNo    7   [いいえ]
MsgBoxのボタンを押すことにより、この数値が返ってくるということです!!
ですから、、これも、定数で書いてもOK(定数は変数として割り当てられている)
ですが、値で書いた方が楽ちんなので、たこちゅーは値を使っています!!

PrintOutメソッド
使いかた
 通常は
 Sheets("名簿").PrintOut From:=1, To:=2, Copies:=1 というような使いかたを
 します。
 Sheets("名簿").PrintOut(1, 2,1)というような使いかたはしません
 ヘルプではPrintOut メソッドの使用例としてActiveSheet.PrintOut
 としか書かれていません!!メチャ不親切!!だと思いませんか?ゞ( ̄∇ ̄;)

●一応、簡単な入力、名簿表、ハガキ印刷をそれぞれリンクさせて
 エクセルを効率的に使う!!ということを、実例を交えて作成してみたのだけれど
 どうだったでしょうか?
 VBAを始めたばかりの人にとっては、プロジェクトエクスプローラやプロパティを
 開くだけでも、やっかいなことだろう!!
 横文字の羅列だし、聞きなれない言葉ばかりで、ひとつひとつの言葉に
 止まってしまって、前に進まない、ヘルプを見ても、難しいことばかり書いてあるし
 ヘルプのヘルプがいるわい、なんて思っているんじゃないかなぁ〜
 
 でも、最初は、みんなそうなんですよ!!たこちゅーなんかも失敗ばっかりで
 全然前に進まないことだって(進まないことの方が多い)あるし、
 悩んでばっかりですよ!!
 でも、インターネットって便利ですよねぇ〜
 質問すれば、親切に答えてくれるし、一緒に悩んでくれる!!
 それに、資料は豊富だ!!
 これを、利用しない手はないぞ!!
 いいところは、大いに盗むべし!!
 そして、自分の肥やしにしてください!!

 VBA?は一応、今回でおしまいだけど、
 続編も、また、初めてみたいと思います!!
 そのときまで、みなさんもスキルアップしておいて下さいね!
 See You!!! Next Time!!
【BACK】  【HOME】 
 03-03-27UP!!