2016-06-10 5 views
2

Ich brauche etwas Hilfe mit diesem VB-Skript (edit: es wird in QlikView verwendet) - es kopiert eine Datei an einen anderen Speicherort (prüft, ob die Datei bereits existiert der Zielordner).VB Script referenziert eine Variable, die von einem Makro definiert wird

Es funktioniert, wenn der Quelldateiname und der Speicherort fest codiert ist, aber dies wird eine Variable sein, die in einem anderen Makro definiert ist.

So werden der Quelldateiname und der Speicherort von varFileOpen definiert.

Grundsätzlich im Code statt:

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

so sein:

SourceFile = varFileOpen 

wo varFileOpen aus einer anderen SUB definiert wurden (es ist der vollständige Dateipfad) .. .. Ich kann es nicht zur Arbeit bringen?

Sub, die die varFileOpen erstellt:

'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 

Der obige Code öffnet Explorer & Sie sind in der Lage, eine Datei auszuwählen und den Pfad kopiert wird - varFileOpen.

Die folgende SUB verschiebt die Datei:

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 

Antwort

0

Sie müssen den Wert in die Sub passieren dafür Umfang haben, was bedeutet, dass Sie die Unter so definieren müssen, so dass es ein akzeptiert Parameter

Public Sub MySub(byVal SourceFile) 

ByVal nur bedeutet, dass Sie den Wert der variablen nicht die tatsächliche Variable selbst übergeben.

Und Sie würden es von den anderen Unter rufen mit

MySub varFileOpen 

EDIT: basierend auf dem Code angezeigt oben, müssten Sie Sub movefile-Sub movefile(byVal SourceFile) und entfernen Sie die Const delaration von Source zu ändern. Sobald das getan wurde, würde zu tun haben, alles, was Sie ändern, was movefile ruft (Ich kann nichts im Code sehen Sie schon gepostet tun?) Es zu nennen mit movefile varToOpen statt

+0

Danke für die Antwort Dave, aber ich habe Probleme bekommen es zu arbeiten. Ich habe den Code zu meiner Frage hinzugefügt. Könnten Sie darauf hinweisen, wo ich das neue Sub platzieren soll? Vielen Dank – Jammy

+0

Siehe bearbeitete Antwort für Details.Ich kann in keinem Ihrer Code-Posts etwas sehen, das den Unterordner 'movefile' aufruft. – Dave

+1

Ich verstehe nicht, wie 'SourceFile' nun mit was 'varFileOpen' gleichgesetzt wird? Dieses Skript wird in QlikView ausgeführt und das Makro wird von einer Schaltfläche aus aufgerufen, die den Namen "SUB" trägt. Sie heißt "MoveFile". Danke – Jammy

0

Versuchen Sie, meine CustomFileDialog.

Verbrauch:

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

Danke für die Antwort Thomas. Sie sagen, führen Sie die Sub-movefile ......., aber die "C: \ file_path \ file_name.txt" (die Quelldatei) ist unbekannt - Sub OpenSave ermöglicht es mir, einen Ordner, den ich verschieben möchte auswählen. – Jammy

Verwandte Themen