| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Vba при попытке скопировать один массив в другой того же типа ошибка 13: type mismatched

Vba при попытке скопировать один массив в другой того же типа ошибка 13: type mismatched

Ответ
Поиск в этой теме
Непрочитано 06.07.2016, 03:28 #1
Vba при попытке скопировать один массив в другой того же типа ошибка 13: type mismatched
zenija2007
 
Регистрация: 18.09.2015
Сообщений: 120

Код ниже наполняет ComboBox содержимым. Сперва использовалась только локальная переменная form_local, в которую сперва получали массив форматов листов canonical, затем в цикле перезаписываем в массив значения форматов листов local. Все работало без ошибок. Затем ввел глобальный массив form_canon для отдельного хранения форматов листов canonical и получил ошибку 13: type mismatched.
Ошибка исчезла после того, как инициализировал массив form_local = actlay.GetCanonicalMediaNames(). Но, согласитесь, способ варварский. Пытался при создании массива использовать конструкцию Dim form_local (LBound(form_canon) To UBound(form_canon)) As Variant, но тогда вылезла ошибка насчет констант (разумеется, сперва инициализировали массив form_canon). Этого мне не понять: целые числа не подходят только потому, что не константы? Это как отсутствие прокрутки мышью длинных ComboBox: всем ясно, что нужна нативная поддержка, но не сделали. Так как же быть, если надо скопировать один массив в другой, причем если заранее длина исходного массива неизвестна? Не инициализировали 2-й массив - ошибка 13. Пытаемся задать размер массива, считывая крайние индексы из исходного - ошибка, что значения не константы.

Код:
[Выделить все]
Dim actlay As AcadLayout
Dim form_canon As Variant
Private Sub ButtonCancel_Click()
    End
End Sub
Public Sub FillCombo(combik As ComboBox, spis As Variant)
    Dim i As Integer
    For i = LBound(spis) To UBound(spis)
        combik.AddItem (spis(i))
    Next
    combik.Value = spis(0)
End Sub
Private Sub UserForm_Initialize()
    Dim i As Integer
    Set actlay = ThisDrawing.ModelSpace.Layout  
    actlay.RefreshPlotDeviceInfo
    Dim pr_spis As Variant
    pr_spis = actlay.GetPlotDeviceNames() 
    Call FillCombo(Me.ComboPrint, pr_spis)
    Dim form_local As Variant
    form_canon = actlay.GetCanonicalMediaNames() 
    For i = LBound(form_canon) To UBound(form_canon)
        form_local(i) = actlay.GetLocaleMediaName(form_canon(i)) 
    Next
    Call FillCombo(Me.ComboForm, form_local)
    Dim stil_spis As Variant
    stil_spis = actlay.GetPlotStyleTableNames()
    Call FillCombo(Me.ComboStil, stil_spis)
    For i = 1 To 20                           
        Me.ComboNum.AddItem (i)
    Next
    Me.ComboNum.Value = 1
End Sub
Просмотров: 4358
 
Непрочитано 06.07.2016, 08:11
1 | #2
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


ты пытаешься в переменную Variant запихнуть массив (по умолчанию она не массив, она вариант)))
надо определить, что это массив и указать его размерность.
Код:
[Выделить все]
Private Sub UserForm_Initialize()
    Dim i As Integer
    Set actlay = ThisDrawing.ModelSpace.Layout
    actlay.RefreshPlotDeviceInfo
    Dim pr_spis As Variant
    pr_spis = actlay.GetPlotDeviceNames()
    Call FillCombo(Me.ComboPrint, pr_spis)
    Dim form_local As Variant
    form_canon = actlay.GetCanonicalMediaNames()
    ReDim form_local(LBound(form_canon) To UBound(form_canon))
    For i = LBound(form_canon) To UBound(form_canon)
        form_local(i) = actlay.GetLocaleMediaName(form_canon(i))
    Next
    Call FillCombo(Me.ComboForm, form_local)
    Dim stil_spis As Variant
    stil_spis = actlay.GetPlotStyleTableNames()
    Call FillCombo(Me.ComboStil, stil_spis)
    For i = 1 To 20
        Me.ComboNum.AddItem (i)
    Next
    Me.ComboNum.Value = 1
End Sub
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 07.07.2016, 09:48
#3
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


с этим все ясно, сам бы ни за что не догадался, что для преобразования варианта в массив необходимо выполнить функцию redim.
но тут всплыли новые непонятки - с функцией SetWindowToPlot. Она требует 2 массива variant с координатами x и y. Сперва я просто обрезал полученные после ввода переменные t1 и t2 командой ReDim Preserve. Все отработало как надо, предпросмотр печати функцией DisplayPlotPreview показывал выделенную область. решил замутить автоповорот в зависимости от соотношения сторон - и тут выяснилось, что при выборе 1-я точка: верхний левый угол, 2-я точка: нижний правый угол предпросмотр выдает пустой лист. при любых других диагоналях выбора прямоугольника для предпросмотра картинка была. Решил преобразовать передаваемые координаты в соответствии с рекомендациями в справке для функции SetWindowToPlot.
Пришлось ввести еще пару массивов - dim перем (0 to 1) as variant. Все, вроде массивы готовы. передаю в них координаты точек - и ошибка 5: invalid procedure call or argument в функции SetWindowToPlot. Получается, что если я передаю координаты точек выбором мышью на чертеже, все ОК, а если создал массив вручную - ошибка. Специалисты по массивам - что же еще нужно vba, чтобы массив подошел для функции SetWindowToPlot?

Последний раз редактировалось zenija2007, 07.07.2016 в 09:56.
zenija2007 вне форума  
 
Непрочитано 07.07.2016, 11:16
1 | #4
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от zenija2007 Посмотреть сообщение
Специалисты по массивам - что же еще нужно vba, чтобы массив подошел для функции SetWindowToPlot?
as Variant для задания точек АК не катит
должно быть As Double
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 07.07.2016, 11:34
#5
zenija2007


 
Регистрация: 18.09.2015
Сообщений: 120


Цитата:
Сообщение от doctorraz Посмотреть сообщение
должно быть As Double
с вариантами до конца не разобрался. буду читать.

Последний раз редактировалось zenija2007, 07.07.2016 в 11:45.
zenija2007 вне форума  
 
Непрочитано 07.07.2016, 12:00
1 | #6
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,293
Отправить сообщение для doctorraz с помощью Skype™


ReDim pnt1(2) As Double
и вперед
__________________
Мастерская СПДС
doctorraz вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Vba при попытке скопировать один массив в другой того же типа ошибка 13: type mismatched

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему на печати линии не того типа, что установлены? ilya777-777-07 AutoCAD 1 01.06.2011 20:38
Два типа сплайнов и как сконвертировать один тип в другой? Supermax Программирование 2 12.04.2011 11:51
Как заменить один блок на другой? (не все) Абдулнасир Динамические блоки 2 21.05.2009 11:38
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
Abrakadabra, convertor выдает - ошибка типа файла спасибо!!! irina2005 AutoCAD 2 04.03.2005 19:56