Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Сравнение значений в ячейках и выделение цветом
 
Просто не догадался, что так можно формулы писать.
Большое спасибо, Сергей.
Тему можно закрывать
Сравнение значений в ячейках и выделение цветом
 
Есть набор периодических данных. Возможно ли через условное форматирование сравнивать значение из ячейки B5 с значением из ячейки B2, затем значение из ячейки B8 с значением из ячейки B5 и т.д. Или надо думать что-то другое? Если ячейки идут друг за другом, то проблем с применением УФ никаких, а вот для такого случая как-то беда с мыслями.
Пример как это должно выглядеть прилагается
Копирование данных ячеек из другой книги
 
А через .Copy не пробовали?
Ошибка при попытке вызвать элемент массива через цикл
 
Цитата
Михаил С. пишет:
Потому что лист - двумерная структура, каждая ячейка имеет №№ строки и столбца.
Массив  Arr(1 to 10, 1 to 1)  - это 10 ячеек из столбца, а  Arr(1 to 1, 1 to 10)  - из строки.
Одномерный массив  Arr(1 to 10)  считается строкой (но не наоборот).

но я же объявляю массив как одномерный.  Раз одномерный массив это строка, то тогда при записи вертикального диапазона в массив должна вылетать ошибка? Или записываться только первый элемент, а остальное нет. VBA самостоятельно его переопределяет как двумерный? Короче сплошные непонятки
Ошибка при попытке вызвать элемент массива через цикл
 
Запросто может быть, что половина кода лишняя, т.к. я только учусь. К сожалению у меня нет возможности применить макрос на 2003 Экселе.
Если есть возможность указать на возможные ошибки или лишние строки без запуска, то буду благодарен. Если нет, то ничего страшного.
Изменено: Алексей - 12.02.2013 18:48:26
Ошибка при попытке вызвать элемент массива через цикл
 
Hugo, спасибо за совет.
Файл в примере. Код конечно очень сырой, т.к. только учусь
Ошибка при попытке вызвать элемент массива через цикл
 
[QUOTE]Михаил С. пишет: ошибка будет здесь[QUOTE]
Она здесь и выскакивает :-)

А почему массивы взятые с листа всегда двумерные? особенность VBA? Или это фишка Экселя?
Проблема большого размера макроса
 
Приведенный макрос будет работать не далее 225 листа

Do While j1 < 225

Если вам надо задавать номер последнего обрабтываемого листа, то его можно например вводить через Inputbox, тогда код чуть изменится

Dim j1, s1, s2, List
j1 = 0
List=Inputbox ("Введите номер листа")
Do While j1 < List
j1 = j1 + 1
'
'параметрами могут быть лист и имя файла
'имена файлов можно пллучать и командой dir
'
s1 = "'1 год.xls'!Лист" & Trim(j1) & ".Protect_for_User_Non_for_VBA"
s2 = "'1 год.xls'!Лист" & Trim(j1) & ".Get_Value_From_Close_Book"
Application.Run s1
Application.Run s2
Loop
End Sub

Это самый примитивный вариант. Без всяких проверок на корректность введенного числа и т.п.
Изменено: Алексей - 11.02.2013 17:53:23
Ошибка при попытке вызвать элемент массива через цикл
 
Всем здравствуйте!
Вопрос такого плана почему в приведенном ниже коде вылетает ошибка "Subscript out of range"?
Код
Public Sub UnikArt2()
 Dim IskArt, i As Long, j As Long, ArrayCount As Long
 Dim Addr, rRng(), rRng2()
 Dim Doc() As String
 ReDim rRng(1 To Range("data[Artikul]" ;) .Count)
 ReDim rRng2(1 To Range("data[Doc]" ;) .Count)
 rRng = Worksheets("Data" ;) .Range("data[Artikul]" ;) .Value
 rRng2 = Worksheets("Data" ;) .Range("data[Doc]" ;) .Value
 ReDim Preserve Doc(1 To ArrayCount)
 If Err Then Exit Sub
 With CreateObject("Scripting.Dictionary" ;) 
 .CompareMode = vbTextCompare
 For Each iDoc In Doc ' массив Doc определяется и заполняется раньше, с ним проблем нет
 For j = 1 To UBound(rRng2)
 If rRng2(j) = iDoc And Trim(rRng2(j)) <> "" And _
 Trim(rRng(j)) <> IskArt Then
 .Item(Trim(rRng(j))) = .Item(Trim(rRng(j))) + 1
 End If
 Next j
 Next iDoc
 End With
End Sub

Массив rRng и rRng2 равны по кол-ву элементов. Если заменить rRng(j) и rRng2(j) на переменные такого вида rRng(j, 1) и rRng2(j, 1) то ошибка пропадает и программа нормально все считает.
Если ставить прерывания и смотреть массив, то Watch показывает каждый элемент массива rRng и rRng2 в следующем виде:

rRng(1)----> rRng(1,1)=74744 (стрелочка означает "+", который горит рядом с rRng(1) и если на него нажать то отобразится rRng(1,1)

Как я понимаю, rRng(j) и rRng(j,1) это различные виды записи одномерного массива.
Подскажите в чем я ошибаюсь
Создание массива в макросе
 
Цитата
LightZ пишет:
Ознакомьтесь с вложением, хорошо написано

Спасибо. Именно из этого файла я и взял эти строчки:

oDict.Item(<Key>) = "NewValue"
Если КЛЮЧ "Key" в словаре есть, то ассоциированное с ним ЗНАЧЕНИЕ заменяется на заданное "NewValue"
Если КЛЮЧ "Key" в словаре отсутствует, то создается новая ЗАПИСЬ с КЛЮЧОМ "Key" и ЗНАЧЕНИЕМ "NewValue"

Просто не совсем понятна была реализация в макросе Hugo. Поэтому и столько вопросов. Но с вашей помощью все стало понятно.
Создание массива в макросе
 
Цитата
Hugo пишет:
Вот это и есть процесс помещения значения массива в словарь: oDict.Item(a(i, 1))="любое значение"
Это альтернативный способ, в хелпе и учебниках делают иначе, но так короче:)
Словами можно описать так - в словаре у этого значения массива будет итем такой-то.
Что подразумевает, что мы это значение с таким-то итемом туда заносим.
Есть один момент - если значение повторится, то его итем перезапишется на новый. Это в зависимости от задачи нужно учитывать.
Не совсем понял вашу мысль :-( Но после прочтения одного файлика, в котором написано вот это:

При задании нового значения этого свойства:
oDict.Item(<Key>) = "NewValue"
Если КЛЮЧ "Key" в словаре есть, то ассоциированное с ним ЗНАЧЕНИЕ заменяется на заданное "NewValue"
Если КЛЮЧ "Key" в словаре отсутствует, то создается новая ЗАПИСЬ с КЛЮЧОМ "Key"  и ЗНАЧЕНИЕМ "NewValue"

Многое стало на места. Т.е. вы значения массива используете как ключ. А я почему-то думал, что значение массива это просто значение, но для него должен быть какой-то ключ. Короче это все от недостатка знаний :-(
Бум будем дальше курить форум, Уокенбаха и иже с ними

Большое спасибо, стало чуть понятней
Создание массива в макросе
 
Hugo Извиняюсь за назойливость, но можно поподробнее.

Вот вы пишите комментарий
'перебираем в цикле массив (первый столбец),
       'помещаем в словарь анализируемые значения и к каждому
       'его позицию в массиве (номер строки массива)
Ну понятно, что часть комента обрезалась, но это не страшно, т.к. смысл донесен. Но непонятна реализациявот этого момента: "помещаем в словарь анализируемые значения".
Вот это и есть процесс помещения значения массива в словарь: oDict.Item(a(i, 1))?

Ну а тут похоже просто ошибка:
If oDict.exists([a25].Value) Then MsgBox oDict.Item([a2].Value)
Вместо [a25] должно быть [a2], правильно? Или мы берем значение из ячейки А25 проверяем его наличие в словаре и если оно там есть, то тогда печатаем значение А2?
После открытия файла отправлять уведомление на почту
 
Ну поставь пароль на вход в систему и на БИОС (на БИОС чтобы нельзя было снять запрет на загрузку с флешек, сидирома и т.п.) и проблема отпадет сама собой.
Создание массива в макросе
 
А эта строка MsgBox oDict.Item([a2].Value) что будет выводить на экран?

И еще вопросик
oDict.Item(a(i, 1)) = i
Правильно ли я понимаю, что в этой строке мы i-тому элементу словаря присваиваем i-тое значение массива? Тогда запись какая-то странная
Изменено: korsar75 - 08.02.2013 05:07:32
[ Закрыто] Ошибка run-time error '1004' в коде
 
Большое спасибо. Будем дальше грызть гранит науки
[ Закрыто] Ошибка run-time error '1004' в коде
 
А можно пропустить эти шаги:
Код
Worksheets("Raschet".Activate 
 Worksheets("Raschet".Range("A1".Activate 
 Worksheets("Raschet".Range(ActiveCell, ActiveCell.End(xlDown)).Select 
 Set ArtikulRange = Selection
Т.е. можно ли выделить и одновременно удалить дубликаты. Или не выделять, а задать диапазон и удалить из него дубликаты. Причем известно только место начала диапазона, а сколько в нем ячеек неизвестно, но известно точно, что в нем нет пустых ячеек. Как вариант можно через именованный диапазон, что, в принципе, я и делал в макросе. Так же именованный диапазон можно задать на листе заранее и обращаться уже к нему из макроса. Или циклом перебором определить границы диапазона. Но циклом одназначно долго, т.к. строк будет под сотню тысяч.
И еще приходит на ум такой вариант (это в плане обучения) что через Count определить кол-во ячеек и потом задать адрес как А1:А-count+1 (надеюсь понятно написал). А еще есть Used, но я пока не понял как его применять :-(
[ Закрыто] Ошибка run-time error '1004' в коде
 
Большое спасибо. Оба метода работают. Если не сложно, то в двух словах в чем моя ошибка или пошлите куда-нибудь, где про это написано :-) (но лучше с конкрентным указанием книжки или статьи)
Изменено: korsar75 - 28.01.2013 18:07:11
[ Закрыто] Ошибка run-time error '1004' в коде
 
Добрый день
Подскажите почему вылетает такая ошибка
Код
Run-time error '1004'
Application-defined or object-defined error

Вот код (ошибка возникает в строке подсвеченной красным):

Public Sub PodschetProdaz()
 Worksheets("Raschet").Activate
 Worksheets("Raschet").Range("A1").Activate
 Worksheets("Raschet").Range(ActiveCell, ActiveCell.End(xlDown)).Select
 Set ArtikulRange = Selection
 [COLOR=#FF0000]Worksheets("Raschet").Range(ArtikulRange).RemoveDuplicates Columns:=1, Header:=xlNo[/COLOR]
End Sub

Так же файл примера
Изменено: korsar75 - 11.04.2014 17:25:33
Автомасштабирование таблицы
 
Добрый день  
 
файл примера во вложении. В формате 2010 офиса, т.к. в 2003 "умных" таблиц вроде как нема  
Необходимо чтобы в таблице "Itog" кол-во строк автоматически регулировалось в зависимости от кол-ва НЕ ПУСТЫХ строк в столбце "Unikart2" таблицы "Data", расположенной на Листе2. Можно ли такое сделать?
Автомасштабирование таблицы
 
Добрый день!  
 
Есть 2 "умных таблицы". Возможно ли сделать так, чтобы кол-во строк в первой таблице автоматически подстраивалось под число непустых строк в одном из столбцов во второй таблице? Если да, то возможно ли это сделать формулами или надо писать макросы?
Страницы: 1
Loading...