Кстати, вполне может возникнуть и тут вопрос - что к чему приравняется Так вот, всегда левое приравнивается к правому (т.е. a примет значение b), и в общем это логичнее, чем приравнивать наоборот
Кстати, вполне может возникнуть и тут вопрос - что к чему приравняется Так вот, всегда левое приравнивается к правому (т.е. a примет значение b), и в общем это логичнее, чем приравнивать наоборот Hugo
Постараюсь объяснить что я хочу на примере формулы, которую знаю: Пример: =СЧЕТЕСЛИ(А1:А10;"яблоки*") Как можно объяснить эту запись? 1. формула считает количество ячеек в заданном диапазоне, содержащих в начале текста слово "яблоки" 2. счетесли считает количество ячеек по заданному условию в заданном диапазоне. То есть, в данном примере, в ячейках с А1 по А10 формула сосчитает в скольких из этих ячеек есть слово "яблоко". Причем символ "*" в конце слова яблоки в формуле дает команду на подсчет ячеек, содержащих это слово в начале текста, не обращая внимание на то что будет после (яблоки красные, яблоки зеленые...). Если запись будет иметь вид "*яблоки*", то формула сосчитает все ячейки, содержащие запись "яблоки" не зависимо от положения этого слова в предложении (спелые красные яблоки, яблоки зеленые, испорченные красные яблоки....). При записи "яблоко" считаются ячейки, содержащие только это слово, т.е. если в ячейке кроме этого слова есть еще хоть пробел, ячейка считаться не будет.
Вот два способа объяснить эту формулу. Оба правильных. Но если первое объяснение начинающему пользователю не даст ничего (это есть и в справке по формулам), то второе будет понятно даже ребенку. Вот тонкость:
Quote (Hugo)
Кстати, вполне может возникнуть и тут вопрос - что к чему приравняется smile Так вот, всегда левое приравнивается к правому (т.е. a примет значение b), и в общем это логичнее, чем приравнивать наоборот smile
Так что вопросов еще масса, тем более, что VBA на английском
Quote (Hugo)
Второй блок надо бы поставить первым - если MsgBox "Не всё заполнено!", то незачем массив формировать.
Постараюсь объяснить что я хочу на примере формулы, которую знаю: Пример: =СЧЕТЕСЛИ(А1:А10;"яблоки*") Как можно объяснить эту запись? 1. формула считает количество ячеек в заданном диапазоне, содержащих в начале текста слово "яблоки" 2. счетесли считает количество ячеек по заданному условию в заданном диапазоне. То есть, в данном примере, в ячейках с А1 по А10 формула сосчитает в скольких из этих ячеек есть слово "яблоко". Причем символ "*" в конце слова яблоки в формуле дает команду на подсчет ячеек, содержащих это слово в начале текста, не обращая внимание на то что будет после (яблоки красные, яблоки зеленые...). Если запись будет иметь вид "*яблоки*", то формула сосчитает все ячейки, содержащие запись "яблоки" не зависимо от положения этого слова в предложении (спелые красные яблоки, яблоки зеленые, испорченные красные яблоки....). При записи "яблоко" считаются ячейки, содержащие только это слово, т.е. если в ячейке кроме этого слова есть еще хоть пробел, ячейка считаться не будет.
Вот два способа объяснить эту формулу. Оба правильных. Но если первое объяснение начинающему пользователю не даст ничего (это есть и в справке по формулам), то второе будет понятно даже ребенку. Вот тонкость:
Quote (Hugo)
Кстати, вполне может возникнуть и тут вопрос - что к чему приравняется smile Так вот, всегда левое приравнивается к правому (т.е. a примет значение b), и в общем это логичнее, чем приравнивать наоборот smile
Так что вопросов еще масса, тем более, что VBA на английском
Quote (Hugo)
Второй блок надо бы поставить первым - если MsgBox "Не всё заполнено!", то незачем массив формировать.
К тому, что для меня объяснение принципа работы этого макроса в виде
Quote (RAN)
В макросе 5 блоков with. 1 блок - собираем данные с листа2 в массив "a". 2 блок - на листе1 проверяем, все-ли заполнено, и если да - формируем запись "temp" 3 блок - создаем словарь с записями из данных массива "a" и проверяем, нет ли в нем записи "temp". Если такой строки нет 4 блок - заносим данные из столбца "В" листа1 в массив "а" 5 блок - выгружаем данные из массива "а" в пустую строку на листе2, туда-же добавляем формулы Напоследок Beep!
это объяснение по алгоритму первого способа в предыдущем сообщении, а я бы хотел по второму.
Quote (Serge_007)
Ну и к чему это?
К тому, что для меня объяснение принципа работы этого макроса в виде
Quote (RAN)
В макросе 5 блоков with. 1 блок - собираем данные с листа2 в массив "a". 2 блок - на листе1 проверяем, все-ли заполнено, и если да - формируем запись "temp" 3 блок - создаем словарь с записями из данных массива "a" и проверяем, нет ли в нем записи "temp". Если такой строки нет 4 блок - заносим данные из столбца "В" листа1 в массив "а" 5 блок - выгружаем данные из массива "а" в пустую строку на листе2, туда-же добавляем формулы Напоследок Beep!
это объяснение по алгоритму первого способа в предыдущем сообщении, а я бы хотел по второму.light26
Мне кажется, что пример не удачен, т.к. тут всё понятно, если включить логику: "яблоки*" = содержащих в начале текста слово "яблоки" следовательно "*яблоки" = содержащих в конце текста слово "яблоки" и "*яблоки*" = содержащих в тексте слово "яблоки" И даже не обязательно уже знать, что звёздочка означает "любое количество любых символов"...
Мне кажется, что пример не удачен, т.к. тут всё понятно, если включить логику: "яблоки*" = содержащих в начале текста слово "яблоки" следовательно "*яблоки" = содержащих в конце текста слово "яблоки" и "*яблоки*" = содержащих в тексте слово "яблоки" И даже не обязательно уже знать, что звёздочка означает "любое количество любых символов"...Hugo
Hugo, Вы несколько невнимательны. я привел не саму формулу в качестве примера, а ее, как средство, что даже такую простую формулу можно разъяснить по-разному: общими фразами либо подробно, разложив по полочкам, с указанием дополнительных возможностей
Hugo, Вы несколько невнимательны. я привел не саму формулу в качестве примера, а ее, как средство, что даже такую простую формулу можно разъяснить по-разному: общими фразами либо подробно, разложив по полочкам, с указанием дополнительных возможностейlight26
Hugo, скодько лет Вы знаете excel? 10? Вот представьте себе, что 11 лет назад Вам объяснили по первому способу принцип действия этой формулы. Сомневаюсь, что у Вас не возникли бы дополнительные вопросы. смысл этого примера в том, что я хотел бы, чтобы мне подробно объяснили как работает макрос, предложенный в этой теме. чтобы в последствии я мог сам применять его. Так понятней?
Hugo, скодько лет Вы знаете excel? 10? Вот представьте себе, что 11 лет назад Вам объяснили по первому способу принцип действия этой формулы. Сомневаюсь, что у Вас не возникли бы дополнительные вопросы. смысл этого примера в том, что я хотел бы, чтобы мне подробно объяснили как работает макрос, предложенный в этой теме. чтобы в последствии я мог сам применять его. Так понятней?light26
Sub zanesti() 'объявление переменных Dim a, i As Long, x As Long, temp
'по первому листу (т.е. по листу с кодовым именем Лист1) With Лист1 'считаем заполненные ячейки, если мало - то сообщение и выход If Application.CountA(.Range("b1:b6")) <> 6 Then MsgBox "Не всё заполнено!", vbCritical: End 'заносим в временную переменную значения ячеек - формируем слитную строку temp = .[b1] & .[b2] & .[b3] & .[b4] & .[b5] & .[b6] End With
'по второму листу (т.е. по листу с кодовым именем Лист2) With Лист2 'берём в массив значения с A2 по Gпоследняя_заполненная_ячейка_в_первой_колонке+1 a = .Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 7)).Value End With
'работаем с словарём With CreateObject("Scripting.Dictionary") 'заносим в словарь уже занесённые в список данные из массива For i = 1 To UBound(a) .Item(a(i, 2) & a(i, 3) & a(i, 4) & a(i, 5) & a(i, 6) & a(i, 7)) = CStr(1) Next 'проверяем по словарю нового клиента (из переменной temp) 'если такой уже есть (не только ФИО, но и должность и даты), то сообщение и выход If .exists(temp) Then MsgBox "Такой клиент уже есть!", vbCritical: End End With
'в переменную берём верхний индекс массива (где пустые значения) x = UBound(a)
'по первому листу (т.е. по листу с кодовым именем Лист1) 'увеличиваем счётчик и дополняем массив данными с листа With Лист1 If x = 1 Then a(x, 1) = 1 Else a(x, 1) = a(x - 1, 1) + 1 a(x, 2) = .[b1] a(x, 3) = .[b2] a(x, 4) = .[b3] a(x, 5) = .[b4] a(x, 6) = .[b5] a(x, 7) = .[b6] End With
'по второму листу (т.е. по листу с кодовым именем Лист2) 'выгружаем назад дополненный массив (в то же место, откуда его брали) With Лист2 .Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 7)).Value = a End With 'это просто биип <img src="http://s5.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" /> Beep End Sub
[/vba]
Хорошо. Постарался объяснить. [vba]
Код
Option Explicit
Sub zanesti() 'объявление переменных Dim a, i As Long, x As Long, temp
'по первому листу (т.е. по листу с кодовым именем Лист1) With Лист1 'считаем заполненные ячейки, если мало - то сообщение и выход If Application.CountA(.Range("b1:b6")) <> 6 Then MsgBox "Не всё заполнено!", vbCritical: End 'заносим в временную переменную значения ячеек - формируем слитную строку temp = .[b1] & .[b2] & .[b3] & .[b4] & .[b5] & .[b6] End With
'по второму листу (т.е. по листу с кодовым именем Лист2) With Лист2 'берём в массив значения с A2 по Gпоследняя_заполненная_ячейка_в_первой_колонке+1 a = .Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 7)).Value End With
'работаем с словарём With CreateObject("Scripting.Dictionary") 'заносим в словарь уже занесённые в список данные из массива For i = 1 To UBound(a) .Item(a(i, 2) & a(i, 3) & a(i, 4) & a(i, 5) & a(i, 6) & a(i, 7)) = CStr(1) Next 'проверяем по словарю нового клиента (из переменной temp) 'если такой уже есть (не только ФИО, но и должность и даты), то сообщение и выход If .exists(temp) Then MsgBox "Такой клиент уже есть!", vbCritical: End End With
'в переменную берём верхний индекс массива (где пустые значения) x = UBound(a)
'по первому листу (т.е. по листу с кодовым именем Лист1) 'увеличиваем счётчик и дополняем массив данными с листа With Лист1 If x = 1 Then a(x, 1) = 1 Else a(x, 1) = a(x - 1, 1) + 1 a(x, 2) = .[b1] a(x, 3) = .[b2] a(x, 4) = .[b3] a(x, 5) = .[b4] a(x, 6) = .[b5] a(x, 7) = .[b6] End With
'по второму листу (т.е. по листу с кодовым именем Лист2) 'выгружаем назад дополненный массив (в то же место, откуда его брали) With Лист2 .Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 7)).Value = a End With 'это просто биип <img src="http://s5.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" /> Beep End Sub
ага ))) не, спасибо, конечно, и на том. я обещаю постараться разобраться, но..что такое переменная, что такое массив, что такое словарь?.... Да, вот такой я бестолковый((( Кстати, можно у Вас, Hugo, попросить номер icq? Почта моя light26@ya.ru
Quote (Hugo)
В каждую строку что-ли добавлять коммент...
ага ))) не, спасибо, конечно, и на том. я обещаю постараться разобраться, но..что такое переменная, что такое массив, что такое словарь?.... Да, вот такой я бестолковый((( Кстати, можно у Вас, Hugo, попросить номер icq? Почта моя light26@ya.rulight26
Нуу, батенька, Вам азы изучить нужно. Например http://www.firststeps.ru/ - там слева VBA by Step. Хотя это тоже не совсем "первые шаги" - что такое переменная там уже нет объяснения, только про типы переменных. Я тоже не объясню - ну не учитель я... Разве что так - переменная - это то, чему можно присвоить что-то массив - упорядоченная совокупность значений (у каждого значения есть "адрес") словарь - собрание уникальных строк
А аськи нет - а как-то скайпом обхожусь. Так что пишите на почту.
Нуу, батенька, Вам азы изучить нужно. Например http://www.firststeps.ru/ - там слева VBA by Step. Хотя это тоже не совсем "первые шаги" - что такое переменная там уже нет объяснения, только про типы переменных. Я тоже не объясню - ну не учитель я... Разве что так - переменная - это то, чему можно присвоить что-то массив - упорядоченная совокупность значений (у каждого значения есть "адрес") словарь - собрание уникальных строк
А аськи нет - а как-то скайпом обхожусь. Так что пишите на почту.Hugo