• ベストアンサー

Excel2003のVBAでプログラミングをしています。

Excel2003のVBAでプログラミングをしています。 作成しているのは売上のデータを外部DBから抽出し既定のフォーマットに整形するツールです。 そのファイルを送信先各位の送信する際にそのWorkBookをそのまま送信すると マクロが含まれている分動作が非常に重くなってしまいます。 そこで、同じフォーマットのコピーを作成したいのですが workbookオブジェクトのSaveCopyasメソッドを使用してコピーを作成すると マクロごとコピーされて意味がありません。 各worksheetの値のみをコピーする方法はありませんでしょうか。 どなたか助言おねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

形式を選択して貼り付ける(PasteSpecialメソッド) http://www.moug.net/tech/exvba/0050104.htm ※xlPasteFormats ※xlPasteValues の二回貼り付け ただし結合セルがある場合は、結合されたセルの範囲だけでのペーストを行わなければならない Sub 呼出例()   Dim l_xlsSht1  As Worksheet   Dim l_xlsBok2  As Workbook   Dim l_xlsSht2  As Worksheet      'マクロの存在するシートの先頭を複写元   Set l_xlsSht1 = ThisWorkbook.Worksheets(1)      '新しいワークブックを追加して、その先頭を出力先   Set l_xlsBok2 = Workbooks.Add()   Set l_xlsSht2 = l_xlsBok2.Worksheets(1)   'コピー実行   Call CopySheet(l_xlsSht1, l_xlsSht2) End Sub Sub CopySheet(p_xlsSrc As Worksheet, p_xlsDst As Worksheet)   Dim l_xlsRngDst As Range      Set l_xlsRngDst = p_xlsDst.Cells   Application.CutCopyMode = False   '複写元をCtrl+C   p_xlsSrc.Cells.Copy      '形式を選択して貼り付け(書式)   Call l_xlsRngDst.PasteSpecial(xlPasteFormats)   '形式を選択して貼り付け(値)   Call l_xlsRngDst.PasteSpecial(xlPasteValues)   'コピーモード解除   Application.CutCopyMode = False      Call MsgBox("終了", vbInformation)      '出力先が選択された状態になっているので、先頭を選択して解除する   l_xlsRngDst.Cells(1).Select End Sub

anman0201
質問者

お礼

遅くなりましてすみません。 ご回答ありがとうございます。 問題はこの方法で解決できました。 またなにかあればお願いします。

その他の回答 (6)

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.6

そういう場合「規定のフォーマット」のシートは別のファイルに作成し マクロからそのファイルを開いてデータを貼りつけてセーブする。 マクロの入っているブックはマクロの開始前と終了後は変化しないようにしておく。 そうしないとテストやデバッグが大変になる。また運用も無図解しくなる。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.5

>シートのセルの値のみを別ブックのシートにコピーしたい  やり方はいくつもあろうかと存じますが。。。  良い方法が思い付かなければ、VBA の途中で、数式の入っているセルを「値化」するというようなこともできますし、 1)テンプレート ブック で 全セル を選択。 2)[書式(O)] - [セル(E)] - [保護] タブ - [表示しない(I)] の チェックボックス を オン にする。 3)テンプレート ブック を一旦保存し、終了する。 4)VBAブック から テンプレート ブック を起動し、 >売上のデータを外部DBから抽出し既定のフォーマットに整形 した後で、[ツール(T)] - [保護(P)] - [シートの保護(P)...] をかける。 5)新規ブック を開く。 6)テンプレート ブック ですべて選択し、コピー、新規ブック に貼り付ける。 と数式は コピー されません。  もっと、簡単な方法があったかも知れませんが。。。  なお、(1) ~ (3) は一度しておけば、VBAブック には、(4) ~ (6) の作業だけ記録しておけばよいです。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#2です。 >シートの関数をすべて値にもどしてコピーは可能でしょうか。 シートのコピーでなくシートのデータのあるセル範囲(Range)の他ブック・他シートへコピー貼り付けで 形式を選択して貼り付けー値(xlValue)の操作(1件1シート分)をして、マクロの記録を採ってみてください。 本番ではシートごとにそれを繰り返すコードを作る。For Each sh In Worksheets それができると、またコードがわかると思うが。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

#1 DOUGLAS_ です。 #2 さんのご回答を拝見していて思ったのですが、 >その「worksheet」に シートモジュール が含まれない場合 >その「worksheet」に シートモジュール が含まれる場合 という考え方は冗長でしたね。  最初から、新規ブック を開いて、そこに >売上のデータを外部DBから抽出し既定のフォーマットに整形 すれば、一番簡単かと存じます。  従って、 1)操作用の VBA 専用の ブック を作る、あるいは、#1 さんがお書きのように、 >Personal.xlsにVBAを保存 2)「既定のフォーマットに整形」された テンプレート 用の ブック を作る。 3)(1) の VBA により、(2) を開き、 >売上のデータを外部DBから抽出し既定のフォーマットに整形 した後で、(2) の ブック を別名で保存、あるいは、この時点で、 >そのファイルを送信先各位の送信する というのが、普通の考え方かも知れません。

anman0201
質問者

お礼

ご回答ありがとうございます。 コピーを行う場合 日付を関数を使用して取得しているので コピーしたシートを見ると日付欄は編集用のブックを参照してしまいます。 理想はシートのセルの値のみを別ブックのシートにコピーしたいのですが その方法はありますでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

手操作なら他ブックへのシートこぴーなどすれば済むのではないですか。 面倒だと言うのなら (1)データだけのブックをVBAで別途作る。 (2)マクロをVBAで消去する。 以上は http://www.keep-on.com/excelyou/2001lng4/200107/01070298.txt にコード例が在る。 (3)Personal.xlsにVBAを保存すると、送信先にはPersonal.xlsは送られず、内容も見られず、 実行もされない。しかしシートモジュール(イベント関係など)があると、Personal.xlsには入ってなくて、元のブックにあり、見れたり実行されると思う。(もし標準モジュールを参照していると、エラーだが。)

anman0201
質問者

お礼

いつも回答ありがとうございます。 マクロをVBAで消去は参考になる方法です。 ありがとうございます。 シートの関数をすべて値にもどしてコピーは可能でしょうか。 日付取得関数を使用しているのですが、 これがすべてのシートに^適用されているので 動作が重くなっているようです。 なにか方法があればお願いします。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

>各worksheetの値のみをコピーする方法  その「worksheet」に シートモジュール が含まれない場合の、簡単な手口として、下記の様な操作を [新しいマクロの記録] で記録してみましょう。 1)[ツール(T)] - [マクロ(M)] - [新しいマクロの記録(R)...] を クリック します。 2)当該「worksheet」の シートタブ を [右クリック] - [移動またはコピー(M)...] を クリック します。 3)[シートの移動またはコピー] ダイアログ - [移動先ブック名(T):] を「(新しいブック)」にし、[コピーを作成する(C)] の チェックボックス を オン にして、[OK] します。 4)新しく開いたブック(コピーされたもの)を適当な名前で保存して、終了します。 5)[ツール(T)] - [マクロ(M)] - [記録終了(R)...] を クリック します。  以上で、 Sub Macro1()  Sheets("worksheet").Select  Sheets("worksheet").Copy  ActiveWorkbook.SaveAs Filename:= _   "{保存先ファイルのフルパス}\適当な名前.xls", FileFormat:=xlNormal, _   Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _   CreateBackup:=False  ActiveWorkbook.Close End Sub というような コード を得ることができます。  その「worksheet」に シートモジュール が含まれる場合は、新規の ブック を立ち上げて、シート全体 を コピペ する操作でも記録してみてください。

関連するQ&A

  • VBAにて新規ブックへ既存シートのコピー

    みなさんのお力を貸して下さい。 現在エクセルマクロにて新規ブックを作成し、作成したブックへ既存のシートをコピーをしたいと思っています。 しかし、コピーメソッド実行時にエラー1004 WorksheetクラスのCopyメソッドが失敗しましたというエラーが発生して困っています。 Dim oXls As Object Dim oWbk As Object Dim oSheet As Object Set oXls = CreateObject("Excel.Application") Set oWbk = oXls.Workbooks.Add ThisWorkbook.Worksheets("Sheet1").Copy Before:=oWbk.Worksheets("Sheet1")  どなたかご教授、よろしくお願いします。

  • エクセル2013VBAブックコピーでボタンリンク

    エクセル2013のVBAの事で質問です。 あるファイルをSaveCopyAsでコピーして、コピーしたファイルのシートをアクティブシートのみ残して全削除するようにした(その他もシート内で色々処理)のですが、新しく作成したファイルのマクロを登録してあるボタンがコピー前のファイルのマクロにリンクされてしまいエラーを起こしました。 今まで他のファイルでSaveCopyAsを使ってコピーしていましたが、特にそのようなこともなく使えていました。 どんな原因または修正法が考えられるでしょうか? すいませんが、よろしくお願いいたします。

  • Excel VBAでのSaveCopyAsの挙動

    Excel 2016/2019を使っています。よろしくお願いします。 ブックに変更があった場合にバックアップを保存したいので、 上書きにならないように日付と連番をつけてバックアップ専用フォルダにSaveCopyAsを使って保存しようとしています。 明示的に「保存」アイコンをクリックすると期待通りの動作が行われます。しかし、保存せずに「x」印をクリックして閉じてしまった場合でも、変更があるならバックアップファイルを作りたいのですが、SaveCopyAsを通っているのにバックアップファイルが作成されません。 記載したコードは以下のとおりです。 ThisWorkbookオブジェクトに対して、 Public Sub Workbook_beforeClose(Cancel As Boolean) '変更があれば(ThisWorkBookを)保存 If ThisWorkBook.Saved = False Then ThisWorkBook.Save End If End Sub 'ThisWorkBookの保存時にバックアップを作成 Private Sub Workbook_BeforeSave(省略) If ThisWorkbook.Saved = False Then 'バックアップファイルのフルパスを作成  ThisWorkbook.SaveCopyAs "バックアップファイルフルパス" End Sub 何かヒントをお持ちの方みえられましたらご教示いただければ幸いです。

  • エクセルへの書き出し

    サンプル本を片手に作業しています。 PHPでexcelデータを作る場合、以下のようなソースがあります。 <? //依存モジュールの読み込み require_once 'Spreadsheet/Excel/Writer.php'; //エクセルシートのオブジェクトを作成 $workbook = new Spreadsheet_Excel_Writer(); //test02.xlsとしてダウンロードを開始するようHTTPヘッダーを送信 $workbook -> send('test02.xls'); //1枚目のワークシートを作成 $worksheet1 =& $workbook -> addWorksheet('社員名簿'); //データを書き出し $worksheet1 -> write(0,0,'名前'); $worksheet1 -> write(0,1,'年齢'); $worksheet1 -> write(0,2,'出身地'); $worksheet1 -> write(1,0,'鈴木太郎'); $worksheet1 -> write(1,1,'32'); $worksheet1 -> write(1,2,'北海道'); $worksheet1 -> write(2,0,'青山辰夫'); $worksheet1 -> write(2,1,'24'); $worksheet1 -> write(2,2,'青森'); //Excelシートの送信 $workbook -> close(); ?> この場合、Excelは指定した名前で生成されるのでしょうか、 それとも、あらかじめ作成したExcelへ書き込みするのでしょうか?

    • ベストアンサー
    • PHP
  • PHPからExcel出力について

    現在、プログラム(PHP)でデータ出力の機能を作成しているのですが、Excel出力で (1)ブックが開く (2)データを表示 (3)保存 以上の一連の動作はできるのですが、ブックを開いた際にExcel上に「ファイルへのダメージが深刻であり修復は不可能です。数式と値の回復を試みましたが、消失または破損したデータが含まれる可能性があります」といったエラーが表示されてしまいます。 コード変換もしているし、spreadsheet_excel_writerのパッチも当てましたが改善されません。 まだプログラミングが不慣れなもので、解決策が見当たらずに困っています。 どなたかご教授頂けますと助かります。よろしくお願いいたします。 ※申し訳ありません、データを添付していませんでしたので再投稿させていただきました。 ============================================================== //-----------ココから上はデータを取得する関数でデータを取得しています----------- $workbook = new Spreadsheet_Excel_Writer(); $workbook->setVersion(8); $workbook->setVersion(0x0500); $tablename = "sampletable"; $worksheet =& $workbook->addWorksheet($tablename); $worksheet->setInputEncoding("sjis"); $format =& $workbook->addFormat(); $format->_font_name = mb_convert_encoding("MS UI Gothic", "shift_jis"); $format->setBold(); $format->setFgColor(31); //Excelでいうところの見出し部分 $worksheet->write(0,0,"○○"); $worksheet->write(0,1,"○○"); $worksheet->write(0,2,"○○"); $worksheet->write(0,3,"○○"); $worksheet->write(0,4,"○○"); $worksheet->write(0,5,"○○"); $worksheet->write(0,6,"○○"); $worksheet->write(0,7,"○○"); $worksheet->write(0,8,"○○"); //-------ココから下はforeachでデータを表示($worksheet->write)させています-------

    • ベストアンサー
    • PHP
  • 保存してもワークブック&シートが消えています(Excel)

    プログラミング初心者です。今DelphiでExcelを操作するプログラムを作成しており、Serversコンポーネントを使わずにOLEオブジェクトを使って操作しています。DelPhi側でExcelを起動させて、既存のファイルにDelPhiで取り出したSQLのデータをExcelに表示させるというものですが、データを上書き保存してもExcelのブックが消えていているようで、保存したxlsを起動させてもブック及びシートが表示されません。但し印刷プレビューには保存していたデータがプレビューされます。 原因が分からないので、申し訳ありませんがよろしくお願いします。 書いたプログラム↓ (uses節にComObj,Excel2000があります。) Var Excel,WorkBook,WorkSheet: Variant; ... ... Excel := CreateOleObject('Excel Application'); WorkBook := Excel.WorkBooks.Open(FileName := 'C:\@@@.xls',ReadOnly := False); WorkSheet := WorkBook.Wordsheets[1]; WorkSheet.Name := '@@@'; ... ...(以下Record取得の表記など) Excel.Visible := True; (Recordを取得し、値をCellにセットしてからVisibleをTrueにしています。) ... 大変読みにくくて申し訳ありませんがよろしくお願いします。環境はDelphi7,Excel2000,SQLServer2000です。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • 【VBA】 Copyメソッドの使用方法について

    【動作環境】 Excel 2003 【仕様概要】 EXCEL起動時に共有フォルダ内のEXCELシートよりマスタ情報を取得し、クライアント側のマスタ情報を最新情報に更新させたい。 【質問内容】 下記コードを実行すると12行目のCopyメソッドを発行時に下記メッセージが表示されてしまいます。 初歩的なコーディング誤りと思われますが、ご教授お願い申し上げます。 [実行時エラー'1004' 'Copyメソッドは失敗しました: '_Worksheet'オブジェクト] ========================================================================= 01: Sub auto_open() 02: Dim xlApp As Excel.Application '/* EXCELオブジェクト変数宣言 - Application */ 03: Dim xlBook As Excel.Workbook '/* EXCELオブジェクト変数宣言 - Workbook */ 04: Dim xlSheet As Excel.Worksheet '/* EXCELオブジェクト変数宣言 - Worksheet */ 05: 06: ' /* EXCELファイルオープン */ 07: Set xlApp = CreateObject("Excel.Application") 08: Set xlBook = xlApp.Workbooks.Open("共有ドライブ\マスタ情報.xls") 09: Set xlSheet = xlBook.Worksheets("マスタ情報") 10: 11: ' /* マスタ情報取得(ワークシートコピー) */ 12: xlSheet.Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) 13: 14: ' /* EXCELアプリケーション終了 */ 15: xlBook.Close 16: xlApp.Quit 17: 18: ' /* EXCELオブジェクト変数解放 */ 19: Set xlSheet = Nothing 20: Set xlBook = Nothing 21: Set xlApp = Nothing 22: End Sub =========================================================================

  • Excel2011のVBAについて教えてください。

    初めて質問します。 Excel2011forMACでVBAを使いBOOKを指定してクローズさせたいのですが、 エラー1004が起こりファイルを閉じることができません。 作成したVBAは以前にWindowsXP、Excel2000で作成したものを修正したものだったためなのではないかと思い、 改めてExcel2011forMACで下記ように、コマンドボタンをクリックすると"test.xlsx"を閉じるだけのテストを行いましたが同じエラーが発生します。 Private Sub CommandButton1_Click() Windows("test.xlsx").Close  End Sub 実行すると『実行時エラー'1004' _ オブジェクト'Close'のメソッド'Window'が失敗しました。』となります。 ちなみに、WindowsをWorkbooksにしても同様のエラーが発生しました。 Workbooksではファイルを指定しなければエラーは発生しないのですが、できれば1つのファイルを開いた状態にしておきたいと思っています。 このエラーの解消方法を教えていただけませんか。 それとも、MACでは個別にファイルを閉じることはできないのでしょうか。 Excel2011を使っているMAC OS Xのバージョンは10.6.7です。 VBAについては、初心者レベルで常にヘルプとマクロの記録を頼りになんとか作成しています。さらに、MACでVBAを使ったのが初めてで、この事象が一般的に知られていることなのかわかりません。いろいろ調べて同じような事例が見つけられなかったので質問させていただきます。 よろしくお願いします。

  • EXCEL2003でチェックボックスを大量に

    EXCEL2003のマクロで、 1シート内に、大量のチェックボックスを 作成したいのですが、途中で止まります。 エラーメッセージは、 ”オートメーションエラーです。要素が見つかりません” です。 マクロの内容は、データベースを読み 1レコードずつ、シートの1行に転記した後 横に、チェックボックスを、7個作ります。 500レコードぐらいあるのですが 170レコード目の6個目を作成するところで 先ほどの エラーになります。 一度、その現象になると Worksheet(対象シート名).~~ の、プロパティみたり、メソッド実行したりしようとすると ”オートメーションエラーです。要素が見つかりません” になります。 シート名を認識できなくなっているのでしょうか。 チェックボックスを、2,000行分(14,000個)作りたいのですが 無理でしょうか? ちなみに、Excel2010 ですが http://support.microsoft.com/kb/980528/ja で、レジストリを変更することを 書かれていましたが やってみてもダメでした。 オブジェクト数に限界があるのでしょうか? どんな小さなヒントでもかまいません。 なにとぞよろしくお願いします。

専門家に質問してみよう