Доброго времени суток. На просторах интернета был найден полезная программка (см. приложение) для заполнения строительных спецификаций. Информация для спецификации берётся из листа «База» с базой данных по профилям металлопроката и арматуре (в него можно добавлять новые типы профилей по образцу существующих). Описание проблемы: Добавляю на лист "База" новые данные (в столбцы K и L), сохраняюсь, перехожу на лист "Спецификация2", нажимаю кнопку "Создание спецификации". В ответ два окошка с ошибкой №13 Type mismatch. После закрытия окон с ошибками появляется форма для спецификации, но без добавленных в базу данных. При этом если разбить добавляемые данные на несколько столбиков, в каждом из которых будет не больше 240 с чем-то строк, то макрос работает, но это не самый удобный и, к сожалению, не всегда работающий способ. Через "Compile VBA project" нашел, что ошибка возникает в коде UserForm1 в процедуре summ(str). Если точнее, то не определены str2 и stR1. Не могу понять как количество строк добавляемых данных влияет на определение этих переменных. Подскажите как это можно исправить.
PS. Так как файл весил больше 200 кБ, то пришлось удалить из него лишние листы и модули. Не обрезанный файл с описанием программы можно найти здесь http://dwg.ru/dnl/6568
kacugu написал: Не могу понять как количество строк добавляемых данных влияет на определение этих переменных
Не верный подход,вот и повлияло.
Скрытый текст
Код
Sub main()
Dim blntmp As Variant, txttmp, CL As Long
Dim vartmp As Variant, arrtmp()
Dim Celltmp As range
Dim x As Long, y As Long
Dim i As Long, j As Long
Set This_Wbk = ActiveWorkbook
Set acsheet = ActiveSheet
If Worksheet_Y_N("База") = False Then
MsgBox "Отсутствует лист с базой данных профилей"
End
End If
Set Celltmp = This_Wbk.Worksheets("База").UsedRange
vartmp = range_to_var(Celltmp)
x = UBound(vartmp, 1): y = UBound(vartmp, 2)
ReDim Pr_Base1(1 To x / 2)
ReDim GOST1(1 To x / 2)
CL = 0
For i = 1 To x Step 2
ReDim arrtmp(0)
If (i + 1) / 2 = 23 Then Stop
If Replace(vartmp(i + 1, 1), " ", "") <> "" And Replace(vartmp(i, 1), " ", "") <> "" Then
arrtmp(0) = Trim(vartmp(i, 1))
GOST1((i + 1) / 2) = Trim(vartmp(i + 1, 1))
For j = 2 To y
If vartmp(i, j) <> Empty And vartmp(i + 1, j) <> Empty Then
CL = CL + 1
ReDim Preserve arrtmp(CL)
arrtmp(CL) = Trim(vartmp(i, j)) & vbCrLf & Trim(vartmp(i + 1, j))
Else
Exit For
End If
Next j
Pr_Base1((i + 1) / 2) = arrtmp
End If
Next i
BubbleSort Pr_Base1, GOST1
UserForm1.Show
Exit Sub
err_ch:
MsgBox "Ошибка N " & Err.Number & vbCrLf & Err.Description
End Sub
Извиняюсь за наглость, но не могли бы прокомментировать исправленные моменты? Заменил исходный код на ваш - ошибка 13 всё равно появляется 2 раза, но добавленные в базу данные теперь отображаются. Причём ошибка возникает в том же месте, что и до этого.
kacugu написал: но не могли бы прокомментировать исправленные моменты?
Не люблю я это дело. Я изменил логику перераспределения массива.
Цитата
kacugu написал: ошибка возникает в коде UserForm1 в процедуре summ(str). Если точнее, то не определены str2 и stR1
Каким образом вы смогли вызвать эту функцию.Она нигде не используется в модуле формы. Вы физически не можете это сделать.После изменения кода ошибки у меня не возникают. Внимательно просмотрел Модули,там везде в процедурах Main надо заменить перераспределение массивов,как у меня. Код то простой. Счетчик в ноль,если обе ячейки не пустые,добавляем к счетчику 1 и перераспределяем массив,заполняем данными. Все ошибки возникают в процедуре сортировки из-за неопределенного значения в массиве. Это результат не правильной реализации перераспределения массива в процедурах Main.
К сожалению ошибка у меня всё ещё возникает. Как писал выше отличие теперь только в том, что добавленные в базу данные появились в форме1. Вызываю эту процедуру просто: захожу в редактор visual basic, выбираю debug - > Compile VBA project. Результат - не определены str2 и stR1. Спасибо за наводку - буду разбираться Офтоп: код может и простой, да знание VBA у меня пока что даже хуже чем со словарём.
Заменил код на ваш в "не кастрированном" варианте файле. Там действие макроса прерывается на строке If (i + 1) / 2 = 23 Then Stop, но после нажатия на "продолжить" макрос работает нормально и ошибку 13 не выдает.
kacugu написал: 1. Там действие макроса прерывается на строке If (i + 1) / 2 = 23 Then Stop 2. выбираю debug - > Compile VBA project. Результат - не определены str2 и stR1.
1. Команда Stop и есть команда остановки работы процедуры. Скорей всего автор кода использовал ее для отладки программы. 2. Вы использовали опцию explicit (Option Explicit), чтобы явно объявлять переменные, но Вы использовали переменные str2 и stR1 без объявления их. Вот и возникает ошибка при компиляции.