2013-12-11 48 views
2

更新的代碼:(宏不運行)VB腳本如果聲明 - 打開Excel工作簿

Dim objExcel, objWorkbook, xlModule, strCode 

If ReportFileStatus("C:\scripts\test1.xls") = "True" Then 
    OpenFile "C:\scripts\test1.xls", "C:\scripts\test.xls" 
End If 

If ReportFileStatus("C:\scripts\test2.xls") = "True" Then 
    OpenFile "C:\scripts\test2.xls", "C:\scripts\test1.xls" 
End If 

On Error Resume Next 
Set xlModule = Nothing 
Set objWorkbook = Nothing 
objExcel.Quit 
Set objExcel = Nothing 
On Error GoTo 0 

'~~> Sub to open the file 
Sub OpenFile(sFile, DestFile) 
    Set objExcel = CreateObject("Excel.Application") 

    objExcel.Visible = True 
    objExcel.DisplayAlerts = False 

    Set objWorkbook = objExcel.Workbooks.Open(sFile) 
    Set xlModule = objWorkbook.VBProject.VBComponents.Add(1) 

    strCode = _ 
     "Sub CreateFile()" & vbCr & _ 
     " Columns(""A:A"").Select" & vbCr & _ 
     " Selection.Delete Shift:=xlToLeft" & vbCr & _ 
     " Rows(""1:8"").Select" & vbCr & _ 
     " Selection.Delete Shift:=xlUp" & vbCr & _ 
     " Columns(""E:E"").Select" & vbCr & _ 
     " Selection.ClearContents" & vbCr & _ 
"FName = ActiveWorkbook.Name" & vbCr & _ 
"If Right(FName, 4) = "".xls"" Then" & vbCr & _ 
"FName = Mid(FName, 1, Len(FName) - 4)" & vbCr & _ 
"End If" & vbCr & _ 
"Columns(1).Insert Shift:=xlToRight" & vbCr & _ 
"For i = 1 To Range(""B65000"").End(xlUp).Row" & vbCr & _ 
"TempString = """ & vbCr & _ 
"For j = 2 To Range(""HA1"").End(xlToLeft).Column" & vbCr & _ 
"If j <> Range(""HA1"").End(xlToLeft).Column Then" & vbCr & _ 
"TempString = TempString & _" & vbCr & _ 
"Cells(i, j).Value & ""^""" & vbCr & _ 
"Else" & vbCr & _ 
"TempString = TempString & _" & vbCr & _ 
"Cells(i, j).Value" & vbCr & _ 
"End If" & vbCr & _ 
"Next" & vbCr & _ 
"Cells(i, 1).Value = TempString" & vbCr & _ 
"Next" & vbCr & _ 
"Columns(1).Select" & vbCr & _ 
"Selection.Copy" & vbCr & _ 
"Workbooks.Add" & vbCr & _ 
"Range(""A1"").Select" & vbCr & _ 
"ActiveSheet.Paste" & vbCr & _ 
"Application.CutCopyMode = False" & vbCr & _ 
     " ChDir ""C:\RES_BILLING\Export""" & vbCr & _ 
     " ActiveWorkbook.SaveAs Filename:=FName & "".txt"", FileFormat:=xlTextPrinter, Local:=True, CreateBackup:=False" & vbCr & _ 
     " Application.WindowState = xlMinimized" & vbCr & _ 
     " Application.WindowState = xlNormal" & vbCr & _ 
     " Application.DisplayAlerts = False" & vbCr & _ 
"End Sub" 

    xlModule.CodeModule.AddFromString strCode 


    objWorkbook.Close (False) 
End Sub 

'~~> Function to check if file exists 
Function ReportFileStatus(filespec) 
    Dim fso, msg 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    If (fso.FileExists(filespec)) Then 
     msg = "True" 
    Else 
     msg = "False" 
    End If 

    ReportFileStatus = msg 
End Function 

原題:

我的目標是有一個VB腳本運行宏在多個Excel電子表格。

這很好,但我有一個問題。

有時工作表可能無法在給定月份使用,這是故意的。

我想創建一個IF語句,說如果excel文件不可用跳到下一個文件。

所以在這種情況下,如果test1.xls不可用,請將一個移動到下一個文件。我希望這是有道理的。感謝任何能引導我朝着正確方向發展的人。編程不是我的特長。

+0

如果文件在打開之前存在或不爲什麼不查? –

+0

另外,爲什麼不創建一個程序來打開文件,而不是重複它? –

+0

@ L42:'Vbscript'中沒有'DIR'功能:) –

回答

4

繼我的意見,爲什麼不檢查文件打開之前存不存在?另外爲什麼不創建一個程序來打開文件而不是重複它?

試一下這個(久經考驗

Dim objExcel, objWorkbook, xlModule, strCode 

If ReportFileStatus("C:\scripts\test1.xls") = "True" Then 
    OpenFile "C:\scripts\test1.xls", "C:\scripts\test.xls" 
End If 

If ReportFileStatus("C:\scripts\test2.xls") = "True" Then 
    OpenFile "C:\scripts\test2.xls", "C:\scripts\test1.xls" 
End If 

On Error Resume Next 
Set xlModule = Nothing 
Set objWorkbook = Nothing 
objExcel.Quit 
Set objExcel = Nothing 
On Error GoTo 0 

'~~> Sub to open the file 
Sub OpenFile(sFile, DestFile) 
    Set objExcel = CreateObject("Excel.Application") 

    objExcel.Visible = True 
    objExcel.DisplayAlerts = False 

    Set objWorkbook = objExcel.Workbooks.Open(sFile) 
    Set xlModule = objWorkbook.VBProject.VBComponents.Add(1) 

    strCode = _ 
     "sub test()" & vbCr & _ 
     " msgbox ""Inside the macro"" " & vbCr & _ 
     "end sub" 

    xlModule.CodeModule.AddFromString strCode 

    objWorkbook.SaveAs DestFile 

    objExcel.Run "Test" 

    objWorkbook.Close (False) '<~~ Change false to true in case you want to save changes 
End Sub 

'~~> Function to check if file exists 
Function ReportFileStatus(filespec) 
    Dim fso, msg 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    If (fso.FileExists(filespec)) Then 
     msg = "True" 
    Else 
     msg = "False" 
    End If 

    ReportFileStatus = msg 
End Function 
+0

Siddharth Rout,謝謝你的迴應。要回答您的問題,我正在爲我的結算部門中的某個人創建此腳本。他們將無法更改腳本,因此如果他們有全部6個報告或只有3個,那麼它需要工作。我沒有創建一個打開文件的過程,因爲我根本不知道如何操作。我試過你上面的代碼,並收到一個錯誤對象onobjExcel.Quit謝謝你的幫助。 – jrd

+0

我已經更新了代碼。現在就試試。 –

+0

它現在打開和關閉文件沒有錯誤,但它沒有運行宏。 – jrd

2

久經考驗

Dim objExcel 

Set objExcel = CreateObject("Excel.Application") 

objExcel.Visible = True 
objExcel.DisplayAlerts = False 

InsertCode "C:\scripts\test1.xls", "C:\scripts\test1_upd.xls" 
InsertCode "C:\scripts\test2.xls", "C:\scripts\test2_upd.xls" 

objExcel.Quit 

Sub InsertCode(wbPath, newPath) 
    Dim objWorkbook, xlmodule, strCode 

    On Error Resume Next 
    Set objWorkbook = objExcel.Workbooks.Open(wbPath) 
    On Error GoTo 0 

    If Not objWorkbook Is Nothing Then 
     Set xlmodule = objWorkbook.VBProject.VBComponents.Add(1) 
     strCode = _ 
      "sub test()" & vbCr & _ 
      " msgbox ""Inside the macro"" " & vbCr & _ 
      "end sub" 
     xlmodule.CodeModule.AddFromString strCode 
     objWorkbook.SaveAs newPath 
     objWorkbook.Close 
    End If 
End Sub 
+0

打我吧:) –

+0

@SiddharthRout - 你的更完整(你測試過!) –

+0

但是我喜歡你使用OERN的方式!節省了很多代碼:) –

相關問題