Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Словарь. Добавление - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Словарь. Добавление (Макросы/Sub)
Словарь. Добавление
RAN Дата: Среда, 17.06.2015, 15:10 | Сообщение № 1
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Всем Мяу.
Сейчас уперся в непонятное
Строка
[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)
[/vba]
добавляет запись в словарь???
У кого крыша съехала? У меня, или у компа?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеВсем Мяу.
Сейчас уперся в непонятное
Строка
[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)
[/vba]
добавляет запись в словарь???
У кого крыша съехала? У меня, или у компа?

Автор - RAN
Дата добавления - 17.06.2015 в 15:10
doober Дата: Среда, 17.06.2015, 15:19 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
У кого крыша съехала? У меня, или у компа?

Догадайся котяра сам.
Подсказка.Комп не виноват.[vba]
Код
    If oDicColorN.Exists(Cells(1, 1).Value) Then
         a = oDicColorN.Item(Cells(1, 1).Value)
     End If
[/vba]


 
Ответить
Сообщение
У кого крыша съехала? У меня, или у компа?

Догадайся котяра сам.
Подсказка.Комп не виноват.[vba]
Код
    If oDicColorN.Exists(Cells(1, 1).Value) Then
         a = oDicColorN.Item(Cells(1, 1).Value)
     End If
[/vba]

Автор - doober
Дата добавления - 17.06.2015 в 15:19
RAN Дата: Среда, 17.06.2015, 15:23 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
До этого я и сам догадался. <_<
Это добавляет
[vba]
Код
oDicColorN.Item(Cells(1, 1).Value) = a
[/vba]
понятно, а почему наоборот добавляет?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеДо этого я и сам догадался. <_<
Это добавляет
[vba]
Код
oDicColorN.Item(Cells(1, 1).Value) = a
[/vba]
понятно, а почему наоборот добавляет?

Автор - RAN
Дата добавления - 17.06.2015 в 15:23
doober Дата: Среда, 17.06.2015, 18:28 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)=Empty
[/vba]


 
Ответить
Сообщение[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)=Empty
[/vba]

Автор - doober
Дата добавления - 17.06.2015 в 18:28
RAN Дата: Среда, 17.06.2015, 20:04 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Я знаю. И хочу Empty. И ошибку хочу.
А он, зараза, добавляет, и ошибки не дает.
Sub q()
К сообщению приложен файл: 5922607.xls (35.0 Kb)


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЯ знаю. И хочу Empty. И ошибку хочу.
А он, зараза, добавляет, и ошибки не дает.
Sub q()

Автор - RAN
Дата добавления - 17.06.2015 в 20:04
doober Дата: Среда, 17.06.2015, 20:38 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Работай всегда через строковый ключ.Будет число в ячейке,получишь индекс а не ключ.

[vba]
Код
Sub AddColor()
        Dim i&
        Dim k, ik, Key As String
        Set oDicColorN = CreateObject("Scripting.Dictionary")
        With shPart
            For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                Key = .Cells(i, 1).Value
              If Key = "" Then
                  Key = "Пусто"
              End If
                 oDicColorN.Item(Key) = .Cells(i, 1).Interior.Color
              
            Next
        End With
End Sub
[/vba]




Сообщение отредактировал doober - Среда, 17.06.2015, 20:46
 
Ответить
СообщениеРаботай всегда через строковый ключ.Будет число в ячейке,получишь индекс а не ключ.

[vba]
Код
Sub AddColor()
        Dim i&
        Dim k, ik, Key As String
        Set oDicColorN = CreateObject("Scripting.Dictionary")
        With shPart
            For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                Key = .Cells(i, 1).Value
              If Key = "" Then
                  Key = "Пусто"
              End If
                 oDicColorN.Item(Key) = .Cells(i, 1).Interior.Color
              
            Next
        End With
End Sub
[/vba]

Автор - doober
Дата добавления - 17.06.2015 в 20:38
Manyasha Дата: Среда, 17.06.2015, 21:07 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
RAN, еще можно так:
и будет Вам ошибка
Или так:
К сообщению приложен файл: 123.xls (45.5 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеRAN, еще можно так:
и будет Вам ошибка
Или так:

Автор - Manyasha
Дата добавления - 17.06.2015 в 21:07
RAN Дата: Среда, 17.06.2015, 21:09 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Дык весь хрен в том, что при заполнении нет
[vba]
Код
If Key = "" Then
      Key = "Пусто"
[/vba]
А добавление происходит при работе с уже заполненным словарем.

И, по большому счету, все это - как решить проблему, а не ПОЧЕМУ она вообще возникает.
[vba]
Код
oDicColorN.Item(Cells(1, 1).Value) = a
[/vba]
добавление данных
[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)
[/vba]
извлечение данных
ПОЧЕМУ при извлечении происходит добавление?

PS Manyasha, спасибо за код, но он ни в коей мере не отвечает на вопрос ПОЧЕМУ.

Вопрос КАК в данной теме не интересен. Варианты есть.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Среда, 17.06.2015, 21:15
 
Ответить
СообщениеДык весь хрен в том, что при заполнении нет
[vba]
Код
If Key = "" Then
      Key = "Пусто"
[/vba]
А добавление происходит при работе с уже заполненным словарем.

И, по большому счету, все это - как решить проблему, а не ПОЧЕМУ она вообще возникает.
[vba]
Код
oDicColorN.Item(Cells(1, 1).Value) = a
[/vba]
добавление данных
[vba]
Код
a = oDicColorN.Item(Cells(i, 3).Value)
[/vba]
извлечение данных
ПОЧЕМУ при извлечении происходит добавление?

PS Manyasha, спасибо за код, но он ни в коей мере не отвечает на вопрос ПОЧЕМУ.

Вопрос КАК в данной теме не интересен. Варианты есть.

Автор - RAN
Дата добавления - 17.06.2015 в 21:09
nilem Дата: Среда, 17.06.2015, 21:42 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Ну да, добавляется и так, и так. Вот у snb можно посмотреть (п.п. 5.2, 5.3)
просто потом проверочку, типа if not isempty(a) then

edited:
... или проверку "до того", типа if exists...


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Среда, 17.06.2015, 21:46
 
Ответить
СообщениеНу да, добавляется и так, и так. Вот у snb можно посмотреть (п.п. 5.2, 5.3)
просто потом проверочку, типа if not isempty(a) then

edited:
... или проверку "до того", типа if exists...

Автор - nilem
Дата добавления - 17.06.2015 в 21:42
doober Дата: Среда, 17.06.2015, 21:43 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Андрей,словарь не правильно заполняешь и данные извлекаешь,вот и проблемы возникают.




Сообщение отредактировал doober - Среда, 17.06.2015, 21:43
 
Ответить
СообщениеАндрей,словарь не правильно заполняешь и данные извлекаешь,вот и проблемы возникают.

Автор - doober
Дата добавления - 17.06.2015 в 21:43
RAN Дата: Среда, 17.06.2015, 22:18 | Сообщение № 11
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Судя по всему, это не шибко декларируемый метод заполнения словаря...
Надо бы запомнить.
И намотать на хвост, что без проверки наличия, извлекать значения словаря нельзя.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеСудя по всему, это не шибко декларируемый метод заполнения словаря...
Надо бы запомнить.
И намотать на хвост, что без проверки наличия, извлекать значения словаря нельзя.

Автор - RAN
Дата добавления - 17.06.2015 в 22:18
KSV Дата: Четверг, 18.06.2015, 00:51 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
но он ни в коей мере не отвечает на вопрос ПОЧЕМУ

потому, что добавление несуществующего элемента происходит в свойстве Get Item, примерно так:
[vba]
Код
Public Property Get Item(KeyOrIndex)
     On Error GoTo ErrHandler
     Item = colItems(KeyOrIndex)
     Exit Property
ErrHandler:
     colItems.Add Empty, CStr(KeyOrIndex)
End Property
[/vba]
т.е. с "лишними" проверками при написании словаря не заморачивались... :)

Будет число в ячейке,получишь индекс а не ключ.

Не получит элемент по индексу (это не коллекция), получит еще один пустой элемент с числовым ключом (проверьте).
[vba]
Код
Sub Test()
     Dim v, dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
      
     v = dic("Key1")             ' будет добавлен элемент с ключом "Key1"
     dic("Key2") = 27            ' будет добавлен элемент с ключом "Key2"
     dic("Key3") = dic("Key4")   ' будyт добавлены элементы с ключами "Key4" и "Key3" (именно в такой последовательности)
     v = dic(1)                  ' будет добавлен 5-й элемент, с ключом 1
     v = dic("1")                ' будет добавлен 6-й элемент, с ключом "1"
End Sub
[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщение
но он ни в коей мере не отвечает на вопрос ПОЧЕМУ

потому, что добавление несуществующего элемента происходит в свойстве Get Item, примерно так:
[vba]
Код
Public Property Get Item(KeyOrIndex)
     On Error GoTo ErrHandler
     Item = colItems(KeyOrIndex)
     Exit Property
ErrHandler:
     colItems.Add Empty, CStr(KeyOrIndex)
End Property
[/vba]
т.е. с "лишними" проверками при написании словаря не заморачивались... :)

Будет число в ячейке,получишь индекс а не ключ.

Не получит элемент по индексу (это не коллекция), получит еще один пустой элемент с числовым ключом (проверьте).
[vba]
Код
Sub Test()
     Dim v, dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
      
     v = dic("Key1")             ' будет добавлен элемент с ключом "Key1"
     dic("Key2") = 27            ' будет добавлен элемент с ключом "Key2"
     dic("Key3") = dic("Key4")   ' будyт добавлены элементы с ключами "Key4" и "Key3" (именно в такой последовательности)
     v = dic(1)                  ' будет добавлен 5-й элемент, с ключом 1
     v = dic("1")                ' будет добавлен 6-й элемент, с ключом "1"
End Sub
[/vba]

Автор - KSV
Дата добавления - 18.06.2015 в 00:51
doober Дата: Четверг, 18.06.2015, 14:29 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Согласен,заблуждался по поводу индексов.


 
Ответить
СообщениеСогласен,заблуждался по поводу индексов.

Автор - doober
Дата добавления - 18.06.2015 в 14:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Словарь. Добавление (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!