2016-06-10 1 views
2

Мне нужна помощь с этим скриптом VB (редактирование: оно используется в QlikView) - оно копирует файл в другое место (проверяет, существует ли файл в папка назначения).Сценарий VB, ссылающийся на переменную, определенную с помощью макроса

Он работает, когда исходное имя файла и его местоположение жестко закодированы, но это будет переменная, которая определяется в другом макросе.

Таким образом, исходное имя файла и его местоположение будут определены varFileOpen.

В основном в коде, вместо:

SourceFile = "C:\file_path\file_name.txt" 

быть похожим на это:

SourceFile = varFileOpen 

где varFileOpen была определена из другого SUB (это полный путь к файлу) .. .. Я не могу заставить его работать?

Sub, который создает varFileOpen:

'Sub to get open file dialog 
SUB ShowOpen 
OpenSave "varFileOpen", 0, "Text file (*.txt)|*.txt|All files (*.*)|*.*", "h:\", "Select a file to open" 
END SUB 
' Sub to show browse folder dialog 
SUB Folder (objVariable) 
ON ERROR RESUME NEXT 
SET objShell = CREATEOBJECT("Shell.Application") 
SET objFolder = objShell.BrowseForFolder (WINDOW_HANDLE, TITLE, OPTIONS, ROOT) 
SET objFolderItem = objFolder.Self 
strPathAndFile = objFolderItem.Path 
SET objSavePath = ActiveDocument.Variables(objVariable) 
objSavePath.SetContent strPathAndFile, TRUE 
ON ERROR GOTO 0 
END SUB 

' Sub to show open/save dialog 
SUB OpenSave (objVariable, intType, strFilter, strInitialDirectory, strDialogText) 
' Create objects 
SET objShell = CREATEOBJECT("WScript.Shell") 
SET objFSO = CREATEOBJECT("Scripting.FileSystemObject") 
strTempDir = objShell.ExpandEnvironmentStrings("%TEMP%") 
strTempFile = strTempDir & "\" & objFSO.GetTempName 
' Temporary powershell script file to be invoked 
strPSFile = tempFile & ".ps1" 
' Temporary file to store standard output from command 
strPSOutFile = tempFile & ".txt" 
' Create script to run 
strPSScript = strPSScript & "[System.Reflection.Assembly]::LoadWithPartialName(""System.windows.forms"") | Out-Null" & vbCRLF 
' Check type (Open (0) or Save (1)) 
IF intType = 1 THEN 
    strPSScript = strPSScript & "$dlg = New-Object System.Windows.Forms.SaveFileDialog" & vbCRLF 
ELSE 
    strPSScript = strPSScript & "$dlg = New-Object System.Windows.Forms.OpenFileDialog" & vbCRLF 
END IF     
' Set initial directory 
strPSScript = strPSScript & "$dlg.initialDirectory = " & CHR(34) & strInitialDirectory & CHR(34) & vbCRLF 
' Set file filter/s 
strPSScript = strPSScript & "$dlg.filter = " & CHR(34) & strFilter & CHR(34) & vbCRLF 
strPSScript = strPSScript & "$dlg.FilterIndex = 1" & vbCRLF 
' Set dialog text 
strPSScript = strPSScript & "$dlg.Title = " & CHR(34) & strDialogText & CHR(34) & vbCRLF 
' Show help (seems it must be set to true) 
strPSScript = strPSScript & "$dlg.ShowHelp = $True" & vbCRLF 
' Show the dialog 
strPSScript = strPSScript & "$dlg.ShowDialog() | Out-Null" & vbCRLF 
strPSScript = strPSScript & "Set-Content """ &strPSOutFile & """ $dlg.FileName" & vbCRLF 
' Write result 
SET objResultFile = objFSO.CreateTextFile(strPSFile, TRUE) 
objResultFile.WriteLine(strPSScript) 
objResultFile.Close 
SET objResultFile = NOTHING 
' Run command in PowerShell 
strPSCMD = "powershell -ExecutionPolicy unrestricted &'" & strPSFile & "'" 
objShell.Run strPSCMD, 0, TRUE 
' Open result file and read result 
SET objResultFile = objFSO.OpenTextFile(strPSOutFile, 1, 0, -2) 
strPathAndFile = objResultFile.ReadLine 
objResultFile.Close 
SET objResultFile = NOTHING 
' Add to result to variable 
SET objSavePath = ActiveDocument.Variables(objVariable) 
objSavePath.SetContent strPathAndFile, TRUE 
' Delete temp-files 
objFSO.DeleteFile(strPSFile) 
objFSO.DeleteFile(strPSOutFile) 
END SUB 

Приведенный выше код открывает проводник & вы можете выбрать файл и путь копируется - varFileOpen.

Следующая SUB перемещает файл:

SUB movefile 
Const DestinationFile = "c:\destfolder\anyfile.txt" 
Const SourceFile = "C:\file_path\file_name.txt" 

Set fso = CreateObject("Scripting.FileSystemObject") 
'Check to see if the file already exists in the destination folder 
If fso.FileExists(DestinationFile) Then 
    'Check to see if the file is read-only 
    If Not fso.GetFile(DestinationFile).Attributes And 1 Then 
     'The file exists and is not read-only. Safe to replace the file. 
     fso.CopyFile SourceFile, "C:\destfolder\", True 
    Else 
     'The file exists and is read-only. 
     'Remove the read-only attribute 
     fso.GetFile(DestinationFile).Attributes = fso.GetFile(DestinationFile).Attributes - 1 
     'Replace the file 
     fso.CopyFile SourceFile, "C:\destfolder\", True 
     'Reapply the read-only attribute 
     fso.GetFile(DestinationFile).Attributes = fso.GetFile(DestinationFile).Attributes + 1 
    End If 
Else 
    'The file does not exist in the destination folder. Safe to copy file to this folder. 
    fso.CopyFile SourceFile, "C:\destfolder\", True 
End If 
Set fso = Nothing 
END SUB 

ответ

0

Вам нужно будет передать значение в Sub для того, чтобы иметь объем, а это означает, что вам нужно будет определить подлодку, как это так, что он принимает параметр

Public Sub MySub(byVal SourceFile) 

ByVal просто означает, что вы передать значение переменной, а не самой фактической переменной.

И вы назвали бы его от других суб с

MySub varFileOpen 

EDIT: На основе кода отображается выше, вы должны изменить Sub movefile к Sub movefile(byVal SourceFile) и удалить Const delaration из Исходный_файл. Как только это было сделано, все, что вы должны сделать, это изменить то, что звонит movefile (я не вижу ничего в коде, вы делаете это Написали?), Чтобы вызвать его movefile varToOpen вместо

+0

Спасибо за ответ Дейва, но у меня возникают проблемы при получении его на работу. Я добавил код к моему вопросу, не могли бы вы указать, где я должен разместить новый суб? Большое спасибо – Jammy

+0

См. Отредактированный ответ для деталей.Я ничего не вижу в любом из ваших кодовых сообщений, которые на самом деле называет 'movefile' sub? – Dave

+1

Я не понимаю, как теперь «SourceFile» приравнивается к тому, что такое «varFileOpen»? Этот скрипт входит в QlikView, и макрос вызывается с помощью кнопки, которая называется именем SUB ... она называлась «MoveFile». Спасибо – Jammy

0

Попробуйте мой CustomFileDialog.

Использование:

Dim fDialog 
Set fDialog = New CustomFileDialog 
fDialog.FilterString = "Text Files (*.txt)|*.txt" 
fDialog.InitialDirectory = "C:\" 
fDialog.DialogText = "Select a file to open" 
fDialog.Show 
fDialog.MoveFile "C:\stackoverflow\temp\New File Name.TXT" 

CustomFileDialog

Class CustomFileDialog 
 
\t Public SourceFile 
 
\t Public FilterString 
 
\t Public InitialDirectory 
 
\t Public DialogText 
 
\t 
 
\t Public Sub Show 
 
\t \t Set toolkit = CreateObject("Vbsedit.toolkit") 
 
\t \t Files = toolkit.OpenFileDialog(InitialDirectory, FilterString, False, DialogText) 
 
\t \t If UBound(Files) >= 0 Then 
 
\t \t \t SourceFile = Files(0) \t 
 
\t \t Else 
 
\t \t \t SourceFile = "" 
 
\t \t End If 
 
\t End Sub 
 
\t 
 
\t Public Sub MoveFile(DestinationFile) 
 
\t \t Set fso = CreateObject("Scripting.FileSystemObject") 
 
\t \t If fso.FileExists(DestinationFile) Then \t \t fso.DeleteFile DestinationFile, True 
 
\t \t fso.CopyFile SourceFile, DestinationFile, True 
 
\t End Sub 
 
End Class

+0

Спасибо за ответ Томаса. Вы говорите, что запустите файл sub movefile ......., но «C: \ file_path \ file_name.txt» (исходный файл) неизвестен. Sub OpenSave позволяет мне выбрать папку, которую я хочу переместить. – Jammy

Смежные вопросы