2017-03-13 14 views
1

CSVファイルから開いたワークシートのデータを、既存のExcelテンプレートの新しいワークシートとしてコピーしようとしています。私は、既存の空のワークシートへのコピーと、コピー元のワークシートをターゲットブックの新しいシートとしてコピーしようとしました。これらのメソッドはすべて、さまざまなエラーを投げかけています。実際にコードを完成させる唯一の方法は、copy-paste-specialコマンドでした。しかし、その結果、細胞は値とは対照的にバイナリで満たされ、多くの細胞は灰色の外観で満たされました。以下はワークシートをvba内の既存のブックにコピーしようとしています

私が働いて取得しようとしているコードです:

'================================================= 
'Add Data 
'================================================= 
Dim AppExcell As Object 
Dim wb As Object 
Dim xFile As String 
Dim main As Workbook 

Set AppExcel = CreateObject("Excel.Application") 
AppExcel.Visible = False 

Set wb = AppExcel.Workbooks.Add("C:\Fridge_Automation\Lab Report.xltm") 
Set main = ActiveWorkbook 

xFile = Application.GetOpenFilename("All CSV Files (*.csv),*.csv", , "Select CSV File") 

Set src = Workbooks.Open(xFile) 

src.Worksheets(1).Copy Before:=wb.Worksheets("11Mic Avg - Raw Data") 
wb.Worksheets(2).Name = "Raw Data" 
src.Close 

私はワークシートに追加したボタンをクリックしてExcel 2013でこのコードを実行しています。

+0

**このコードは** Excel **から実行していますか? –

+0

Excelシートにこのコードを実行するボタンがあります。 – charwayne

+0

'GetOpenFilename'関数のコードはありますか? –

答えて

1

以下のコードはワークブック内から実行してくれました。 ***私は変更されたものをフラグします。

Option Explicit    ' *** Always use this in every module 
Option Base 0 

Public Sub GrabSheet() 

    'Dim AppExcel As Object ' *** don't need this 
    'Dim wb As Object  ' *** 
    Dim dest As Workbook ' *** Instead of "wb" 
    Dim xFile As String 
    'Dim main As Workbook ' *** 

    'Set AppExcel = CreateObject("Excel.Application") ' *** 
    'AppExcel.Visible = False ' *** 
    'Application.Visible = False ' *** Uncomment if you really want to... 

    Set dest = ActiveWorkbook ' *** for testing - use Workbooks.Add("C:\Fridge_Automation\Lab Report.xltm") for your real code 
    'Set main = ActiveWorkbook ' *** don't need this 

    xFile = Application.GetOpenFilename("All CSV Files (*.csv),*.csv", , "Select CSV File") 

    Dim src As Workbook  ' *** Need to declare this because of "Option Explicit" 
    Set src = Workbooks.Open(xFile) 

    ' Per https://stackoverflow.com/q/7692274/2877364 , it is surprisingly 
    ' difficult to get the new sheet after you copy. 
    ' Make a unique name to refer to the sheet by. 
    Dim sheetname As String       ' *** 
    sheetname = "S" & Format(Now, "yyyymmddhhmmss") ' *** 
    src.Worksheets(1).Name = sheetname    ' *** 

    src.Worksheets(1).Copy Before:=dest.Worksheets("11Mic Avg - Raw Data") ' *** changed wb to dest 
    'dest.Worksheets(2).Name = "Raw Data"   ' *** don't assume an index... 
    dest.Worksheets(sheetname).Name = "Raw Data" ' *** ... but use the name. 
     ' *** NOTE: this fails if a "Raw Data" sheet already exists. 
    src.Close SaveChanges:=False ' *** Suppress the "save changes" prompt you otherwise get because of the `src...Name` assignment 

End Sub 

ため、私はthis questionに記載されている問題の新しいシートを見つけるために、カスタムシート名を使用。

Excel内から実行しているときにオブジェクトを作成する必要はありません。代わりに、Applicationを直接参照することができます。

+0

私の関数の先頭に' Option Explicit'を追加すると、コードにディバイダが追加されます。この場合でも、関数の先頭または関数コードの後ろに置くのが最良ですか? – charwayne

+1

Option Explicitは、ファイル内の 'Sub'より前のファイルの一番上にあります。すべての変数に 'Dim'文を使用する必要があります。これは、多くの一般的なエラーを吐き出すのに役立ちます。 – cxw

関連する問題