调用带参数的函数的问题(需要将文件名从一个函数传递到另一个函数)Excel VBA

时间:2014-11-28 12:14:36

标签: excel-vba vba excel

我正在尝试整合2个功能。

我有一个子函数可以逐个遍历所有文件。

一旦识别出文件名。

它应该在打开的文件上调用要运行的函数。

我似乎找不到传递此方法的方法,

我做了一些关于使用参数调用函数的阅读,但是当我尝试这个时,我得到一个"编译错误的单独列表或者)"

你能指出我正确的方向吗?

我已经发布了以下代码:



Option Explicit
 Option Base 1

 Public Const DATASHEET As String = "MDFDATA"
 Public Const TABLECONVERSIONSHEET As String = "TABLECONVERSION"
 Public Const OPTIONSSHEET As String = "OPTIONS"
 Public Const FinalSheet As String = "Final Sheet"
 Public lByte_Order As Long 'byte order
 Public lData_Groups As Long 'number of data groups
 Public lChannel_Groups As Long 'number of channel groups
 Public lChannels As Long 'number of channels
 Public lTable_offset As Long 'row offset for the conversion table sheet
 Sub OpenFiles()
 Dim MyFolder As String
 Dim MyFile As String
 Dim sFile_Name As String 'MDF file name
 Dim lFile_Number As Long 'file number
 MyFolder = "C:\Users\Documents\Test"
 sFile_Name = Dir(MyFolder & "\*.dat")
 Do While sFile_Name <> ""
 lFile_Number = FreeFile
 Open sFile_Name For Binary Access Read Shared As lFile_Number
 Call PARSE_MDF


 Loop
 End Sub
 '==================================================================================================
 ' PARSE_MDF
 ' Main function
 ' Returns True if successful
 '==================================================================================================
 Function PARSE_MDF() As Boolean
 Dim sFile_Name As String 'MDF file name
 Dim lFile_Number As Long 'file number

 Dim lData_Groups_Counter As Long 'data groups counter
 Dim lChannel_Groups_Counter As Long 'channel groups counter
 Dim lChannels_Counter As Long 'channels counter
 Dim lRecords As Long 'number of records in data block
 Dim lRecord_Length As Long 'length of record in data block

 Dim lData_Group_Address As Long 'data group address
 Dim lData_Address As Long 'data address
 Dim lChannel_Group_Address As Long 'Channel group address
 Dim lChannel_Address As Long 'Channel address

 Dim byCol As Byte 'column counter for output
 Dim wsData_Sheet As Worksheet 'main worksheet
 Dim wsTable_Conversion_Sheet As Worksheet

 Dim rFirst_Signal As Range 'first signal in channel group
 Dim rLast_Signal As Range 'last signal in channel group
 Dim rSignals As Range 'range of signal names for a channel group
 Application.EnableEvents = False

 lTable_offset = 0
 Set wsTable_Conversion_Sheet = Workbooks(ActiveWorkbook.Name).Worksheets(TABLECONVERSIONSHEET)
 Set wsData_Sheet = Workbooks(ActiveWorkbook.Name).Worksheets(DATASHEET)


 'file selected
 If sFile_Name <> "False" Then
 'clear old data
 wsData_Sheet.Columns.Clear
 wsTable_Conversion_Sheet.Columns.ClearContents

 'set headers
 wsData_Sheet.Cells(1, 1).Value = "Signal name"
 wsData_Sheet.Cells(2, 1).Value = "Data type"
 wsData_Sheet.Cells(3, 1).Value = "Lsb"
 wsData_Sheet.Cells(4, 1).Value = "Offset"
 wsData_Sheet.Cells(5, 1).Value = "Bit length"
 wsData_Sheet.Cells(6, 1).Value = "Formula ID"
 wsData_Sheet.Cells(7, 1).Value = "Formula"
 wsData_Sheet.Cells(8, 1).Value = "First Bit position"
 wsData_Sheet.Cells(9, 1).Value = "Table length"
 wsData_Sheet.Cells(10, 1).Value = "Start Row"

 'offset columns because of headers
 byCol = 2

 'get file number
 lFile_Number = FreeFile

 'open file

 'check file integrity
 If IDBLOCK(lFile_Number) Then

 'check data exists
 If HDBLOCK(lFile_Number, lData_Group_Address) Then
 'main iteration for data groups
 For lData_Groups_Counter = 1 To lData_Groups

 'check channel group exists
 If DGBLOCK(lFile_Number, lData_Group_Address, lChannel_Group_Address, lData_Address) Then
 'channel group iteration
 For lChannel_Groups_Counter = 1 To lChannel_Groups

 'get channel group data
 Call CGBLOCK(lFile_Number, lChannel_Group_Address, lChannel_Address, lRecord_Length, lRecords)
 'set the first signal range in this channel group
 Set rFirst_Signal = wsData_Sheet.Cells(1, byCol)

 'channels iteration
 For lChannels_Counter = 1 To lChannels

 'get channel data for each channel
 Call CNBLOCK(lFile_Number, lChannel_Address, wsData_Sheet, byCol)

 'excel fudge
 If byCol <> 255 Then
 byCol = byCol + 1
 End If

 Next 'lChannels_Counter

 'set the last signal range in this channel group
 Set rLast_Signal = wsData_Sheet.Cells(1, byCol - 1)

 'format divider columns
 wsData_Sheet.Columns(byCol).ColumnWidth = 5
 wsData_Sheet.Columns(byCol).Interior.ColorIndex = 0
 wsData_Sheet.Columns(byCol).Interior.Pattern = xlLightUp
 wsData_Sheet.Columns(byCol).Interior.PatternColorIndex = xlAutomatic

 'excel fudge
 If byCol <> 255 Then
 'for space between channels
 byCol = byCol + 1
 End If

 Next 'lChannel_Groups_Counter
 'get range of signals to get data for
 Set rSignals = wsData_Sheet.Range(rFirst_Signal, rLast_Signal)
 'get signal data

 'no channel data in this data group
 Else
 PARSE_MDF = False

 End If

 Next 'lData_Groups_Counter

 'no data in MDF file
 Else
 PARSE_MDF = False

 End If
 'not a MDF file
 Else
 PARSE_MDF = False

 End If

 'close file
 Close #lFile_Number

 'tidy up sheet
 wsData_Sheet.Rows.EntireRow.AutoFit
 wsData_Sheet.Columns.EntireColumn.AutoFit
 wsData_Sheet.Rows("2:15").EntireRow.Delete
 wsData_Sheet.Columns("A:A").EntireColumn.Delete
 wsData_Sheet.Cells.HorizontalAlignment = xlCenter

 'function ends normally
 PARSE_MDF = True

 'no file was selected
 Else
 PARSE_MDF = False

 End If
 Application.EnableEvents = True

 End Function 
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

您需要做的是将找到的文件名作为参数传递给函数。现在你的函数没有一个参数来传递它,所以首先为ex。

创建一个这样的参数
Function PARSE_MDF(ByVal myFilePath as String) As Boolean

然后你需要改变你的循环来正确地调用函数。

 Do While sFile_Name <> ""
      ....
      myboolenvaluetohodthereturnvalue = PARSE_MDF(sFile_Name)
      .... 'does your funtion need to return value and be tested?

      sFile_Name = Dir() 'Call dir again without parameter to skip to next found file 
 Loop

否则我没有检查你的代码,但这应该让你开始..