Управление исходным кодом Excel VBA кодирует модули

Я заметил, что вам не нужно переносить MatTableDataSource<> для ответа API,

  async ngOnInit() {
    // Load the items from the blockchain
    this.items = await this.api.getApiRecords(); //this will be work
    //this.items = new MatTableDataSource(items); << remove this
  }

В этом примере stackblitz переменная dataSource содержит необработанные данные. Не нужно типа для MatTableDataSource<>

Обновление:

Здесь работает пример Stabblitz .

Ниже также обновляется код,

  
  
  

22
задан Jon Mills 6 October 2009 в 12:01
поделиться

3 ответа

Посмотрите на страницу VBAMaven. У меня есть собственное решение, использующее те же концепции. У меня есть общая библиотека с кучей исходного кода, сборкой муравья и скриптом VB для импорта. Ant управляет сборкой, которая берет пустой файл Excel и помещает в него необходимый код. @Mike абсолютно прав - любые повторяющиеся определения модуля будут автоматически иметь номер, добавленный к имени модуля. Кроме того, классы модулей классов (как в Sheet и ThisWorkbook) требуют особого обращения. Вы не можете создавать эти модули, вы должны прочитать входной файл и записать буфер в соответствующий модуль. Это сценарий VB, который я использую для этого в настоящее время. Раздел, содержащий текст с разделителями @ (например, @build file @) являются заполнителями - сборка муравья заменяет эти теги значимым содержимым. Это не идеально, но у меня работает.

''
' Imports VB Basic module and class files from the src folder
' into the excel file stored in the bin folder. 
'

Option Explicit

Dim pFileSystem, pFolder,  pPath
Dim pShell
Dim pApp, book

Dim pFileName

pFileName = "@build file@"

Set pFileSystem = CreateObject("Scripting.FileSystemObject")

Set pShell = CreateObject("WScript.Shell")
pPath = pShell.CurrentDirectory

If IsExcelFile (pFileName) Then
    Set pApp = WScript.CreateObject ("Excel.Application")
    pApp.Visible = False
    Set book = pApp.Workbooks.Open(pPath & "\build\" & pFileName)
Else
    Set pApp = WScript.CreateObject ("Word.Application")
    pApp.Visible = False
    Set book = pApp.Documents.Open(pPath & "\build\" & pFileName)
End If


'Include root source folder code if no args set
If Wscript.Arguments.Count = 0 Then
    Set pFolder = pFileSystem.GetFolder(pPath & "\src")
    ImportFiles pFolder, book
    '
    ' Get selected modules from the Common Library, if any
    @common path@@common file@
Else
    'Add code from subdirectories of src . . .
    If Wscript.Arguments(0) <> "" Then
        Set pFolder = pFileSystem.GetFolder(pPath & "\src\" & Wscript.Arguments(0))
        ImportFiles pFolder, book
    End If
End If





Set pFolder = Nothing
Set pFileSystem = Nothing
Set pShell = Nothing


If IsExcelFile (pFileName) Then
    pApp.ActiveWorkbook.Save
Else
    pApp.ActiveDocument.Save
End If

pApp.Quit
Set book = Nothing
Set pApp = Nothing


'' Loops through all the .bas or .cls files in srcFolder
' and calls InsertVBComponent to insert it into the workbook wb.
'
Sub ImportFiles(ByVal srcFolder, ByVal obj)
    Dim fileCollection, pFile
    Set fileCollection = srcFolder.Files
    For Each pFile in fileCollection
        If Right(pFile, 3) = "bas _
          Or Right(pFile, 3) = "cls _
          Or Right(pFile, 3) = "frm Then
            InsertVBComponent obj, pFile
        End If
    Next
    Set fileCollection = Nothing
End Sub


'' Inserts the contents of CompFileName as a new component in 
'  a Workbook or Document object.
'
'  If a class file begins with "Sheet", then the code is
'  copied into the appropriate code module 1 painful line at a time.
'
'  CompFileName must be a valid VBA component (class or module) 
Sub InsertVBComponent(ByVal obj, ByVal CompFileName)
    Dim t, mName
    t = Split(CompFileName, "\")
    mName = Split(t(UBound(t)), ".")
    If IsSheetCodeModule(mName(0), CompFileName) = True Then
        ImportCodeModule obj.VBProject.VBComponents(mName(0)).CodeModule, _
                         CompFileName
    Else
        If Not obj Is Nothing Then
            obj.VBProject.VBComponents.Import CompFileName
        Else
            WScript.Echo  "Failed to import " & CompFileName
        End If
    End If 
End Sub

''
' Imports the code in the file fName into the workbook object
' referenced by mName.
' @param target destination CodeModule object in the excel file
' @param fName file system file containing code to be imported
Sub ImportCodeModule (ByVal target, ByVal fName)
    Dim shtModule, code, buf    
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0

    Set buf = fso.OpenTextFile(fName, ForReading, False, TristateUseDefault)
    buf.SkipLine
    code = buf.ReadAll

    target.InsertLines 1, code
    Set fso = Nothing
End Sub


''
' Returns true if the code module in the file fName
' appears to be a code module for a worksheet.
Function IsSheetCodeModule (ByVal mName, ByVal fName)
    IsSheetCodeModule = False
    If mName = "ThisWorkbook" Then
       IsSheetCodeModule = False
    ElseIf Left(mName, 5) = "Sheet" And _
       IsNumeric(Mid (mName, 6, 1)) And _
       Right(fName, 3) = "cls Then
       IsSheetCodeModule = True
    End If
End Function

''
' Returns true if fName has a xls file extension
Function IsExcelFile (ByVal fName)
    If Right(fName, 3) = "xls" Then
        IsExcelFile = True
    Else
        IsExcelFile = False
    End If 
End Function
5
ответ дан 29 November 2019 в 05:21
поделиться

Обычно вещь "Loader1" происходит, когда Excel просят импортировать модуль, и модуль уже существует с тем же именем. Таким образом, если Вы импортируете "Загрузчик", затем загружаете его снова, и Вы получите "Loader1". Это было бы то, потому что Excel не знает (или возможно просто не заботится), если это - действительно то же самое или новый блок функциональности, которая просто происходит, имеют то же имя модуля, таким образом, это импортирует его так или иначе.

Я не могу думать об идеальном решении, но я думаю, что был бы склонен попытаться поместить загрузить/разгрузить логику в дополнение - что вещь Workbook_Open выглядит немного уязвимой и имеющей, это во всех рабочих книгах будет огромной болью, если код когда-нибудь должен изменяться (никогда не говорят никогда). Логика XLA могла бы быть более сложной (более хитрый для захвата необходимых событий, с одной стороны), но по крайней мере она будет только существовать в одном месте.

2
ответ дан 29 November 2019 в 05:21
поделиться

Я работал над этим уже несколько месяцев. Думаю, я разобрался.

Если проект VB пытается удалить модуль, содержащий что-то в стеке вызовов, он откладывает удаление до тех пор, пока стек вызовов не вытолкнет заменяемый модуль.

Чтобы модуль не находился в стеке вызовов, запустите свой код с Application.OnTime

Private Sub Workbook_Open()

    'WAS: module_library (1)

    Application.OnTime (Now + TimeValue("00:00:01")), "load_library_kicker_firstiter"

End Sub

Если вы, как я, самовосстанавливаете свой код, вам также придется запустить свой код, который перезаписывает «вызывающий» код с той же стратегией.

Я еще не проводил обширного тестирования , Я нахожусь в режиме полного празднования, но это очень приближает меня к простому коду самовосстановления на 99,9% в автономном файле .xls без каких-либо других уловок

4
ответ дан 29 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: