[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.059 Excelのマクロ付きフォーマットを壊されないように

Excelのマクロ付きフォーマットを壊されないように

メルマガ発行内容

<Excelのマクロ付きフォーマットを壊されないように>

こんにちは、 三流プログラマーKen3です。 今回は、 Excelのマクロ付きフォーマットを壊されないように を軽く書きたいと思います。 今回の関連画像は、手抜きで無しです(オイオイ)

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

前回の続きなんだけど、 2003/03/18 Access クエリーを Excel既存シートへ エクスポート ( http://www.ken3.org/backno/backno_vba12.html#58 を参照) で、 悪戦苦闘してました。 BBS に以下の投稿がありました。 ( http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi?mode=allread&no=66&page=0 ) >投稿時間:2003/03/19(Wed) 01:38 >投稿者名:TMNOA >タイトル:Re: DoCmd.TransferSpreadsheet acExport でできそうなのですが... > >KEN3 様 > >返信ありがとうございました。 >人生初めてのBBSの使用で少し緊張していたのですが・・・。 > >すみませんが、現状をもう少し説明させてください。 > >1、ACCESSのクエリーより(日付・数量)をEXCELにエクスポートしま >す。(既存ブック・新規シート) > >2、既存ブック・新規シートにあるデータを同じ既存ブックの既存シート(カレン >ダー形式の雛形)にIFVOOKUP関数を使用して、転送 > >3、雛形自体をプリントアウトして、データを保存せずにEXCELを閉じる。 > >この状況で、データを保存しないと2番のIFVOOKUP関数の数式が壊れてしま >い2回目以降使用できません。 > >そこで昨日お話させていただいたのですが、アクセス・クエリーよりエクセルの既存 >ブック・既存シートの雛形(カレンダー雛形)にエクスポートしたいのですが・・・。 > >すみません、お手間を取らせて。 >何か案がありましたら、よろしくお願い致します。 -------------------------------------------------------- と書き込みがありました。 さて、どうしましょう? なんて言って無いで、 過去の記憶を(経験から)似たような事例を頭に思い浮かべると あっ、あれがいいかなぁと1つ浮かんだので、メルマガに載せます。

/* * 2.苦い経験、Excelのマクロ付きフォーマットを壊された */

その昔、AccessのデータからExcelの雛形にデータをセットしてました。 私の場合は、関数が壊れたとかじゃなくて、 Excelなので、担当者がいろいろとフォーマットをイジって上書き保存してしまい、 処理が動かなくなったなんてことがありました。 >3、雛形自体をプリントアウトして、データを保存せずにEXCELを閉じる。 > >この状況で、データを保存しないと2番のIFVOOKUP関数の数式が壊れてしま >い2回目以降使用できません。 いつものクセで文章を逆に読むと、(嫌いじゃない=好き、とは言えないけど何の話?) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ データを保存すると、数式は壊れない? でも保存すると2回目以降不具合がある? なんて勝手に想像しました。 私がやってた処理は(対策は)、 Excelの雛形にデータをセット後に、 別名で保存してあとはお好きなように的な処理にしました。 なんて書いても?なので、実際の処理を載せます。 ファイルの構成 (V:が共有ネットワークドライブです) C:\MDB\別荘管理.mdb V:\DATA\MAKE_水道台帳.xls (これが雛形) V:\DATA\PRINT.CSV (クエリーをCSVにした中間データ) V:\水道台帳.xls (別名にした結果のファイル) ________ 処理概要 ^^^^^^^^ Accessの管理データから抽出された情報をCSVに保存します。 DoCmd.TransferText acExportDelim, "", "Q_CSV_水道台帳", "V:\DATA\PRINT.CSV" ExcelをCreateObject("Excel.Application")で起動 雛形を開く oApp.workbooks.Open "V:\DATA\MAKE_水道台帳.xls" 'フォーマットを開く データセット処理 oApp.Run ("MAIN") 'Excel側のマクロを起動 ここからExcel側で、 Call READ_DATA 'CSVからデータ読みこみ Call MAKE_DATA 'データをセット でポイントが下記の、 'フォーマット破壊防止 and 作業者が使いやすいように共通V:のルートへ ActiveWorkbook.SaveAs FileName:="V:\水道台帳.xls", FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False と、共通ドライブのルートに別名にして保存しました。 *雛形は保存されてないので、2回目の処理も動くし、  作業者がシートをいじっても、大丈夫かなぁ。 _______________________________ Access側の処理 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub B_水道料台帳_Click()

    Dim oApp As Object
    Dim W_MIDASHI As String

    W_MIDASHI = "MIDASHI"

    DoCmd.TransferText acExportDelim, "", "Q_CSV_水道台帳", "V:\DATA\PRINT.CSV", True, ""

    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    'Only XL 97 supports UserControl Property
    oApp.UserControl = True
    
    oApp.workbooks.Open "V:\DATA\MAKE_水道台帳.xls"  'フォーマットを開く
    oApp.sheets("MIDASHI").Cells(1, 1) = Me![SEL_別荘].Column(0)
    oApp.sheets("MIDASHI").Cells(2, 1) = Me![SEL_別荘].Column(0)

    oApp.Run ("MAIN")  'Excel側のマクロを起動

End Sub
__________________________________________ Excel側の処理 V:\DATA\MAKE_水道台帳.xls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub MAIN()

    Application.DisplayAlerts = False
    Application.Caption = "水道料入金台帳"

    Sheets("HYO").Select
    Range("A1").Select

    Call READ_DATA
    Call MAKE_DATA

    'フォーマット破壊防止 and 作業者が使いやすいように共通V:のルートへ
    ActiveWorkbook.SaveAs FileName:="V:\水道台帳.xls", FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
    
    MsgBox "データ作成終了、B5用紙をセット後、印刷してください。"

End Sub
Sub READ_DATA()
'
' Macro1 Macro
' 記録日 : 1998/2/17  
'

    Workbooks.Open FileName:="V:\DATA\PRINT.CSV"
    Cells.Select
    Selection.Copy
    
    Windows("MAKE_水道台帳.xls").Activate
    Sheets("DATA").Select
    Cells.Select
    ActiveSheet.Paste
    
    Range("A1").Select
    Application.CutCopyMode = False
    Selection.Copy

    Windows("PRINT.CSV").Activate
    Range("A1").Select
    ActiveWorkbook.Close
    
End Sub
Sub MAKE_DATA()

    Dim W_FURIGANA

    W_FURIGANA = Left(Sheets("DATA").Cells(2, 8), 1)

    Sheets("HYO").Select
    Range("A1").Select

    'データ数を数える
    Y_LINE = 2
    While 0 < Len(Sheets("DATA").Cells(Y_LINE, 2))
        Y_LINE = Y_LINE + 1
    Wend

    'コピー先にデータを挿入する
    Sheets("HYO").Select
    Rows("4:4").Copy
    Rows("5:" & LTrim(Str(5 + Y_LINE))).Select
    Selection.Insert Shift:=xlDown
    
    'データをセットする
    Y_LINE = 2
    YY = 4
    While 0 < Len(Sheets("DATA").Cells(Y_LINE, 2))
        'セットするセルに移動する
        Cells(YY, 1).Select
        
        '滞納有無
        If Sheets("DATA").Cells(Y_LINE, 12) > 1 Then
            Cells(YY, 1) = "滞"
        Else
            Cells(YY, 1) = " "
        End If
        
        '氏名 印刷エリアが小さいので省略形にする。まったく追加処理だよ
        W_NAME = Sheets("DATA").Cells(Y_LINE, 3)
        W_MAE = Left(W_NAME, 4)
        W_ATO = Right(W_NAME, 4)
        If W_MAE = "株式会社" Then
            W_NAME = "(株)" & Mid(W_NAME, 5, 30)
        End If
        If W_MAE = "有限会社" Then
            W_NAME = "(有)" & Mid(W_NAME, 5, 30)
        End If
        If W_ATO = "株式会社" Then
            W_LEN = InStr(W_NAME, "株式会社")
            W_NAME = Mid(W_NAME, 1, W_LEN - 1) & "(株)"
        End If
        If W_ATO = "有限会社" Then
            W_LEN = InStr(W_NAME, "有限会社")
            W_NAME = Mid(W_NAME, 1, W_LEN - 1) & "(有)"
        End If
        
        Cells(YY, 4) = W_NAME
        
        '改ページのチェック 1998/06/29 追加、グループ化しろって?やんなるね
        If W_FURIGANA <> Left(Sheets("DATA").Cells(Y_LINE, 8), 1) Then
            W_FURIGANA = Left(Sheets("DATA").Cells(Y_LINE, 8), 1)
            KUGIRI = LTrim(Str(YY))
            Rows(KUGIRI & ":" & KUGIRI).Select
            ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
        End If
        
        '号地
        Cells(YY, 5) = Mid(Sheets("DATA").Cells(Y_LINE, 2), 2, 1)
        Cells(YY, 6) = Mid(Sheets("DATA").Cells(Y_LINE, 2), 4, 6)
        '地積
        Cells(YY, 7) = Sheets("DATA").Cells(Y_LINE, 5)
        
        '建物管理費
        W_KAZU = Sheets("DATA").Cells(Y_LINE, 6)
        Cells(YY, 8) = Format(Int(W_KAZU / 1000), "##")
        If Val(Cells(YY, 8) & "") > 0 Then
            Cells(YY, 9) = Format((W_KAZU Mod 1000), "000")
        Else
            Cells(YY, 9) = Format((W_KAZU Mod 1000), "###")
        End If
        
        '他の年度にも同様の数値をセットする
        Cells(YY, 11) = Cells(YY, 8)
        Cells(YY, 12) = Cells(YY, 9)
        Cells(YY, 14) = Cells(YY, 8)
        Cells(YY, 15) = Cells(YY, 9)
    
        'カウントアップ
        Y_LINE = Y_LINE + 1
        YY = YY + 1
    Wend


    '保存する
    Range("A1").Select
    'ActiveWorkbook.Save '上のルーチンで別名保存するので
    'もうフォーマット壊すなよなぁ
    'VBAいじれる社員が来たらどうしましょう?
    'ここみてたら、一緒にがんばろうよ。変更多いよここ。

End Sub

/* * 3.実際にあった私のお馬鹿な失敗談(笑) */

まぁ、そんな感じで、フォーマットの破壊は発生しなくなりました。 で、余談の笑い話があって、 EXCEL側のVBA修正で、テストデータがほしかったので、 Accessからボタンを押してExcelファイル作成。 あとはExcelの世界で実行、テストを繰り返し、完成、保存。 もうオチがわかってしまった? Accessからこの処理でファイルを作成すると、 V:\DATA\MAKE_水道台帳.xls (雛形) を開いて、 V:\水道台帳.xls (別名の結果ファイル)を作成。 私はなんにも気にしないで、別名の水道台帳.xls内のVBAを修正してた。 で、完成、最終段階のAccessから連動起動の動作チェックをする。 あれ?もとのままだ。 あっ!!!!! ~~~~~~~~~~~~~~ とかなりのショックを受けた記憶が。。。。 *V:\DATA\MAKE_水道台帳.xls (雛形)を修正しないとね、、、(笑) 皆さんは同様の失敗をしないように(笑) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *面白い失敗談、聞いてほしい話などあったら、  掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi  へ書き込んでください。  こんな変な先輩居たよ、、と先輩の話でもOKです。

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

今回は、 ・Excel雛形ファイルを壊されないように別名で保存 ・Ken3のお馬鹿な失敗談、アナタは雛形ファイルに修正しないと でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.2 AccessからExcel出力] http://www.ken3.org/backno/backno_vba01.html#2 [No.7 MDBと同フォルダのExcelファイルを開く] http://www.ken3.org/backno/backno_vba02.html#7 [No.14 Excel 隣のシートを参照して逃げる] http://www.ken3.org/backno/backno_vba03.html#14 [No.48 AccessからExcelブックを開き、書式設定を行う] http://www.ken3.org/backno/backno_vba10.html#48 [No.54 AccessからExcel開いて、処理終了後に閉じたい] http://www.ken3.org/backno/backno_vba11.html#54 [No.58 Access クエリーを Excel既存シートへ エクスポート]</A><br> http://www.ken3.org/backno/backno_vba12.html#58

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.059を読んだ満足度(評価)は?
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に流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・