2015-02-02 2 views
0

Я хочу переименовать файлы с помощью команды VBA, хранящейся в текстовом поле подформата MS Access. Можно заметить, что команды VBA генерируются с использованием формулы конкатенации из запроса базы данных и копируются в текстовое поле.Запустить файл переименовать текстовую строку как оператор VBA

Это по существу код, который я пытаюсь использовать, но я получаю runtime error 2434 - The expression you entered contains invalid syntax. Возможно, лучший способ, чем использование команды eval().

Public Function BulkRenameFile() 
    Dim script As String 
    script = "Name ""c:\ipfimport\PE2258N2754\2620.jpg"" As ""c:\ipfimport\PE2258N2754\PE2258N2754_PH1_20141216_2620.jpg""" 
    BulkRenameFile = Eval(script) 
    MsgBox ("Photo Renaming Complete") 
End Function 

Любая помощь будет очень признательна.

+2

Почему вы хотите, чтобы запустить все команду в строке, вместо передачи имен файлов по отдельности в 'Name'? то есть. 'Name fileA Как fileB', где' fileA' и 'fileB' являются строками. Вы хотите делать что-то другое, кроме переименования файлов, используя этот подход? –

+0

Спасибо, Тим, я думаю, я не думал достаточно далеко за пределами площади, я вижу, что этот подход может просто работать. Только хотите переименовать файлы. Попробуем завтра. –

ответ

0

В конце концов я изменил выражение поля в моем запросе, который строит команду переименования из кода VBA в DOS один. Я вставляю полный столбец Datasheet кодов DOS переименования в текстовое поле. Текстовое поле экспортируется как .txt-файл, а затем запускается как .bat в командной оболочке Windows DOS.

пример DOS переименовывать команду вставить в текстовое поле:

rename "c:\ipfimport\PE2152N2380\*7112.jpg" "PE2152N2380_LT_T25_20140516_7112.jpg" 
 
rename "c:\ipfimport\PE2152N2380\*7113.jpg" "PE2152N2380_LT_T25_20140516_7113.jpg"

Окончательный рабочий код:

Function FileRename() 
 
    
 
Dim fso As New FileSystemObject 
 
Dim stream As TextStream 
 

 
strPath = [Forms]![File Rename > Main].Text_FilePathBase.Value 
 
strFile = "Rename.bat" 
 

 
Set stream = fso.CreateTextFile(strPath & strFile, True) 
 

 
Debug.Print strPath & strFile 
 

 
strForm = [Forms]![File Rename > Main].Text_PasteRenameScript.Value 
 

 
stream.Write strForm 
 

 
stream.Close 
 
Set fso = Nothing 
 
Set stream = Nothing 
 

 
Call Shell(strPath & strFile, vbNormalFocus) 
 

 
MsgBox ("Renaming Complete") 
 

 
End Function

+0

Я рад, что вы нашли решение самостоятельно. Хорошо, что мои решения побудили вас найти третий способ. Лично мне не нравится это гибридное решение «Из кода», потому что если все работает, все в порядке. Когда они не работают, это беспорядок (это не так). Я предпочитаю хранить каждую часть кода под контролем, особенно если вам нужно распространять ее третьим лицам. В любом случае, отлично :-) – Wiz

1

Я размещаю здесь две разные процедуры, первый для переименования одного файла, а второй для переименования всех файлов в папку (или перемещение файлов из папки в другую). Второй принимает фильтр для переименования только определенного типа файлов. Они оба используют компонент FileSystemObject (вы должны включить Runtime Microsoft Scripting Runtime).

'-------------------------------------------------------- 
' Rename a file (returns the number of error, if any) 
'-------------------------------------------------------- 
Public Function FileRename(strSourceFileName As String, strTargetFileName As String) As Integer 
On Error GoTo Err_FileRename 
    Dim fso As FileSystemObject 

    Set fso = New FileSystemObject 

    fso.MoveFile strSourceFileName, strTargetFileName 

    Set fso = Nothing 

Exit_FileRename: 
    FileRename = Err.Number 
    Exit Function 

Err_FileRename: 
    GoTo Exit_FileRename 

End Function 

'-------------------------------------------------------- 
' Massively rename files 
'-------------------------------------------------------- 
Public Sub MoveFiles(SourceFolderPath As String, DestinationFolderPath As String, 
        _ Optional FileFilter As String = "*.*") 

    Dim fso As FileSystemObject, fld As Folder, fil As File 
    Dim strDestinationFilePath As String 

    Set fso = New FileSystemObject 
    Set fld = fso.GetFolder(SourceFolderPath) 

    For Each fil In fld.Files 

     If fil.Name Like FileFilter Then 

      strDestinationFilePath = DestinationFolderPath + "\" + fil.Name 
      FileMove fil.Path, strDestinationFilePath 

     End If 

    Next fil 

    Set fld = Nothing 
    Set fso = Nothing 
End Sub 

+0

Wiz я могу видеть вашу первую рутину, делающую трюк красиво. Я не слишком хорошо знаком с использованием компонента FileSystemObject, поэтому сделаю некоторые исследования по его достоинствам, скажем, используя «Name» ... «As» .... Большое спасибо, я скоро вернусь к своему окончательному решению. –

+0

Не стесняйтесь спрашивать, если вам нужна дополнительная информация о fso. – Wiz

+0

еще раз спасибо за вашу помощь, в конце концов, я смог получить один вызов функции FileRename (SourceFilename, TargetFilename), хранящийся в текстовом поле, но если у меня было два или более вызовов в текстовом поле, каждый на новой строке, i не могли заставить их работать последовательно, как я хотел. Поэтому см. Подход ниже, который я взял в конце. –

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