VBA,通过目录问题循环

时间:2015-08-04 18:57:50

标签: vba excel-vba excel

我有以下宏,它通过每个工作簿的目录进行计算 - 它在If wks.Name <> .Name Then给我一个错误,

我可以使用任何建议或任何其他代码将代码应用到我的目录中?

 Sub DirectoryExtractFilteredValues()

 'PURPOSE: To loop through all Excel files in a user specified folder and     perform a set task on them
'Loops trough all files in dir, error. Louisv4 in this.


Dim wb As Workbook
Dim myPath As String
Dim myFile As String
Dim myExtension As String
Dim FldrPicker As FileDialog

'Optimize Macro Speed
  Application.ScreenUpdating = False
 Application.EnableEvents = False
  Application.Calculation = xlCalculationManual

'Retrieve Target Folder Path From User
 Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker)

  With FldrPicker
  .Title = "Select A Target Folder"
  .AllowMultiSelect = False
    If .Show <> -1 Then GoTo NextCode
     myPath = .SelectedItems(1) & "\"
End With

  'In Case of Cancel
  NextCode:
 myPath = myPath
  If myPath = "" Then GoTo ResetSettings

    'Target File Extension (must include wildcard "*")
     myExtension = "*.xls"

    'Target Path with Ending Extention
   myFile = Dir(myPath & myExtension)

  'Loop through each Excel file in folder
   Do While myFile <> ""
'Set variable equal to opened workbook
  Set wb = Workbooks.Open(filename:=myPath & myFile)



     Dim wks As Excel.Worksheet
   Dim wksSummary As Excel.Worksheet
'----------------------------------------------------------------------------------
'edited so it shows in the 3rd column row +1.  Add the header and sheet name macro to this

On Error Resume Next
Set wksSummary = Excel.ActiveWorkbook.Worksheets("Unique data")
On Error GoTo 0

If wksSummary Is Nothing Then
    Set wksSummary = Excel.ActiveWorkbook.Worksheets.Add
    wksSummary.Name = "Unique data"
End If


'Iterate through all the worksheets, but skip [Summary] worksheet.
For Each wks In Excel.ActiveWorkbook.Worksheets

    With wksSummary

        If wks.Name <> .Name Then
            If Application.WorksheetFunction.CountA(wks.Range("C:C")) Then
                Dim r As Range

  ' Get the first cell of our destination range...
  Set r = .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 1, 3)

 ' Perform the unique copy...
 If WorksheetFunction.CountA(wks.Range("C:C")) > 1 Then
wks.Range("C:C").AdvancedFilter xlFilterCopy, , r, True
End If

' Remove the first cell at the destination range...
  r.Delete xlShiftUp
            End If
        End If

    End With

Next wks


'Headers
Range("A1").Value = "File Name "
Range("B1").Value = "Sheet Name "
Range("C1").Value = "Column Name"

 Dim intRow As Long: intRow = 2

For i = 1 To Sheets.Count
If Sheets(i).Name <> ActiveSheet.Name Then
    Cells(intRow, 2) = Sheets(i).Name
    Cells(intRow, 1) = ActiveWorkbook.Name
    intRow = intRow + 1
End If
Next i


'Save and Close Workbook
  wb.Close SaveChanges:=True

'Get next file name
  myFile = Dir
   Loop

'Message Box when tasks are completed
  MsgBox "Task Complete!"

ResetSettings:
'Reset Macro Optimization Settings
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

 End Sub

编辑:新代码。有人能帮忙吗?我在中间用这个新代码尝试了上面的目录代码,并尝试进行调整,无法使其工作。

    Sub looper()
 'a.t.v.5 + extra splitting of scen names(+,-,etc).
 'looping dir


Dim ws As Worksheet, wks As Worksheet, wksSummary As Worksheet
Dim y As Range, intRow As Long, i As Integer
Dim r As Range, lr As Long, myrg As Range
Dim boolWritten As Boolean, lngNextRow As Long
Dim intColNode As Integer, intColScenario As Integer
Dim intColNext As Integer

 ' Turn off screen updating and automatic calculation
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

 ' Create a new worksheet, if required
On Error Resume Next
Set wksSummary = ActiveWorkbook.Worksheets("Unique data")
On Error GoTo 0
If wksSummary Is Nothing Then
    Set wksSummary = ActiveWorkbook.Worksheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
    wksSummary.Name = "Unique data"
End If

 ' Set the initial output range, and assign column headers
With wksSummary
    Set y = .Cells(.Rows.Count, 3).End(xlUp).Offset(1, 0)
    Set r = y.Offset(0, 1)
    .Range("A1:D1").Value = Array("File Name", "Sheet Name", "Node Name", "Scenario Name")
End With

 ' Check each sheet in turn
For Each ws In ActiveWorkbook.Worksheets
    With ws
         ' Only action the sheet if it's not the 'Unique data' sheet
        If .Name <> wksSummary.Name Then
            boolWritten = False

             ' Find the Scenario column
            intColScenario = 0
            On Error Resume Next
            intColScenario = WorksheetFunction.Match("scenarioName", .Rows(1), 0)
            On Error GoTo 0

            If intColScenario > 0 Then
                 ' Only action if there is data in column E
                If Application.WorksheetFunction.CountA(.Columns(intColScenario)) > 1 Then
                     ' Find the next free column, in which the extract formula will be placed
                    intColNext = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1

                     ' Assign formulas to the next free column to identify the scenario name to the left of the first _ character
                    .Cells(1, intColNext).Value = "Test"
                    lr = .Cells(.Rows.Count, intColScenario).End(xlUp).Row
                    Set myrg = .Range(.Cells(2, intColNext), .Cells(lr, intColNext))
                    With myrg
                        .ClearContents
                        .FormulaR1C1 = "=IFERROR(LEFT(RC" & intColScenario & ",FIND(INDEX({""+"",""-"",""_"",""$"",""%""},1,MATCH(1,--(ISNUMBER(FIND({""+"",""-"",""_"",""$"",""%""},RC" & intColScenario & "))),0)), RC" & intColScenario & ")-1), RC" & intColScenario & ")"
                        .Value = .Value
                    End With

                     ' Copy unique values from the formula column to the 'Unique data' sheet, and write sheet & file details
                    .Range(.Cells(1, intColNext), .Cells(lr, intColNext)).AdvancedFilter xlFilterCopy, , r, True
                    r.Offset(0, -3).Value = ws.Name
                    r.Offset(0, -2).Value = ws.Parent.Name

                     ' Clear the interim results
                    .Range(.Cells(1, intColNext), .Cells(lr, intColNext)).ClearContents

                     ' Delete the column header copied to the list
                    r.Delete Shift:=xlUp
                    boolWritten = True
                End If
            End If

             ' Find the Node column
            intColNode = 0
            On Error Resume Next
            intColNode = WorksheetFunction.Match("node", .Rows(1), 0)
            On Error GoTo 0

            If intColNode > 0 Then
                 ' Only action if there is data in column A
                If Application.WorksheetFunction.CountA(.Columns(intColNode)) > 1 Then
                    lr = .Cells(.Rows.Count, intColNode).End(xlUp).Row

                     ' Copy unique values from column A to the 'Unique data' sheet, and write sheet & file details (if not already written)
                    .Range(.Cells(1, intColNode), .Cells(lr, intColNode)).AdvancedFilter xlFilterCopy, , y, True
                    If Not boolWritten Then
                        y.Offset(0, -2).Value = ws.Name
                        y.Offset(0, -1).Value = ws.Parent.Name
                    End If

                     ' Delete the column header copied to the list
                    y.Delete Shift:=xlUp
                End If

                 ' Identify the next row, based on the most rows used in columns C & D
                lngNextRow = WorksheetFunction.Max(wksSummary.Cells(wksSummary.Rows.Count, 3).End(xlUp).Row, wksSummary.Cells(wksSummary.Rows.Count, 4).End(xlUp).Row) + 1
                Set y = wksSummary.Cells(lngNextRow, 3)
                Set r = y.Offset(0, 1)
            End If
        End If
    End With
Next ws

 ' Autofit column widths of the report
wksSummary.Range("A1:D1").EntireColumn.AutoFit

 ' Reset system settings
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
End With

End Sub

0 个答案:

没有答案