Ошибка при разбиении текста на символы (на вход данные из Excel) - VB

Узнай цену своей работы

Формулировка задачи:

Пишу макрос для заполнения документа и для заполнения полей, разбитых на клетки, решил провести посимвольное заполнение. Но при выполнении программы получаю ошибку Invalid qualifier с указанием на переменную value. Подпрограмма для разбиения полученного содержимого ячеек на необходимое количество частей:
Листинг программы
  1. Sub x(ByVal leng As Integer, ByVal mark As String, ByVal volume As String, ByVal d As Boolean)
  2. If d Then
  3. ReDim ReplaceText(2) As String: ReplaceText() = Split(vol, ".")
  4. Else: ReDim ReplaceText(0 To Len(vol) - 1) As String: ReplaceText() = volume.ToCharArray
  5. End If
  6. ReDim FindText(leng - 1) As String
  7. For j = 1 To leng
  8. FindText(j) = "{" + mark + j + "}"
  9. Next j
  10. n = leng - 1
  11. End Sub
На всякий случай держите
Листинг программы
  1. Const ИмяФайлаШаблона = "Doc1.2.docx"
  2. ' Const КоличествоОбрабатываемыхСтолбцов = 82
  3. Const РасширениеСоздаваемыхФайлов = ".docx"
  4. Sub СформироватьДоговоры()
  5. ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
  6. НоваяПапка = NewFolderName & Application.PathSeparator
  7. Dim row As Range, pi As New ProgressIndicator, FindText() As String, ReplaceText() As String
  8. r = Cells(Rows.Count, "A").End(xlUp).row: rc = r - 2 ' ???
  9. If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
  10. pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
  11. pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
  12. ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
  13. Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word
  14. For Each row In ActiveSheet.Rows("7:" & r)
  15. With row
  16. ФИО = Trim$(.Cells(2)) & " " & Trim$(.Cells(3)) & " " & Trim$(.Cells(4))
  17. Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайлов
  18. pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
  19. Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
  20. pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
  21. For i = 1 To 82
  22. Select Case i
  23. Case 25
  24. Call x(Len(Trim$(.Cells(i))), Cells(6, i), Trim$(.Cells(i)), False) ' контрольная информация
  25. Case 6, 16
  26. Call x(3, Cells(6, i), Trim$(.Cells(i)), True) ' дата
  27. Case 31, 41, 51
  28. Call x(6, Cells(6, i), Trim$(.Cells(i)), False) ' идексы
  29. Case 29, 63, 76
  30. Call x(10, Cells(6, i), Trim$(.Cells(i)), False) ' номера телефона
  31. Case Else
  32. ReDim ReplaceText(0) As String ' для остальных ячеек
  33. ReDim FindText(0) As String
  34. FindText(0) = "{" + Cells(6, i) + "}": ReplaceText(0) = Trim$(.Cells(i))
  35. n = 0
  36. End Select
  37. ' так почему-то заменяет не всё (не затрагивает таблицу)
  38. 'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
  39. 'pi.line3 = "Заменяется поле " & FindText
  40. For j = 0 To n ' вставка частей ячейки
  41. With WD.Range.Find
  42. .Text = FindText(j)
  43. .Replacement.Text = ReplaceText(j)
  44. .Forward = True
  45. .Wrap = 1
  46. .Format = False: .MatchCase = False
  47. .MatchWholeWord = False
  48. .MatchWildcards = False
  49. .MatchSoundsLike = False
  50. .MatchAllWordForms = False
  51. .Execute Replace:=2
  52. End With
  53. DoEvents
  54. Next j
  55. Next i
  56. pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
  57. WD.SaveAs Filename: WD.Close False: DoEvents
  58. p = p + a
  59. End With
  60. Next row
  61. pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
  62. WA.Quit False: pi.Hide
  63. msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
  64. MsgBox msg, vbInformation, "Готово"
  65. End Sub
  66.  
  67. Sub x(ByVal leng As Integer, ByVal mark As String, ByVal volume As String, ByVal d As Boolean)
  68. If d Then
  69. ReDim ReplaceText(2) As String: ReplaceText() = Split(vol, ".")
  70. Else: ReDim ReplaceText(0 To Len(vol) - 1) As String: ReplaceText() = volume.ToCharArray
  71. End If
  72. ReDim FindText(leng - 1) As String
  73. For j = 1 To leng
  74. FindText(j) = "{" + mark + j + "}"
  75. Next j
  76. n = leng - 1
  77. End Sub
  78.  
  79. Function NewFolderName() As String
  80. NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "Договоры, сформированные " & Get_Now)
  81. MkDir NewFolderName
  82. End Function
  83. Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
  84. Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
  85. Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function
За основу взят вполне рабочий макрос из интернета.
Поправка. Ошибка указывает на переменную volume.

Решение задачи: «Ошибка при разбиении текста на символы (на вход данные из Excel)»

textual
Листинг программы
  1. Const NewFileType = ".doc"
  2. Dim FindText() As String, ReplaceText() As String, n As Integer
  3.  
  4.  
  5. Sub СформироватьДоговоры()
  6.     Dim row As Range, pi As New ProgressIndicator
  7.     ReDim ReplaceText(1 To 100) As String
  8.     ReDim FindText(1 To 30) As String
  9.     r = Cells(Rows.Count, "A").End(xlUp).row: rc = r - 2
  10.     If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
  11.    
  12.     CardType = Cells(2, 2)
  13.     Select Case CardType
  14.         Case "Сбербанк-Maestro", "Сбербанк-Visa Electron"
  15.             TemplateFName = "Doc2.doc"
  16.         Case "Gold Mastercard", "Visa Gold", "Visa Gold Аэрофлот", "Visa Gold " & Chr(34) & "Подари жизнь" & Chr(34)
  17.             TemplateFName = "Doc3.doc"
  18.         Case Else
  19.             TemplateFName = "Doc1.doc"
  20.     End Select
  21.    
  22.     TemplateDir = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, TemplateFName)
  23.     NewFolder = NewFolderName & Application.PathSeparator
  24.    
  25.     pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
  26.     pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
  27.  
  28.     ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
  29.    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
  30.  
  31.     For Each row In ActiveSheet.Rows("7:" & r)
  32.         With row
  33.             FIO = Trim$(.Cells(2)) & " " & Trim$(.Cells(3)) & " " & Trim$(.Cells(4))
  34.             Filename = NewFolder & FIO & NewFileType
  35.  
  36.             pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", FIO
  37.             Set WD = WA.Documents.Add(TemplateDir): DoEvents
  38.  
  39.             pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", FIO
  40.             For i = 1 To 82
  41.                 Select Case i
  42.                     Case 25
  43.                         Call x(Len(Trim$(.Cells(i))), Cells(6, i), Trim$(.Cells(i)), False) ' контрольная информация
  44.                    Case 6, 16
  45.                         Call x(3, Cells(6, i), Trim$(.Cells(i)), True) ' дата
  46.                    Case 31, 41, 51
  47.                         Call x(6, Cells(6, i), Trim$(.Cells(i)), False) ' идексы
  48.                    Case 29, 63, 76
  49.                         Call x(10, Cells(6, i), Trim$(.Cells(i)), False) ' номера телефона
  50.                    Case Else
  51.                         FindText(1) = "{" + Cells(6, i) + "}": ReplaceText(1) = Trim$(.Cells(i))
  52.                         n = 1
  53.                 End Select
  54.                
  55.                 ' так почему-то заменяет не всё (не затрагивает таблицу)
  56.                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
  57.  
  58.                 'pi.line3 = "Заменяется поле " & FindText
  59.  
  60.                 For j = 1 To n ' вставка частей ячейки
  61.                    With WD.Range.Find
  62.                         .Text = FindText(j)
  63.                         .Replacement.Text = ReplaceText(j)
  64.                         .Forward = True
  65.                         .Wrap = 1
  66.                         .Format = False: .MatchCase = False
  67.                         .MatchWholeWord = False
  68.                         .MatchWildcards = False
  69.                         .MatchSoundsLike = False
  70.                         .MatchAllWordForms = False
  71.                         .Execute Replace:=2
  72.                     End With
  73.                     DoEvents
  74.                 Next j
  75.             Next i
  76.             pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", FIO, " "
  77.             WD.SaveAs Filename: WD.Close False: DoEvents
  78.             p = p + a
  79.         End With
  80.     Next row
  81.  
  82.     pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
  83.     WA.Quit False: pi.Hide
  84.     msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & NewFolder
  85.     MsgBox msg, vbInformation, "Готово"
  86. End Sub
  87.  
  88.  
  89. Sub x(ByVal leng As Integer, ByVal mark As String, ByVal volume As String, ByVal d As Boolean)
  90.     If d Then
  91.         ReplaceText() = Split(volume, ".", 3)
  92.     Else
  93.         For u% = 1 To Len(volume)
  94.             ReplaceText(u%) = Mid$(volume, u%, 1)
  95.             'asd = Mid$(volume, u%, 1)
  96.            'MsgBox asd, vbInformation, "Готово"
  97.        Next u%
  98.     End If
  99.    
  100.     'ReDim FindText(1 To leng) As String
  101.    For j = 1 To leng
  102.         FindText(j) = "{" & CStr(mark) & CStr(j) & "}"
  103.     Next j
  104.     n = leng
  105. End Sub
  106.  
  107.  
  108.  
  109. Function NewFolderName() As String
  110.     NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "Договоры, сформированные " & Get_Now)
  111.     MkDir NewFolderName
  112. End Function
  113.  
  114. Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
  115. Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
  116. Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы