質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

7444閲覧

【VBS】Excelセルコピーが画像(?)になってしまう

irohamaru

総合スコア15

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2018/06/26 05:07

編集2018/06/26 05:28

以下のVBScriptで、「コピー元のExcelファイルの指定セルの文字列を、コピー先のExcelファイルにペーストする」という処理を実現しようと思っています。

<フォルダ構成>
イメージ説明

コピー元フォルダの中にコピー対象のExcelファイルを配置
イメージ説明

テンプレートフォルダの中にペーストするExcelファイルを配置。
コピー元フォルダに配置されたExcelファイルの数の分複製される。
イメージ説明

実行したところ、以下のようにコピーしたセルが画像のような形でペーストされており、意図した結果でないため困っています。

イメージ説明

コピーの仕方が悪いのか、ペーストの仕方が悪いのか、
どなたか原因が分かる方がいらっしゃったらご教示願います。

vbs:testDataCopy.vbs

1Option Explicit 2 3' ====================================================================================== 4' 変数定義 5' 6' ====================================================================================== 7 8Dim objFSO ' FileSystemObject 9Dim baseFolder ' 作業フォルダパス 10Dim copyFolder ' コピー元フォルダパス 11Dim pasteFolder ' コピー先フォルダパス 12Dim copySheetName ' コピー元シート名 13Dim copyRange ' コピー元セル範囲 14 15Dim pasteSheetName ' コピー先シート名 16 17Dim templateFileName ' テンプレートファイル名 18Dim templateFolder ' テンプレートファイルが配置されたフォルダパス 19 20' ====================================================================================== 21' パラメータ設定(環境に合わせて定義すること) 22' 23' ====================================================================================== 24 25copySheetName = "フォーマット" ' コピー元シート名 26copyRange = "[B6:E6],[B9:D10],[G7:AJ106]" ' コピー元セル範囲(複数の範囲指定⇒(例)"[A1:A2],[B1,B2]") 27 28pasteSheetName = "フォーマット" ' コピー先シート名 29 30templateFileName = "template.xlsx" 31 32 33' ====================================================================================== 34' EXCELコピー&ペースト 35' 36' ====================================================================================== 37' フォルダパス設定 38Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 39If Err.Number = 0 Then 40 Dim currentDir 41 currentDir = objFSO.getParentFolderName(WScript.ScriptFullName) 42 copyFolder = currentDir & "\" & "コピー元" 43 pasteFolder = currentDir & "\" & "コピー先" 44 templateFolder = currentDir & "\" & "テンプレート" 45Else 46 WScript.Echo "エラーが発生したため終了します。" 47 WScript.Quit 48End If 49 50' コピー元セル範囲をリスト化 51Dim RangeList 52RangeList = Split(copyRange, ",") 53 54'エラー情報をクリアする。 55Err.Clear 56 57 58' フォルダ内(サブフォルダも含む)でループしてコピー元ファイルを取得 59ShowSubfolders objFSO.GetFolder(copyFolder) 60 61Dim File 62Sub ShowSubFolders(Folder) 63 For Each File in Folder.Files 'フォルダ内のファイルを列挙する 64 'EXCELファイルか判定 65 Dim ext 66 ext = objFSO.GetExtensionName(File.Name) 67 68 If ext = "xlsx" Or ext = "xlsm" Then 69 ' 変数定義 70 Dim copyFilePath, pasteFilePath, templateFilePath, copyExcelObj, pasteExcelObj 71 Dim copyFileObj, pasteFileObj, copySheetObj, pasteSheetObj 72 73 templateFilePath = templateFolder & "\" & templateFileName 74 copyFilePath = copyFolder & "\" & File.Name 75 pasteFilePath = pasteFolder & "\" & File.Name 76 77 ' コピー元と同じファイル名でコピー先ファイルを生成 78 objFSO.CopyFile templateFilePath, pasteFilePath, True 79 80 ' コピーエラー発生時は終了する 81 If Err.Number <> 0 Then 82 Set File = Nothing 83 Set objFSO = Nothing 84 85 WScript.Echo "テンプレートコピーでエラーが発生したため終了します。" 86 WScript.Quit 87 End If 88 89 ' コピー元ファイルを開く 90 Set copyExcelObj = WScript.CreateObject("Excel.Application") 91 Set copyFileObj = copyExcelObj.Workbooks.Open(copyFilePath) 92 Set copySheetObj = copyFileObj.Worksheets(copySheetName) 93 94 95 ' コピー先ファイルを開く 96 Set pasteExcelObj = WScript.CreateObject("Excel.Application") 97 Set pasteFileObj = pasteExcelObj.Workbooks.Open(pasteFilePath) 98 Set pasteSheetObj = pasteFileObj.Worksheets(pasteSheetName) 99 100 pasteSheetObj.Activate 101 102 ' コピー対象セル範囲を取得(リストで保持) 103 Dim RangeVal 104 For Each RangeVal in RangeList 105 RangeVal = Replace(Replace(RangeVal, "[", ""), "]", "") 106 107 copySheetObj.Range(RangeVal).Copy 108 109 ' コピー先ファイルにペースト 110 'pasteSheetObj.Range("A1").Select 111 ' -4104 112 pasteSheetObj.Range(RangeVal).PasteSpecial(-4104) 113 114 Next 115 116 pasteFileObj.Save 117 pasteFileObj.Close 118 119 copyExcelObj.Quit 120 pasteExcelObj.Quit 121 122 Else 123 WScript.Echo "テンプレートコピーに失敗しました。" 124 WScript.Quit 125 End If 126 Next 127 128 Dim Subfolder 129 For Each Subfolder in Folder.SubFolders 'フォルダ内のフォルダを列挙する 130 ShowSubFolders Subfolder '再帰呼び出し 131 Next 132End Sub 133 134WScript.Echo "テストデータコピーが完了しました。" 135WScript.Quit 136 137Set copyExcelObj = Nothing 138Set copyFileObj = Nothing 139Set copySheetObj = Nothing 140 141Set pasteExcelObj = Nothing 142Set pasteFileObj = Nothing 143Set pasteSheetObj = Nothing 144 145Set File = Nothing 146Set objFSO = Nothing 147 148Set Subfolder = Nothing 149

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

色々調べてみましたけど原因不明です。
値のみのコピーで良いならPasteSpecial(-4163)とすることで可能です。
ただし、以下の警告が出てしまいます。

貼り付けようとしているデータと選択した領域のサイズと異なります。貼り付けますか?

こちらも理由はわかりませんでした。
G7:AJ106のときのみ出るので、範囲が広いと出るのかもしれません。
こちらの仮対処としては、貼り付け時の範囲を左上のみを指定することで回避できました。

VBA

1rs = Split(RangeVal, ":") 2pasteSheetObj.Range(rs(0)).PasteSpecial(-4163)

投稿2018/06/26 08:23

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

irohamaru

2018/06/26 08:31

わざわざ調べてくださり、ありがとうございます! 根本的な原因は気になりますが、とりあえず回避策が見つかっただけでも感謝です。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問