2014-10-03 4 views
-1

Я пытался перенести старый рабочий код Excel VBA (возможно, написанный на VB 2003) в более новую версию, но поскольку у меня нет предыдущего опыта работы с VB (никогда не использовал его раньше или узнал). Мне не повезло заменить часть всего кода.
У меня есть рабочее знание других языков программирования, и говорит мне, что ошибка в следующем модуле кода:Замена Application.FileSeach (VB) из Excel 2003

Set fs = Application.FileSearch 
With fs 
    .LookIn = dirname 
    .Filename = "*.*" 
    .SearchSubFolders = True 
    If .Execute > 0 Then 
     nrFiles = .FoundFiles.Count 
     For i = 1 To nrFiles 
      ffilename(i) = .FoundFiles(i) 
     Next i 
    Else 
     'MsgBox "There were no files found." 
    End If 
End With 

После некоторых выкапывать в интернете я обнаружил, что Application.FileSearch устарела корпорацию Майкрософт.
У меня есть два обходных варианта для замены Application.FileSearchDir и еще одно возможное решение, которое я забыл.
Поскольку я никогда не изучал VB, я не могу реализовать метод Dir для реализации функциональности. Если у кого-то всего несколько минут, было бы неплохо, если бы они могли просто помочь мне переписать этот едва ли 10-строчный код.

Примечание: этот модуль принимает dirname в качестве входных данных (определенного до этой части) и устанавливает значения двух глобальных переменных nrFiles и ffilename(), которые будут использованы в дальнейшем от остальной части коды.

я просто нужна замена, которая будет делать то же самое и не бросить исключение, как Application.FileSearch

Я уже пробовал некоторые примеры разбросаны в Интернете, но не вез реализующие их. Любая помощь могла бы быть полезна.

EDIT Я уже упоминал, что у меня практически есть 0 рабочих знаний о VB, поэтому все, что я пытаюсь, похоже на попытку выучить испанский язык за 1 день. @Ken White Вот что я сделал до сих пор и исключение, которое я получаю.

Dim objFSO As Object 
Dim objFolder As Object 
Dim objFile As Object 
Dim i As Integer 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder(dirname) 
If objFolder.Files.Count > 0 Then 
    nrFiles = objFolder.Files.Count 
    i = 1 
    For Each objFile In objFolder.Files 
     ffilename(i) = objFile.Name(i) 
     i = i + 1 
    Next objFile 
Else 
    'MsgBox "There were no Files found." 
End If 

ОШИБКА

Ошибка выполнения '451': пусть
собственности процедура не определена и процедура свойства прибудет не возвращает объект

EDIT 2:
Изменение моего кода на

Dim objFSO As Object 
Dim objFolder As Object 
Dim objFile As Object 
Dim i As Integer 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder(dirname) 
If objFolder.Files.Count > 0 Then 
    nrFiles = objFolder.Files.Count 
    i = 1 
    For Each objFile In objFolder.Files 
     ffilename(i) = objFile ''<-Change is here'' 
     i = i + 1 
    Next objFile 
Else 
    'MsgBox "There were no Files found." 
End If 

Работает как очарование. Он работает сейчас.
Всем пытаясь указать двуличие поста и указывая на меня не работает на моей собственной
я писал в начале, что у меня есть 0 знание VB, так что я открыто просил пример, который будет делать то же самое работать как фрагмент кода, установить целочисленную переменную и переменную массива. Для этого не нужно было разбираться, о чем я уже говорил! Таким образом, вместо публикации строк предложения и попыток презирать создателя потока для того, чтобы не пытаться (чего-то у него никогда не было опыта или знаний!), В следующий раз попробуйте предоставить реальную помощь, если у вас есть время или перейдите, если нет.Я знаю, как использовать Google @Blackhawk Я сделал это перед публикацией здесь (или, по крайней мере, почти аналогичной строки поиска). Я предлагаю вам сделать это и прочитать первые 5 сообщений, каждый из которых показывает примерный код примера 40 ~ 50 строк на VB (язык, который я не знаю), и расскажите, сколько из них связано с моей проблемой. Я ЗНАЮ, ЧТО Я МОГУ НАЙТИ В ИНТЕРНЕТЕ! И я сделал это с моими основными знаниями, а не с помощью ЛЮБОГО! Мне просто грустно, как все начали воспринимать проблему. Если вы посещаете страну, язык которой неизвестен, и, к счастью, у вас есть друг, который из этой страны, вы подходите к нему и просите его научить вас говорить, как говорить воду, пищу, туалет, телефон и другие чрезвычайно важные миры, которые вы можете использовать в крайней необходимости! а вместо этого ваш друг попросил вас перевести в один класс на один семестр в один университет? Ну, я просто чувствовал то же самое, с кладами внушения, просящим меня копаться, чтобы понять, что у меня нет прежних знаний !!!! Как это полезно? Могу поспорить, если у вас было достаточно понимания VB, тогда вы могли бы написать то, что я написал (плагиат), через несколько минут !!! то зачем играть бога ???? Теперь для тех, кто может задаться вопросом Каково мое положение, чтобы написать так много, Ну, я и ЕЭК grad. Я знаю C, C++, C#, ASP, JavaScript, CUDA, HSpice, Verilog, Perl, Matlab и еще несколько языков программирования. Я не бросаю вызов кому-либо или не щеголяет. Я никогда не учил VB, поэтому смотреть на стиль VB было очень неудобно для меня, поэтому я решил спросить, чтобы мог быть точный и компактный обходной путь для замены Application.FileSearch (который я не нашел с достаточным объяснением, которое может просветить кого-то без предварительного знания VB)! Ну, я должен был помочь себе!

Модераторы Пожалуйста, закройте нить. ** В любом случае, спасибо всем.

+0

это не связано с VB.NET; вы также можете добавить некоторые пробелы к этой стене текста – Plutonix

+0

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

+1

FileSearch был удален из (я думаю) Excel 2007 и далее. Возможно, вы сможете делать то, что хотите, используя FileSystemObject. Некоторые примеры здесь: http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba – Dave

ответ

0
Dim fso As Object 
Set fso = CreateObject("Scripting.FileSystemObject") 

nrFiles = ListContents(fso, fso.GetFolder(dirName), 0) 

If nrFiles = 0 Then 
    'MsgBox "There were no Files found." 
End If 
Private Function ListContents(ByVal fso As Object, ByVal root As Object, ByVal index As Long) As Long 
    Dim f As Object 'File 
    For Each f In root.Files 
    index = index + 1 
    'Debug.Print index, fso.BuildPath(root.Path, f.Name) 
    ffilename(index) = fso.BuildPath(root.Path, f.Name) 
    Next 

    Dim d As Object 'Folder 
    For Each d In root.SubFolders 
    index = ListContents(fso, d, index) 
    Next 

    ListContents = index 
End Function 
+0

эй, спасибо за решение, очень ценю. Мне также удалось немного изменить код. Глядя на ваше изысканное решение, я считаю, что это будет работать лучше! – user2954612

+0

@ user2954612 Это не лучше, все по-другому. Код 'Application.FileSearch' рекурсивно пересекает дочерние папки, так же как и этот код, в то время как ваш FSO-код содержит только списки файлов верхнего уровня. По-видимому, это то, что вам нужно в первую очередь, но тогда почему у вас есть '.SearchSubFolders = True'. – GSerg

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

  • Нет связанных вопросов^_^