VBS L oop Через файлы Accb в папке и запустить сохраняет импорт / экспорт - PullRequest
0 голосов
/ 13 февраля 2020

Просто изучите немного VBS и немного потрудитесь над тем, как работать с определенной командой c для Access Exports / Imports.

Короче, мне нужно l oop через все файлы .accb в папки. (Я думаю, что у меня это прибито) Для каждого из найденных файлов мне нужно открыть файл и выполнить все сохраненные операции импорта, ТО сохраненные операции экспорта.

Пока я прикреплю свой код.

Dim objFSO, objFolder, objFile
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("X:\Path\Path")

For Each objFile in objFolder.Files
    If LCase(objFSO.GetExtentionName(objFile.Name)) = "accb" Then

    'Loop for Opening Access DB and running all imports, then exports
    'Close Access DB


Next


Set objFolder = Nothing
Set objFile = Nothing
Set objFSO = Nothing

Мне не удалось продвинуться слишком далеко с циклическим просмотром сохраненных Импортов / Экспортов в Access, хотя я сделал поиск в Google.

Я могу написать каждую команду импорта / экспорта явно , но я бы предпочел, чтобы этот скрипт не обновлялся каждый раз, когда я добавлял новый импорт или экспорт.

Set objAccess = CreateObject("Access.Application")


objAccess.OpenCurrentDatabase "Path"

objAccess.DoCmd.RunSavedImportExport "xxxx"
objAccess.DoCmd.RunSavedImportExport "yyyy"

objAccess.CloseCurrentDatabase

ObjAccess.Quit
'Access.Application.Quit
Set ObjAccess = Nothing

Я думаю, что единственный способ заставить его запустить импорт сначала - через стандарты именования. Допустим, каждый импорт / экспорт имеет следующий стандарт именования. Я - имя E - имя

Я думаю, что здесь нужны еще два цикла For / If, но не знаете, как go об этом.

Есть мысли?

Спасибо Вы, Андре,

Я снова обновлюсь, когда мне удастся проверить. Но это то, что у меня сейчас есть.

Dim objFSO, objFolder, objFile
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("X:\Path\Path")


For Each objFile in objFolder.Files
    If LCase(objFSO.GetExtentionName(objFile.Name)) = "accb" Then

    Set objAccess = CreateObject("Access.Application")

    objAccess.OpenCurrentDatabase "Path"

    Dim i As Integer
    For i = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(i).name
    If Left(CurrentProject.ImportExportSpecifications(i).name,2) = "I-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(i).name

    Next i

    Dim z As Integer
    For z = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(z).name
    If Left(CurrentProject.ImportExportSpecifications(z).name,2) = "-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(z).name

    Next z

 Set i = Nothing
 Set z = Nothing

    objAccess.CloseCurrentDatabase

    ObjAccess.Quit
    Set ObjAccess = Nothing

Next


Set objFolder = Nothing
Set objFile = Nothing
Set objFSO = Nothing

Обновление № 3:

Хорошо, мой код в настоящее время выглядит следующим образом.

option explicit

dim objFSO, objFolder, objFile, Access

Set objShell = CreateObject(“WScript.Shell”)

ScriptPath = WScript.ScriptFullName

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set ScriptFile = objFSO.GetFile(ScriptPath)

ScriptFolder = objFSO.GetParentFolderName(ScriptFile) 

Set objFolder = ScriptFolder


For Each objFile in objFolder.Files
    If LCase(objFSO.GetExtentionName(objFile.Name)) = "accdb" Then
    Set Access = objFolder & objFile.Name
    Set objAccess = CreateObject("Access.Application")

    objAccess.OpenCurrentDatabase Access

    Dim i As Integer
    For i = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(i).name
    If Left(CurrentProject.ImportExportSpecifications(i).name,2) = "I-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(i).name

    Next i

    Dim z As Integer
    For z = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(z).name
    If Left(CurrentProject.ImportExportSpecifications(z).name,2) = "E-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(z).name

    Next z

 Set i = Nothing
 Set z = Nothing

    objAccess.CloseCurrentDatabase

    ObjAccess.Quit
    Set ObjAccess = Nothing
    Set Access = Nothing
    Set objFile = Nothing


Next


Set objFolder = Nothing
Set objFSO = Nothing

Цель состоит в том, чтобы определить папку, в которой находится скрипт, l oop через файлы .accdb и выполнить весь их импорт, а затем экспортировать. Я получаю сообщение об ошибке в строке 1, и я не могу на всю жизнь понять, почему!?! «Ошибка компиляции Microsoft VBScript»

Есть мысли?

В качестве альтернативы, есть ли лучший способ сделать все это вместе?

Спасибо!

1 Ответ

0 голосов
/ 20 февраля 2020
Option Explicit
Dim objFSO, objFolder, objFile, oAccess, objShell, ScriptPath, ScriptFile, ScriptFolder, objAccess

Set objShell = CreateObject("WScript.Shell")

ScriptPath = WScript.ScriptFullName

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set ScriptFile = objFSO.GetFile(ScriptPath)

ScriptFolder = objFSO.GetParentFolderName(ScriptFile) 

Set objFolder = ScriptFolder


For Each objFile in objFolder.Files
    If LCase(objFSO.GetExtentionName(objFile.Name)) = "accdb" Then
    Set oAccess = objFolder & objFile.Name
    Set objAccess = CreateObject("Access.Application")

    objAccess.OpenCurrentDatabase oAccess

    Dim i
    For i = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(i).name
    If Left(CurrentProject.ImportExportSpecifications(i).name,2) = "I-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(i).name
    End If

    **Next i**

    Dim z As Integer
    For z = 0 To CurrentProject.ImportExportSpecifications.count - 1
    Debug.Print CurrentProject.ImportExportSpecifications(z).name
    If Left(CurrentProject.ImportExportSpecifications(z).name,2) = "E-" Then
    DoCmd.RunSavedImportExport CurrentProject.ImportExportSpecifications(z).name
    End If

    Next z

 Set i = Nothing
 Set z = Nothing

    objAccess.CloseCurrentDatabase

    ObjAccess.Quit
    Set ObjAccess = Nothing
    Set oAccess = Nothing
    Set objFile = Nothing


Next


Set objFolder = Nothing
Set objFSO = Nothing

Хорошо, я немного перешел и поиграл с другой кодировкой. В настоящее время я использую ANSI.

Я сейчас получаю сообщение об ошибке в строке 31. char 7.

«Next i» для справки. Неожиданный конец заявления.

Любая помощь?

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...