Parazit написал:
UKY написал(а):
в одном отчёте при выгрузке 57 тыс строк почему-то тормозит... Версия ФМ, правда, старая от 2011 года, но, думаю, это не принципиально в данном случае.
Шаблон такой (никакие макросы из него не запускаются, т.е. автоподбор высоты строки c объединёнными ячейками НЕ делается):
https://drive.google.com/file/d/0B9mldSUn8dOXRXEzQkhQSGgxSEE/view?usp=sharingКажется догадываюсь, смущают первые 6 строк в приведённом примере it_values, у них VAR_NUM = 1. Любое не нулевое значение этого поля означает, что область указанная в VAR_NAME это таблица и производится её копирование столько раз, сколько уникальных значений VAR_NUM - в данном случае 1 (одно копирование).
Кстати, попробуйте через Alt+Tab поискать это окошко, чтобы проверить догадку.
К сожалению, без цифр в VAR_NUM так же загрузка процессора Excel'ем на 100%... По ALT+TAB Excel не появляется, в процессах Excel видно, грузит на 100%, окон у него нет.
Промежуточный файл C:\Users\UserName\AppData\Local\SAP\SAP GUI\tmp\ZWWW_MACROS_100915.xls получается таким:
Code:
9
FILE_NAME   C:\Users\SlobodchikovIuS\AppData\Local\SAP\SAP GUI\tmp\ZFI_J_3RF_BUY_2014-100915.XLSM
MACROSNAME   'ZWWW_MACROS_100915.xls'!FillVariables
DEBUG_MODE   
WITHOUT_OLE   
PRINTDIALOG   
PROTECT   
DECIMAL_SEPARATOR   
CLOSE_FORM   
DELETE_FILE   
   00000   <DATE_TO>   S   1   31.12.2014
*   *   <DATE_FROM>   S   0   01.10.2014
*   *   <CONTR_NAME>   S   0    ОАО "ОАО"
*   *   <CONTR_INN_KPP>   S   0   654654654/1231321321
*   *   <ADD_NUM>   S   0   
*   *   <ADD_DATE>   S   0   
LINE   00001   <WRBTR_WRS_INV>   S   56845   RUB
*   *   <SELL_WO_VAT>   S   0   0.00
*   *   <SELL_VAT_18>   S   0   0.00
*   *   <SELL_VAT_10>   S   0   0.00
*   *   <SELL_SUM_18>   S   0   0.00
*   *   <SELL_SUM_10>   S   0   0.00
*   *   <SELL_SUM_0>   S   0   0.00
*   *   <SELL_RUB>   S   0   0.00
*   *   <SELL_CUR>   S   0   
*   *   <SELL_ACCEPT>   S   0   
*   *   <OPER_TYP>   S   0   '
*   *   <NUM>   S   0   0001
*   *   <NAME>   S   0   ООО "ООО"
*   *   <MWSKZ>   S   0   PC
*   *   <KSF_CORR>   S   0   
*   *   <KSF>   S   0   
*   *   <INV_CORR>   S   0   
*   *   <INV>   S   0   000984, 31.05.2014
*   *   <INN_KPP>   S   0   1321654/876514321
*   *   <GJAHR>   S   0   2014
*   *   <CURRENCY>   S   0   
*   *   <BUY_VAT_PAY>   S   0   
*   *   <BUY_VAT>   S   0   0.01
*   *   <BUY_SUM>   S   0   0.07
*   *   <BUY_CUSTOMS>   S   0   -
*   *   <BUY_ACC_DAT>   S   0   25.06.2014
*   *   <BELNR>   S   0   98412165418
*   *   <AGENT_INN_KPP>   S   0   -/-
*   *   <AGENT>   S   0   
Сам макрос в ZWW_MACROS.xls такой:
Code:
Public Sub FillVariables(FileData As String, UseUnicode As String)
  Dim fs, f, _
      Ln As String, r As Range, Ofs As Range, _
      Ar() As String, I As Long, J As Long, Cnt As Long, _
      Value, QTable As QueryTable, RowsCount As Long, _
      MACROSNAME, ErrNumber, FldsInfo(1 To 300) As Variant, _
      OfsRowsCount As Long, NewRng As Range, OfsCount As Long, _
      CodePageTxt As Integer, FileNameTemplate As String, _
      NumParams As Integer, Param, _
      ResDialogPrint, _
      Sht As Worksheet, _
      Psw As String, _
      FILE_NAME As String, _
      WITHOUT_OLE As String, _
      MACROS_NAME As String, _
      DEBUG_MODE As String, _
      CLOSE_FORM As String, _
      PRINTDIALOG As String, _
      PROTECT_WB As String
  RowsCount = 1
  
  For I = 1 To 300
    FldsInfo(I) = Array(I, 2)
  Next
  
'  Set fs = CreateObject("Scripting.FileSystemObject")
  ErrNumber = 0
  
  With Application
    .DisplayAlerts = False
    .ScreenUpdating = False
  End With
 
  Err.Clear
  ErrNumber = 0
  
  I = 0
  CodePageTxt = -2
  If UseUnicode = "X" Then
    CodePageTxt = -1
  End If
'  Set f = fs.OpenTextFile(FileData, 1, 0, CodePageTxt)
  Open FileData For Input As #1
  
'  NumParams = f.ReadLine
  Line Input #1, Ln
  NumParams = Ln
  
'  Do While Not f.AtEndOfStream And NumParams > 0
  Do While Not EOF(1) And NumParams > 0
    NumParams = NumParams - 1
    
'    Ln = f.ReadLine
    Line Input #1, Ln
    Param = Split(Ln, Chr(9))
    If UBound(Param) = 1 Then
      Select Case Param(0)
        Case "FILE_NAME"
          FILE_NAME = Param(1)
        Case "WITHOUT_OLE"
          WITHOUT_OLE = Param(1)
        Case "MACROSNAME"
          MACROS_NAME = Param(1)
        Case "DEBUG_MODE"
          DEBUG_MODE = Param(1)
        Case "CLOSE_FORM"
          CLOSE_FORM = Param(1)
        Case "PRINTDIALOG"
          PRINTDIALOG = Param(1)
        Case "PROTECT"
          PROTECT_WB = Param(1)
      End Select
    End If
  Loop
  
  If DEBUG_MODE = "X" Then
    Stop
  End If
  
  If WITHOUT_OLE = "X" And FILE_NAME <> "" Then
    Dim App As New Excel.Application
'    Dim App As Application
    
'    Set App = Application
    App.DisplayAlerts = False
    App.ScreenUpdating = False
    App.Workbooks.Open FILE_NAME
    App.ActiveWorkbook.Activate
  Else
    Set App = Application
  End If
  
  If DEBUG_MODE = "X" Then
    App.Visible = True
    App.ScreenUpdating = True
  End If
  
  Set r = App.Cells
  
'  Do While Not f.AtEndOfStream
  Do While Not EOF(1)
    
    I = 1 ''I + 1
    
'    Ln = f.ReadLine
    Line Input #1, Ln
    
'    ReDim Preserve Ar(1 To I) As t_Ar
    Ar = Split(Ln, Chr(9), 6, vbBinaryCompare)
    If Ar(4) > 0 Then
      Ar(4) = Ar(4) - 1
    End If
    
'    ErrNumber = 0
    On Error Resume Next
    If Ar(0) = "" Then
      Set r = App.Cells
      ErrNumber = Err.Number
    Else
      If Ar(0) <> "*" Then
        'At new VAR_NAME
          
        Set r = App.Range(Ar(0))
        ErrNumber = Err.Number
        RowsCount = r.Rows.Count
        OfsCount = RowsCount
        
        If ErrNumber = 0 And Ar(4) <> 0 Then
          r.Copy
          Set Ofs = r.Offset(RowsCount)
          Ofs.Resize(Ar(4) * RowsCount).Insert
          ErrNumber = Err.Number
        End If
      ElseIf Ar(1) <> "*" Then
        Set r = r.Offset(OfsCount).Resize(RowsCount)
        OfsCount = RowsCount
      End If
    End If
    
'    OfsCount = RowsCount
    
    If ErrNumber = 0 Then
      If Ar(2) = "" Then
        If Ar(3) = "" Or Ar(3) = "S" Then
          Set Ofs = r.Cells(1, 1)
          Ofs.Value = Ar(5)
          Ofs.TextToColumns DataType:=xlDelimited
        ElseIf Ar(3) = "V" Then
          Set Ofs = App.Range(Ar(5))
          OfsRowsCount = Ofs.Rows.Count
          If OfsRowsCount > RowsCount Then
            OfsCount = OfsRowsCount
            Set NewRng = r.Offset(RowsCount)
            NewRng.Resize(OfsRowsCount - RowsCount).Insert
          ElseIf OfsRowsCount < RowsCount Then
            OfsCount = OfsRowsCount
            Set NewRng = r.Offset(OfsRowsCount)
            NewRng.Resize(RowsCount - OfsRowsCount).Delete
          End If
          Ofs.Copy r
          If OfsCount <> RowsCount Then
            Set r = r.Resize(OfsCount)
          End If
        ElseIf Ar(3) = "M" Then
          Err.Clear
          MACROSNAME = "'" + App.ActiveWorkbook.Name + "'" + "!" + Ar(5)
          App.Run MACROSNAME, r
          If Err.Number <> 0 Then
            App.Run MACROSNAME
          End If
        End If
      Else
        If Ar(3) = "S" Then 'or InStr(1, Ar(5), Chr(9)) = 0 Then
          Ln = Ar(5)
          r.Replace Ar(2), Ln, xlPart, xlByRows, False
        ElseIf Ar(1) <> "*" And Ar(3) = "T" Then
          Set Ofs = r.Find(Ar(2))
          Set QTable = r.Worksheet.QueryTables.Add("TEXT;" + Ar(5), Ofs)
          QTable.AdjustColumnWidth = False
          QTable.RefreshStyle = False
          QTable.Refresh
          QTable.Delete
          fs.DeleteFile Ar(5) 'Value(1)
        ElseIf Ar(3) = "R" Then
          Set Ofs = r.Find(Ar(2))
          Ofs.Value = Ar(5)
          If Ofs.NumberFormat = "@" Then
            Ofs.TextToColumns DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, FieldInfo:=FldsInfo
          Else
            Ofs.TextToColumns DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone
          End If
        End If
      End If
      
      If Ar(3) = "D" Then
        App.Range(Ar(0)).Delete
      End If
    End If
    
    Err.Clear
  Loop
  
  Close #1
  
  If WITHOUT_OLE = "X" Then
    App.DisplayAlerts = True
    App.ScreenUpdating = True
    
    If PROTECT_WB = "X" Then
      Psw = Time
      For Each Sht In App.Worksheets
        Sht.Protect Psw, True, True, True
      Next
    End If
  
    App.ActiveWorkbook.Save
    
    If CLOSE_FORM <> "X" Then
      With App
        .DisplayAlerts = True
        .ScreenUpdating = True
        .Visible = True
      End With
    End If
  
    If PRINTDIALOG = "X" Then
      ResDialogPrint = App.Dialogs.Item(xlDialogPrint).Show
    End If
  
    If CLOSE_FORM = "X" Or _
       PRINTDIALOG = "X" Then
      App.Quit
    End If
  End If
End Sub
В новых версиях были оптимизации в макросах/формате промежуточного файла?