К знающим VBA

Canniballissimo

Житель центра
#1
Выскажу коротко проблему. Пишу макрос на VBA для Word'а. Стоит задача присваивать переменной типа CheckBox в коде формы значение ЧекБокса из самой формы (потом поясню почему). Делаю это таким образом (который на других контролах работает):
Dim cb As CheckBox
Set cb = CheckBox1 (это который на форме)
И при таком варианте почему-то упорно выдаётся ошибка Type Mismach.
Кто знает как с этим бороться, подскажите!

п.с. Теперь для самых упёртых. У меня на форме есть 4 группы однотипных ЧекБоксов и использовать для обращения к ним массивы гораздо удобнее, чем по отдельности к каждому. Для ComboBox'ов, SpinButton'ов и другого вышеприведённый код (с небольшими оговорками) работает, а вот для ЧекБоксов не хочет. Спрашивал у друга, тоже программера, в 2007-м офисе у него такой же косяк случается. Хелп ничем не помог, зараза.
 

-=EHOT=-

Гость города
#2
может я чета путаю, но типа переменной ЧекБокс в ВБА нету, по этому он и пишет что несовпадение типов. лучше бы ты весь код сюда выложил, или файл вордовский, было бы понятней.
 

Canniballissimo

Житель центра
#3
-=EHOT=-, да, ты что-то путаешь. Это контрол типа CheckBox, который на форме уже лежит :) И переменная типа CheckBox, потому что переменные других типов (вышеназваных) срабатывают нормально! Да и на объявление он же не ругается.
А ключевой код и так весь. Те добавки, что там есть, на это абсолютно никак не влияют. Проверено тем же другом.
 

absent

Известный деятель города
#4
-=EHOT=-, да, ты что-то путаешь. Это контрол типа CheckBox, который на форме уже лежит :) И переменная типа CheckBox, потому что переменные других типов (вышеназваных) срабатывают нормально! Да и на объявление он же не ругается.
А ключевой код и так весь. Те добавки, что там есть, на это абсолютно никак не влияют. Проверено тем же другом.
А если попробовать явное преобразование типа при присваивании?
 

Canniballissimo

Житель центра
#5
absent, если честно, я не понял как :) Делал переменные Variant и Object. Если подскажешь, как в ВБ преобразовываются типы, то буду благодарен.
 

absent

Известный деятель города
#6
absent, если честно, я не понял как :) Делал переменные Variant и Object. Если подскажешь, как в ВБ преобразовываются типы, то буду благодарен.
Оказывается в VBA нет явного преобразования типов.

А зачем вам массив всех этих чекбоксов? Почему вы не храните только значение вкл/выкл? Или если так удобно работать с массивом, может быть подойдет вариант For i:=0 To form.ControlCount-1 Do IF (form.Controls is TCheckBox) then?
 

Canniballissimo

Житель центра
#7
absent, ну а этот вариант слишком запутает код :) Лучше сделаю комбобоксы вместо чеков, раз VBA такой капризный. Потом на VSTO перепишу, в привычной обстановке, так сказать.
Понимаешь, у меня сделан редактор стилей вордовского файла. Всего обобщённых стилей 7 и у каждого есть Bool-поля для Bold, Italic, Underline и "Все заглавные". Я загоняю кроме этих 28 чеков ещё и другие поля в массивы и удобно с ними работаю, зная где первый, где последний, всё пашет замечательно.
 

Aliens

Меня знают многие ;-)
#8
Set cb = CheckBox1 (это который на форме)
Проблема не в левой части присвоения, а в правой...
Когда бейсик не находит имени, то он заводит новую переменную с таким именем... а поскольку объектные типы автоматически не заводятся, то получается ошибка...

Надо указывать полный путь к объекту типа Form1.CheckBox1 или даже от Document или от Application...это надо разобраться, не помню...
 

Canniballissimo

Житель центра
#9
Nic, попробую и такой вариант! Но опять же повторю, что с другими контролами такой способ работает :)