<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 |
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 |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]