[No.60 Cancel=Trueの使い方(例題:Excel 右クリック禁止)]
[No.61 Excel Form 閉じる方法 Unload Me]
[No.62 Access フォームでパスワード入力(入力後*****表示)]
[No.63 Excel UserForm で データ・フォームの機能を真似てみる]
[No.64 AccessからExcelファイルを開いて・印刷して・閉じたい]

www.ken3.org(サイト内)から Google を利用して、

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



No.60 2003/03/31
Cancel=Trueの使い方(例題:Excel 右クリック禁止)
[ページTOPへ戻る]

<Cancel=Trueの使い方(例題:Excel 右クリック禁止)>

こんにちは、 三流プログラマーKen3です。 今回は、 モジュールの引数でよく見かける、 Cancel=Trueの使い方 ~~~~~~~~~~~ を軽く書きたいと思います。 今回の関連画像は、手抜きで無しです(オイオイ) が、 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba060.lzh にtest060-book.xlsが保存されています。 (画像無しだけど、サンプルぐらいは作りますよ(笑))

/* * 1.今回のキッカケ */

In message "質問", Excel初心者 さん wrote... >質問なのですが… >Excelシートの右クリックを禁止にしたいのですが素人にもわかるように教えて >ください > ---- なかなか、難しい質問ですよね。 初心者・素人・わかり易く かぁ、、、 ムリしないで三流的な回答を書きます。

/* * 2.イベントでタイミングをチェック */

まずは、禁止したい行為が発生したことを知らないとイケナイよね。 (社内で私用メール禁止なんて言ってるだけじゃなくて、発生を知らないと防止もできない?) シートで発生するイベント処理について、 http://www.ken3.org/backno/backno_vba08.html#35 で、 イベントのテスト方法を少し書きました。 Excelのシートで発生するイベントのテストを下記のように行いました。
Private Sub Worksheet_Activate()
    MsgBox "_Activate イベント発生 こんにちは"
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
    MsgBox "_BeforeDoubleClick イベント発生 叩くなよそんなに"
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    MsgBox "_BeforeRightClick イベント発生 右クリックで何したいの?"
End Sub
Private Sub Worksheet_Calculate()
    MsgBox "_Calculate イベント発生 計算したよ"
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    MsgBox "_Change イベント発生 中身さわったでしょ(変更した)"
End Sub
Private Sub Worksheet_Deactivate()
    MsgBox "_Deactivate イベント発生 サヨナラ、また来てね"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    MsgBox "_SelectionChange イベント発生 浮気者セル移動したね"
End Sub
と、MsgBoxを入れる方法でイベントの発生をテストしました。

/* * 3._BeforeRightClickが右クリックのイベント */

_BeforeRightClickが右クリックのイベントでした。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    MsgBox "_BeforeRightClick イベント発生 右クリックで何したいの?"
End Sub
右クリックすると、このイベントが発生します。 ここに禁止の処理を書きます。 で、どんな記述? とても簡単で、 Cancel = True と入れると、サブ関数を抜けた時、 いつもの右クリックのメニューが表示されないんですよ。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    If MsgBox("右クリック禁止?", vbYesNo) = vbYes Then
        Cancel = True  '処理をキャンセルにする
    End If
End Sub
とやると、メッセージボックスが表示され、 はいを選ぶといつもの右クリックが禁止できます。 質問は右クリック禁止だったよね、
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
    Cancel = True  '処理をキャンセルにする
End Sub
で、いきなりキャンセルにしてしまえば、 質問のシートで右クリック禁止はOKかなぁ。

/* * 4.Cancel = True ほかにもいろいろと使えます */

Cancel = True なんか変な感じだけど(私だけかな?) ほかにもいろいろと使えます。 '終了前のイベントで確認してみた
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If MsgBox("本当に終了するの?", vbYesNo) = vbNo Then
        Cancel = True  '処理をキャンセルにする
        MsgBox "思いとどまりました"
    End If
End Sub
'保存前のイベントで確認してみた
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If MsgBox("保存しますか?", vbYesNo) = vbNo Then
        Cancel = True  '処理をキャンセルにする
        MsgBox "保存しなかったよ、未編集の終了に注意してね"
    End If
End Sub
Cancel = True で条件によってキャンセル可能な処理を作成することが出来ます。

/* * 5.おわりの挨拶 */

今回は、 ・_BeforeRightClickが右クリックのイベント ・Cancel = True で発生したイベントをキャンセルする でした。 今回の関連画像は、手抜きで無しです(オイオイ) が、 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba060.lzh にtest060-book.xlsが保存されています。 (画像無しだけど、サンプルぐらいは作りますよ(笑)) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.35 イベント処理について] http://www.ken3.org/backno/backno_vba08.html#35 では、MsgBoxでイベントの発生を確認してました。 -------------------- 読者からのお便り紹介 -------------------- In message "最近愚痴系ツマラナイよ", Function さん wrote... >がんばれプログラマー! http://www.ee-max.co.jp/melmag/ >軽めで読みやすい、けんぞうもガンバレよ ---- ヤバイなぁ、プログラマーの愚痴系最近ツマラナイと指摘メールが、、、、 がんばれプログラマー! http://www.ee-max.co.jp/melmag/ 私も軽く見ましたが、シンプルで見易かったです。 その他、お奨めのメルマガ、HPあったら教えてください。 ヨロシクです。 他店の味が気になる変り者、でも独自路線(笑)の三流作者Ken3でした。

No.61 2003/04/01
Excel Form 閉じる方法 Unload Me
[ページTOPへ戻る]

<Excel Form 閉じる方法 Unload Me>

こんにちは、 三流プログラマーKen3です。 今回は、 Excel 入力フォーム 閉じるボタンでフォームを閉じたい を軽く書きたいと思います。 今回の関連画像は、手抜きで無しです(オイオイ) が、 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba061.lzh にtest061-book.xlsが保存されています。 (画像無しだけど、サンプルぐらいは作りますよ(笑))

/* * 1.今回のキッカケ */

掲示板に質問の書き込みがありました。 In message "[BBS :76] Excel 入力フォームの作成について", >投稿時間:2003/04/01(Tue) 15:50 > >おなまえ:sattoch >タイトル:Excel 入力フォームの作成について > >はじめまして! >「Excel 入力フォームの作成」をまねしてやってみました。 >VBAはまだ初心者なのですが、楽しかったです。 >それで質問なのですが、ボタンをつくってクリックすると >終了にしたいと思いますが、どうやったら終了になるのでしょうか? >どうしても知りたいと思いますので教えてください。 >それから、あの入力フォームはシートのほうに固定させて >シートをひらくと入力フォームがそこに出てくる、というふうには >出来るのでしょうか? >他のページにはやり方がかいてあったのかな? >探してみます。でも良かったら教えてください! >-------------------------------------------------------- と書き込みがありました。 なんとなくHP管理者を嬉しくさせる書き方だったので (私が感じただけかもしれないけど) すばやく回答してみようと思います。 おいおい、他の回答は?ほったらかし? スイマセン、今回はゆるしてね。

/* * 2.閉じるボタンの作成 */

[No.42 ExcelのForm シートと連動させる] http://www.ken3.org/backno/backno_vba09.html#42 で、 Excelのシートとユーザーフォームを連動させた入力を軽くやりました。 シートのイメージは _____A_____________B_________C____________D_______________________E_______ 1 画像タイトル ファイル名 コメント 画像ベースディレクトリ→ D:\temp\ 2 サンタ 001.gif ケーキ写真 3 お正月 012.jpg XXXXXXXXXX タイトル ___________ txtTITLE ファイル名 ___________ txtFILENAME コメント ___________ txtMEMO ┌────┐ │前へ戻る│btnPREV └────┘ ┌───┐ │ 次へ │ btnNEXT └───┘ ┌────┐ │ │imgBOX(イメージコントロール) └────┘ を作成しました。 ここでは、見事な手抜きで閉じるのボタンは無く、 右上の×で閉じてねと作業者に(読者に)高飛車的態度で言ってました。 そんな手抜きをしてるので、 >それで質問なのですが、ボタンをつくってクリックすると >終了にしたいと思いますが、どうやったら終了になるのでしょうか? >どうしても知りたいと思いますので教えてください。 と質問が来ました。 今回説明したいと思います。 まず、ボタン ┌───┐ │閉じる│btnCLOSE └───┘ とボタンコントロールを追加します。 クリックイベントに、処理を記述します。
Private Sub btnCLOSE_Click()
    Unload Me   '自分自身を閉じます(笑)
End Sub
Unload ステートメント で、 Me(自分自身)オブジェクトをメモリから削除しただけです。 ユーザーフォームの表示は、
Private Sub ボタン1_Click()
    Load UserForm1
    UserForm1.Show
End Sub
と、Load UserForm1でメモリに読み込み、.Showで表示してました。 その逆で、Unloadって感じです。 Unload Me としてましたが、 Unload UserForm1 とフォーム名でもOKです。 まだまだ不親切なんだよね三流君は。 えっ、どこが?丁寧に終了に対比させて開く部分も書いて、 本人は一生懸命やってるつもりなんだけどなぁ。。。 不親切の考え方が違うんだよ。 だからどこが? いきなりUnload Meだと閉じるだろ。 当然ですよ閉じる処理の説明なんだから、なんか文句あるのボク?(逆切れか?) 普通の処理では、終了しますか?とかメッセージが出るんじゃないの? それが無いと不親切な動くだけのプログラム/システムなんだよ。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ギク。。。
Private Sub btnCLOSE_Click()
    '終了を確認する
    If MsgBox("終了します?", vbYesNo, "確認") = vbYes Then
        Unload Me   '自分自身を閉じます(笑)
    End If
End Sub
と、MsgBoxで確認処理を入れてみました。

/* * 3.シートが変わった時のイベント、 */

>それから、あの入力フォームはシートのほうに固定させて >シートをひらくと入力フォームがそこに出てくる、というふうには >出来るのでしょうか? 入力フォームをシートに固定させる方法は、チョットわからないけど、 シートを開いた時に実行させるには、 Worksheet_Activateのイベントで、 シートが選択された時に(アクティブになった時に) 下記のフォームを開く処理を実行させます。
Private Sub Worksheet_Activate()
    Load UserForm1
    UserForm1.Show
End Sub
単純にフォーム開くボタン(タイミング)で行っていた処理を シートが選択された時に(アクティブになった時に) Worksheet_Activateのイベントに記述しただけでした。 同じように、ブックが開いた時のイベントに書くことも出来ます。 *いろいろなタイミング(イベント)でテストして遊んでみてね。

/* * 4.おわりの挨拶 */

今回は、 ・閉じるボタンの作成、Unload Me ・Worksheet_Activateのイベントでシートの切り替わり時にフォームを開いてみた でした。 今回の関連画像は、手抜きで無しです(オイオイ) が、 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba061.lzh にtest061-book.xlsが保存されています。 (画像無しだけど、サンプルぐらいは作りますよ(笑)) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.42 ExcelのForm シートと連動させる] http://www.ken3.org/backno/backno_vba09.html#42 で、 Excelのシートとユーザーフォームを連動させた入力を軽くやりました Excelフォームの作成サンプルは http://www.ken3.org/vba/excel-form.html に軽くまとめてあるので、見てください。

No.62 2003/04/02
Access フォームでパスワード入力(入力後*****表示)
[ページTOPへ戻る]

<Access フォームでパスワード入力(入力後*****表示)>

こんにちは、三流プログラマーKen3です。 4月新たな環境になった人達は落ち着きましたか? *まだ新入社員君達はHPやメルマガみて遊ぶ余裕は無いか(笑) なんて定型の挨拶はこのくらいにして、 ~~~~~~~~~~~~~~~~~~ 今回は、 Access フォームでパスワード入力(入力後*****表示) を軽く書きたいと思います。

/* * 1.今回のキッカケ */

メールで質問もらいました。 In message "質問です", 前* **さん wrote... >VBAについて質問させてください > >入力フォームにパスワードを持たせたいのですが、どうすればよいのでしょうか > >できればアクセスを想定して教えていただきたいのですが ------ 答え易い、勝手な解釈をすると、 ユーザーID [ _______ ] パスワード [ _______ ] なんて入力用のフォームで、 パスワードを入力すると [ ******** ] と*を入力したい、そんな質問だと思いこんで回答します。

/* * 2.定型入力にPasswordと設定するだけ */

定型入力を使い、 テキストボックスへ入力した文字を*****表示するように設定します。 操作手順 ~~~~~~~~ 「テキストボックス」のプロパティを開きます。 「定型入力」横の「...」ボタンをクリックして 「定型入力ウィザード」を表示。 ~~~~~~~~~~~~~~~~~~~~~ 一覧より「パスワード」を選択し、「完了」する。 こんなんでいいのかなぁ。 ウイザード使わないで、直接定型入力にPasswordと設定してもOKです。 定型入力にあったんですね。

/* * 3.おわりの挨拶 */

今回は、 ・定型入力にPasswordと設定 でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- メールで件名が質問だとまたか?なんてドキッとするときがあって、 [No.151 メールを開かせる姑息なテクニック、鼻の下伸ばしてると危ないよ(笑)] http://www.ken3.org/backno/backno_guchi30.html#151 で、 メルマガ作者泣かせの件名 ~~~~~~~~~~~~~~~~~~~~~~~~ 件名:質問です について軽く語ってます。 あと、掲示板やML系の話題で、 [No.148 公園デビューする気持ち?と掲示板の猛者達(笑)] http://www.ken3.org/backno/backno_guchi29.html#148 では、 質問の方法って難しいんだなぁなんて軽く書いてます。 時間がある時、のぞいてください。 *自分のHP宣伝でした。

No.63 2003/04/06
Excel UserForm で データ・フォームの機能を真似てみる
[ページTOPへ戻る]

<Excel UserForm で データ・フォームの機能を真似てみる>

こんにちは、三流プログラマーKen3です。 4月新たな環境になった人達は落ち着きましたか? *まだ新入社員君達はHPやメルマガみて遊ぶ余裕は無いか(笑) なんて定型の挨拶はこのくらいにして、 ~~~~~~~~~~~~~~~~~~ 今回は、 ユーザーフォームの作成で、 データ・フォームの機能を真似て作ってみたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba063.lzh に保存されてます。 test061-book.xlsを開いて、穴を探して見て下さい。 *こんな処理ができてない、あんな処理も・・・など出てきますよ(笑)

/* * 1.今回のキッカケ */

掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に貰った質問、 >投稿日 : 2003/04/03(Thu) 15:43 >投稿者 : sattoch >タイトル : またできないことが > >こんにちは。やっと閉じることが出来ました。 >それで、もう一つお尋ねしたいことができました。 >入力して、たとえば「追加」のボタンをつくって >それをクリックすれば入力したものがシートにうつされて >また入力フォームがきれいになって、そこに入力してまた >「追加」ボタンを押すとそれがシートにうつされて・・・ >となるようにするのは難しいでしょうか。 --- [No.61 Excel Form 閉じる方法 Unload Me] http://www.ken3.org/backno/backno_vba13.html#61 で、 Unload Meでユーザーフォームを閉じる方法を解説しました。 今回は、 Excelのメニューでデータ・フォームとやると標準で入力フォームが出ます。 この機能を少しまねてみたいと思います。 機能のボタンを見ると  新規  削除  元に戻す  前を検索  次を検索  検索条件  閉じる それと、1 / 3 (n / MAX)と件数表示 あとはスクロールバーですね。

/* * 2.まずは、1 / 3 (n / MAX)と件数を管理 */

シートのイメージは _____A列___________B列_______C列____________D_______________________E_______ 1行 画像タイトル ファイル名 コメント 画像ベースディレクトリ→ D:\temp\ 2行 サンタ 001.gif ケーキ写真 3行 お正月 012.jpg XXXXXXXXXX です。 まずは、1 / 3 (n / MAX)と件数をフォームに表示したいので、 ラベルコントロールを追加します。 コントロール名は、labCounterにしました。 さてと、まずはデータの行数を数えないとね。 グローバル変数にnMAX As Integerを追加して変数で管理しますか。 Dim yCNT As Integer '行カウンター Dim nMAX As Integer '最終行を覚えておくカウンター No.63で追加 フォームが開いた時に実行されるイベント、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ _Initializeで数えます。
Private Sub UserForm_Initialize()

    'ディレクトリが入って無い時、ブックのパスを代入
    If Len(Sheets("DATA").Range("E1")) = 0 Then
        Sheets("DATA").Range("E1") = ThisWorkbook.Path & "\"
    End If

    '初期処理
    yCNT = 2   '初期値の2行目を代入

    'データの数を数えます No.63で追加
    nMAX = 0   '0で初期化
    While Len(Cells(2 + nMAX, "A")) <> 0 '2行目からA列にデータあるかチェック
        nMAX = nMAX + 1  'カウンタを増やす
    Wend
    Debug.Print "_Initialize nMAX=" & nMAX 'デバッグで数値を表示

    'セルの値をフォームのテキストボックスに代入する
    Call SheetToForm

    '画像ファイルを表示する
    Call PUTPicture

End Sub
登録されているデータの行数を数えたいので、 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 単純にLen(Cells(行,列))<>0を条件にループを行います。 'データの数を数えます No.63で追加 nMAX = 0 '0で初期化 While Len(Cells(2 + nMAX, "A")) <> 0 '2行目からA列にデータあるかチェック nMAX = nMAX + 1 'カウンタを増やす Wend Debug.Print "_Initialize nMAX=" & nMAX 'デバックで数値を表示 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ で確認の意味でイミディエイトウインドウに変数の値を表示します。 イミディエイトとDebug.Printの説明は --> http://www.ken3.org/vba/iwind.html を見て下さい。 Len(Cells(2 + nMAX, "A")) ~~~~~~~~~~~~~~~~~~~~~~~~~ 次の行が存在するかチェックのため、 タイトル行で+1、次の行で+1なので、 2+nMaxで確認してます。 行数を数え終わったら、今度はn/nの表示です。 'セルの値をフォームのテキストボックスに代入する Call SheetToForm と、SheetToFormでシートの値をフォームに代入している関数があるので、 ここで、セットしてみたいと思います。
Sub SheetToForm() 'セルの値をフォームのテキストボックスに代入する
    txtTITLE = Sheets("DATA").Cells(yCNT, "A")
    txtFILENAME = Sheets("DATA").Cells(yCNT, "B")
    txtMEMO = Sheets("DATA").Cells(yCNT, "C")
    Rows(yCNT).Select   '行を選択 vba049で追加
    LabCounter = (yCNT - 1) & "/" & nMAX 'ラベルに現在行を追加 vba063で追加
End Sub
LabCounter = (yCNT - 1) & "/" & nMAX で作成したラベルコントロールに文字列をセットしてます。

/* * 3.新規(追加)のボタン処理 */

次は、新規(追加)のボタン処理です。 ボタンコントロールを追加します。 名前はbtnADDNEWとします。 やりたいことは、新規のデータ追加なので、 ・現在のフォーム内容をクリア ・最終行に移動 です。
Private Sub btnADDNEW_Click() '新規のボタン
    'フォームの値をクリアする
    txtTITLE = ""
    txtFILENAME = ""
    txtMEMO = ""
    imgBOX.Picture = LoadPicture("") '画像を消す(私は忘れた(笑))
    '選択位置を変更
    nMAX = nMAX + 1 '新規追加されたので、Max行数を増やす
    yCNT = nMAX + 1 '行カウンタはタイトル行があるので+1する
    Rows(yCNT).Select        '行を選択(空白だけど)
    LabCounter = "新規データ" 'ラベルに新規データと文字を入れる
End Sub
フォームに””の空文字をセットして、新規の入力用にデータを消してます。 忘れずに画像のエリアも消します(私は消し忘れた三流だなぁ(笑)) 次は、行移動です。 単純にnMAX = nMAX + 1 で最終行を増やし、 現在行カウンタを調整、n/nラベルに新規データとセットしてます。

/* * 4.更新ボタンを追加する */

自動的にシートにセットされていた処理を、 更新ボタンが押されたらセットする処理に変えます。 btnUPDATEとボタンコントロールを作成します
Private Sub btnUPDATE_Click()
    'データセットの確認
    If MsgBox("データを更新します", vbYesNo, "確認") = vbYes Then
        '単純にフォームからデータをシートへ転記する
        Sheets("DATA").Cells(yCNT, "A") = txtTITLE
        Sheets("DATA").Cells(yCNT, "B") = txtFILENAME
        Sheets("DATA").Cells(yCNT, "C") = txtMEMO
    End If
End Sub
単純にフォームの項目をシートへセットしています。

/* * 5.削除ボタンの処理 */

データを削除するボタンを作成します。 削除の確認メッセージを表示 行を削除する カウンタを−1する btnDELとボタンコントロールを作成します。
Sub btnDEL_Click()
    '削除を確認する
    If MsgBox("データを削除します?", vbYesNo, "確認") = vbYes Then
       Rows(yCNT).Select  '現在行を選択
       Selection.Delete Shift:=xlUp '選択されている行を削除する
       If nMAX <> 1 Then nMAX = nMAX - 1  '行頭以外なら最大行数を−1する
       Call SheetToForm   '削除後にデータを表示
    End If
End Sub
普通にMSGBOXで削除の確認を行います。 マクロ記録で記録した行削除を行います。 Rows(yCNT).Select '現在行を選択 Selection.Delete Shift:=xlUp '選択されている行を削除する 先頭行の削除以外なら、最大行数を−1する シートが削除で移動されているので、 データを再表示するために、Call SheetToForm と関数を呼ぶ。

/* * 6.おわりの挨拶 */

今回は、 Excel データ・フォームの機能を真似てみる でした。 実は、まだまだ、操作的になっとくいかないバグがあるので、 サンプルファイル、 http://www.ken3.org/vba/lzh/vba063.lzh をダウンロードして、test061-book.xlsを開いて、穴を探して見て下さい。 *こんな処理ができてない、あんな処理も・・・など出てきますよ(笑) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.61 Excel Form 閉じる方法 Unload Me] http://www.ken3.org/backno/backno_vba13.html#61 で、 Unload Meでユーザーフォームを閉じる方法を解説しました。

No.64 2003/04/11
AccessからExcelファイルを開いて・印刷して・閉じたい
[ページTOPへ戻る]

<AccessからExcelファイルを開いて・印刷して・閉じたい>

こんにちは、三流プログラマーKen3です。 4月新たな環境になった人達は落ち着きましたか? *まだ新入社員君達はHPやメルマガみて遊ぶ余裕は無いか(笑) なんて定型の挨拶はこのくらいにして、 ~~~~~~~~~~~~~~~~~~ 今回は、 AccessからExcelファイルを開いて・印刷して・閉じたい です。

/* * 1.今回のキッカケ */

下記の質問を貰いました >現在、access+excelのアプリを開発していて、行き詰まっていることがあります。 >知恵を貸してくれませんか? >accessVBAの制御下で、excelファイルを開き、それを印刷して、閉じる処理をした >いのです。 ---- と最近設置したHPからの質問フォームで送ってもらいました。 *メルマガ評価システムと質問送信フォームを最近設置しました。  たまには、 http://www.ken3.org/vba/ に遊びに来てください。 なんて、宣伝は置いといて、そろそろ真面目に解説に入ろうかなぁ。

/* * 2.AccessからExcelを起動する */

あっ、忘れてた過去の事例紹介(オイオイヤメロってしつこいから・・・) [No.2 AccessからExcel出力] http://www.ken3.org/backno/backno_vba01.html#2 で、 ・ウィザードを使ってたサンプルを作れることを説明 ・マクロ記録でExcelの操作をVBAにする ・頭にオブジェクト変数を付けてAccessからExcelを操作 を簡単に説明しました。 繰り返しになってしまうけど、 AccessからExcelを起動するプログラムが知りたかったので、 AccessのフォームでExcelを開くマクロをボタンウィザードで作ります。
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

Exit_コマンド0_Click:
    Exit Sub

Err_コマンド0_Click:
    MsgBox Err.Description
    Resume Exit_コマンド0_Click
    
End Sub
と自動的に作られます。 実行すると、Excelが開きます。 *これは、Excelを起動するだけなので、ひとまず置いといて。

/* * 3.Excelでやりたい操作を記録する */

次にExcelでやりたいことをマクロに記録します やりたいことは、 ・ファイルを開いて ・印刷 ・閉じる なので、マクロ記録を使って記録してみます。
Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2003/4/11  ユーザー名 : K
'
    ChDir "D:\"
    Workbooks.Open FileName:="D:\集計表.xls"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1
    ActiveWorkbook.Close
End Sub
上記のように記録されます(作成されます。) なんかあっけないなぁ。

/* * 4.組み合わせてAccessからExcelの操作を行う */

あとは、この2つを合わせて基本形を作ります。
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

    'ファイルを開く
    oApp.Workbooks.Open FileName:="D:\集計表.xls"
    
    'データの加工処理/セット処理
    oApp.cells(1, 1) = Now  'テストです
      '・
      '・ その他いろいろとセットする
      '・
    
    'プリントする
    oApp.ActiveWindow.SelectedSheets.PrintOut Copies:=1
    
    'ファイルを閉じる
    oApp.ActiveWorkbook.Close SaveChanges:=False

    'Excelを閉じる
    oApp.Quit

Exit_コマンド0_Click:
    Exit Sub

Err_コマンド0_Click:
    MsgBox Err.Description
    Resume Exit_コマンド0_Click
    
End Sub
ポイントは、 ~~~~~~~~~~~~ Excelで作った(記録した)マクロに oAppと参照用の変数を付けます。 なんか、違和感ありますが、 Dim oApp As Object Set oApp = CreateObject("Excel.Application") で、Excelアプリケーションを参照するオブジェクトを作成します。 このオブジェクトoAppに対して(Excelが参照されている) プロパティやメソッドを操作する=Excelを操作するになります。 *なんかストレートじゃないなぁ・・・ マクロ記録で作成した開く処理 Workbooks.Open FileName:="D:\集計表.xls" をAccessから使いたいので、 oApp.Workbooks.Open FileName:="D:\集計表.xls" とします。 あとの隠し味は、 oApp.ActiveWorkbook.Close SaveChanges:=False .CLOSEの時、SaveChanges:=Falseと更新を保存しない 確認のダイアログを出さない と oApp.QuitでExcelを終了 ぐらいです。 [No.54 AccessからExcel開いて、処理終了後に閉じたい] http://www.ken3.org/backno/backno_vba11.html#54 で、 .RunでExcelのVBA関数を呼び出し、処理後、 oApp.ActiveWorkBook.Close SaveChanges:=False oApp.Quit で終了する処理を解説しました。 ※また、過去のメルマガの宣伝か(笑)

/* * 5.おわりの挨拶 */

今回は、 AccessからExcelファイルを開いて・印刷して・閉じたい でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.2 AccessからExcel出力] http://www.ken3.org/backno/backno_vba01.html#2 で、 ・ウィザードを使ってたサンプルを作れることを説明 ・マクロ記録でExcelの操作をVBAにする ・頭にオブジェクト変数を付けてAccessからExcelを操作 を簡単に説明しました。 [No.7 MDBと同フォルダのExcelファイルを開く] http://www.ken3.org/backno/backno_vba02.html#7 では、 CurrentDb.NameからMDBの位置を取りだし、 相対位置(同じパス)のExcelファイルを開きました。 [No.13 Excel セルに名前を付けてみる] http://www.ken3.org/backno/backno_vba03.html#13 では、 Accessから名前付きのセルにデータをセットして、 変更が少ないシステムについて説明しました。 [No.48 AccessからExcelブックを開き、書式設定を行う] http://www.ken3.org/backno/backno_vba10.html#48 では、 AccessからExcelブックを開き、 objEXCEL.Selection.Style = "Comma [0]" objEXCEL.Selection.NumberFormatLocal = "0.00_ " で書式設定を行うサンプルを解説しました。 [No.54 AccessからExcel開いて、処理終了後に閉じたい] http://www.ken3.org/backno/backno_vba11.html#54 では、 .RunでExcelのVBA関数を呼び出し、処理後、 oApp.ActiveWorkBook.Close SaveChanges:=False oApp.Quit で終了する処理を解説しました。 [No.59 Excelのマクロ付きフォーマットを壊されないように] http://www.ken3.org/backno/backno_vba12.html#59 では、 ActiveWorkbook.SaveAs FileName:="XXXXXX" と別名に保存して、元ファイルを壊されない小細工を説明しました。 時間がある時、のぞいてください。 *自分のHP宣伝でした。


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

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

カスタム検索
三流君(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系バックナンバー目次へ移動]