Модераторы: mihanik

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив checkbox в Excel, На листе excel расположены 15 флажков ch 
:(
    Опции темы
Толик
Дата 4.11.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.11.2005

Репутация: нет
Всего: нет



На листе excel расположены 15 флажков checkbox. Они выполняют выбор данных из соответствующих строк таблицы. Для каждого написан код

If CheckBox1.Value = True Then
nPk = nPk + 1
Vkk(nPk) = WsResult.Cells(1 + 2, 2)
Zpk(nPk) = WsResult.Cells(1 + 2, 3)
Rdk(nPk) = WsResult.Cells(1 + 2, 4)
End If
...
If CheckBox15.Value = True Then
nPk = nPk + 1
Vkk(nPk) = WsResult.Cells(15 + 2, 2)
Zpk(nPk) = WsResult.Cells(15 + 2, 3)
Rdk(nPk) = WsResult.Cells(15 + 2, 4)
End If
Это работает, но как упростить программу и сделать это в цикле?
Пробовал вариант
For i=1 to 15
If CheckBox(i).Value = True Then
nPk = nPk + 1
Vkk(nPk) = WsResult.Cells(i + 2, 2)
Zpk(nPk) = WsResult.Cells(i + 2, 3)
Rdk(nPk) = WsResult.Cells(i + 2, 4)
End If
next i
ругается во второй строке. Помогите разобраться с этим делом.
PM MAIL   Вверх
Akina
Дата 4.11.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата
ругается во второй строке

В приведенном коде нет номеров строк. Это раз. И два - тег "Код" для кого придуман??? исправь исходное сообщение.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Толик
Дата 5.11.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.11.2005

Репутация: нет
Всего: нет



На листе excel расположены 15 флажков checkbox. Они выполняют выбор данных из соответствующих строк таблицы. Для каждого написан код
Код

If CheckBox1.Value = True Then
  nPk = nPk + 1
  Vkk(nPk) = WsResult.Cells(1 + 2, 2)
  Zpk(nPk) = WsResult.Cells(1 + 2, 3)
  Rdk(nPk) = WsResult.Cells(1 + 2, 4)
End If
...
If CheckBox15.Value = True Then
  nPk = nPk + 1
  Vkk(nPk) = WsResult.Cells(15 + 2, 2)
  Zpk(nPk) = WsResult.Cells(15 + 2, 3)
  Rdk(nPk) = WsResult.Cells(15 + 2, 4)
End If

Это работает, но как упростить программу и сделать это в цикле?
Пробовал вариант
Код

For i=1 to 15
  If CheckBox(i).Value = True Then
    nPk = nPk + 1
    Vkk(nPk) = WsResult.Cells(i + 2, 2)
    Zpk(nPk) = WsResult.Cells(i + 2, 3)
    Rdk(nPk) = WsResult.Cells(i + 2, 4)
  End If
next i

ругается во второй строке. Помогите разобраться с этим делом.

PM MAIL   Вверх
Staruha
Дата 5.11.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 13
Всего: 27



вообще - то объекты перебираются For Each...Next. Но фиг знает где у него control. Самое простое это связать объект со строкой(ячейкой),а потом обрабатывать строки.


--------------------
Возмездие настигнет
PM MAIL   Вверх
likhobory
Дата 7.11.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 10
Всего: 20



один из возможных вариантов:
Код

For i = 1 To 15
If ActiveSheet.Shapes("CheckBox" & CStr(i)).OLEFormat.Object.Object Then
    Vkk(i) = WsResult.Cells(i + 2, 2)    
    Zpk(i) = WsResult.Cells(i + 2, 3)    
    Rdk(i) = WsResult.Cells(i + 2, 4)
  End If
Next 



--------------------
PM MAIL   Вверх
javastic
Дата 16.11.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: нет
Всего: 27



Вот держи:

Код

Sub getChecksValue()
  Dim oc As Shape
  For Each oc In ActiveSheet.Shapes
    If oc.Type = msoFormControl Then
      If oc.FormControlType = xlCheckBox Then
        If oc.ControlFormat.Value = 1 Then
           MsgBox "Checked `" & oc.Name & "` value is: " & oc.ControlFormat
        End If
      End If
    End If
  Next
End Sub


smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Vidocq
Дата 1.12.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



javastic
Опа-опа! smile
А как сделать то же самое, только для

Код

ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1")


?


--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
Vidocq
Дата 1.12.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



javastic
И ещё вопрос вдогонку: как эти элементы выравнивать (любые, хоть ОЛЕ, хоть msoFormControl) по границе ячейки, добавляя их в цикле?


--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
Staruha
Дата 1.12.2005, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 13
Всего: 27



Я так думаю Range(следующая ячейка).Left


--------------------
Возмездие настигнет
PM MAIL   Вверх
Vidocq
Дата 2.12.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



Staruha
А на каком месте какие координаты стоят? %)
CheckBoxes.Add(Range("E1").Next.Left, Range("E1").Next.Top, 49.5, 17.25).Select


--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
Vidocq
Дата 2.12.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



javastic
Staruha

Дело в том, что до этого чекбоксы почему-то съезжали вниз. То есть, не печатались строго внутри ячеек, а постепенно смещались вниз (или вверх).

И ещё. Я заметил, что каждый раз при добавлении этих чекбоксов у них новые имена: Check Box номер. Так вот "номер" всегда с каждой последующей операцией увеличивается... Можно ли как-нибудь это запретить?


--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
likhobory
Дата 2.12.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 10
Всего: 20



Цитата(Vidocq @ 2.12.2005, 11:24)
у них новые имена: Check Box номер.

у каждого элемента должно быть уникальное имя, поскольку при создании элемента ты его никак не называешь, то это происходит "автоматом" вышеописанным способом




--------------------
PM MAIL   Вверх
Vidocq
Дата 2.12.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



likhobory
Каким образом я могу контролировать именование чекбоксов?
И кстати, почему после перезапуска процедуры (даже после перезапуска приложения) значение имен не обнуляется? Они так и продолжают хранится в памяти? Можно ли как-то принудительно их сбрасывать, чтоб они именовались " с начала" ?


--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
likhobory
Дата 2.12.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 10
Всего: 20



Код
 ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1").Name = "MyName"



--------------------
PM MAIL   Вверх
Vidocq
Дата 2.12.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 15.12.2004
Где: Запорожье, Украин а

Репутация: нет
Всего: 7



likhobory
Вроде бы разобрался.
Код

While rstLost.EOF = False
        Cells(i, 1).Value = rstLost!artikel
        Cells(i, 2).Value = rstLost!einheitid
        Cells(i, 3).Value = rstLost!gebinde
        Cells(i, 4).Value = rstLost!preis
        Cells(i, 5).Value = rstLost!bemerkungen
        
        'ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=Cells(i, 6).Left, Top:=Cells(i, 6).Top, Width:=Cells(i, 6).Width, Height:=Cells(i, 6).Height / 2).Select
        
        ActiveSheet.CheckBoxes.Add(Cells(i, 7).Left, Cells(i, 7).Top, 70, 17.25) = 0
        
        i = i + 1
        rstLost.MoveNext
    Wend
    j = 2
    For Each control In ActiveSheet.Shapes
        If control.Type = msoFormControl Then
            If control.FormControlType = xlCheckBox Then
                        control.Name = j
            End If
        End If
        j = j + 1
    Next


А как сделать, чтоб имя присваивалось в while-цикле. Я пробовал так:

Код

While rstLost.EOF = False
        Cells(i, 1).Value = rstLost!artikel
        Cells(i, 2).Value = rstLost!einheitid
        Cells(i, 3).Value = rstLost!gebinde
        Cells(i, 4).Value = rstLost!preis
        Cells(i, 5).Value = rstLost!bemerkungen
        
        'ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=Cells(i, 6).Left, Top:=Cells(i, 6).Top, Width:=Cells(i, 6).Width, Height:=Cells(i, 6).Height / 2).Select
        
        ActiveSheet.CheckBoxes.Add(Cells(i, 7).Left, Cells(i, 7).Top, 70, 17.25) = 0
               
        If control.Type = msoFormControl Then
            If control.FormControlType = xlCheckBox Then
                'If oc.ControlFormat.Value = 1 Then
                    control.Name = i
                'End If
            End If
        End If
i = i + 1
rstLost.MoveNext

Wend

Ошибка исполнения: Object variable is not set



--------------------
Всё течёт ©
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.1656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.