2016-01-13 88 views
0

在下面的excel 2010 vba中打開所有的文本文件,並由loop讀取,然後在同一張紙上創建call to a module。但是我得到一個Argument not optional' error on that line (調用CreateXLSXFiles`)。我需要一些專家的幫助來解決這個問題,因爲我無法弄清楚。謝謝:)excel 2010 vba錯誤調用模塊

VBA

'CREATE REPORT ' 
MsgBox ("Please click ok to generate analysis reports, vbOKOnly") 

Dim myDir As String, fn As String 
myDir = "C:\Users\cmccabe\Desktop\EmArray\" 
fn = Dir(myDir & "*.txt") 
Do While fn <> "" 
    CreateXLSXFiles myDir & fn 
    fn = Dir 
Loop 

Call CreateXLSXFiles 

模塊

Sub CreateXLSXFiles(fn As String) 
' PARSE TEXT FILE AND CREATE XLSX REPORT ' 
Dim txt As String, m As Object, n As Long, fp As String 
Dim i As Long, x, temp, ub As Long, myList 

myList = Array("Display Name", "Medical Record", "Date of Birth", _ 
       "Order Date", "Gender", "Barcode", "Sample", "Build", _ 
       "SpikeIn", "Location", "Control Gender", "Quality") 

fp = "C:\Users\cmccabe\Desktop\EmArray\" 

With Worksheets(1) 
    .Cells.Clear 
    .Name = CreateObject("Scripting.FileSystemObject").GetBaseName(fn) 
On Error Resume Next 
n = FileLen(fn) 
If Err Then 
    MsgBox "Something wrong with " & fn 
    Exit Sub 
End If 
On Error GoTo 0 
n = 0 
txt = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll 
With CreateObject("VBScript.RegExp") 
    .Global = True: .MultiLine = True 
    For i = 0 To UBound(myList) 
     .Pattern = "^#(" & myList(i) & " = (.*))" 
     If .Test(txt) Then 
      n = n + 1 
      Sheets(1).Cells(n, 1).Resize(, 2).Value = _ 
      Array(.Execute(txt)(0).submatches(0), .Execute(txt)(0).submatches(1)) 
     End If 
    Next 
    .Pattern = "^[^#\r\n](.*[\r\n]+.+)+" 
    x = Split(.Execute(txt)(0), vbCrLf) 
    .Pattern = "(\t| {2,})" 
    temp = Split(.Replace(x(0), Chr(2)), Chr(2)) 
    n = n + 1 
    For i = 0 To UBound(temp) 
     Sheets(1).Cells(n, i + 1).Value = temp(i) 
    Next 
    ub = UBound(temp) 
    .Pattern = "((\t| {2,})| (?=(\d|"")))" 
    For i = 1 To UBound(x) 
     temp = Split(.Replace(x(i), Chr(2)), Chr(2)) 
     n = n + 1 
     Sheets(1).Cells(n, 1).Resize(, ub).Value = temp 
    Next 
End With 
.Copy 
    Application.DisplayAlerts = False 
    With ActiveSheet 
     .Columns.AutoFit 
     .Range("B1:B12").ClearContents 
    End With 
    ActiveWorkbook.SaveAs Filename:=fp & .Name, _ 
          FileFormat:=xlOpenXMLWorkbook 
    ActiveWorkbook.Close False 
End Sub 
+1

'CreateXLSXFiles'需要一個字符串參數,但'呼叫CreateXLSXFiles'不會傳遞任何參數。你期望發生什麼? –

回答

0

CreateXLSXFiles需要String作爲輸入的方法:

Sub CreateXLSXFiles(fn As String) 

然而,喲你就像調用它不經過任何字符串:

Call CreateXLSXFiles 

爲了使其工作,你需要通過必要的fn(我猜它的意思是「文件名」):

Call CreateXLSXFiles(fn) 

或與最新的語法,簡單地說:

CreateXLSXFiles fn 
+0

這可能是OP的意圖 - 但在這種情況下,它應該被移到循環體中。另一方面 - 它已經*在循環體中,所以它真的不清楚在這裏有什麼,如果有的話。 –

+0

@JohnColeman啊對,沒注意到。那麼現在我正確地看到了代碼,我不明白OP的含義。讓我們等待一些澄清。 –

+0

我很抱歉,仍在學習'vba'。 'loop'確保使用目錄中的所有文本文件。然後打電話。因此,取代'Loop 調用CreateXLSXFiles(調用在循環外)'它應該是'調用CreatXLSXFiles(fn)循環(循環內調用)'?目的是將所有的文本文件傳遞給模塊。謝謝 :)。 – Chris