Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: dandyd
Дата сообщения: 19.11.2011 11:43
AndVGri

Спасибо. Принцип понял, все получается. Конвертирую из VBS дальше.
В принципе, кроме этих Events все практически один к одному.
Есть нюансы синтаксиса. Допустим VBScript
Код: If a=b Then: a=1: Else b=2: End If
Автор: Niiks
Дата сообщения: 19.11.2011 14:46

Цитата:
Niiks
Не работает что? Поконкретнее: не закрашивает, не выполняется, выдаёт ошибку?...

AndVGri, не работает, значит ничего не меняется.
Т.е. что есть макрос, что его нет - - ноль эмоций....
Никаких сообщенй не выбрасыватся.
Excel 2003.

Цитата:
...По Вашему примеру всё работало (убирал заливку со строк начиная с 3, ниже таблицы A1:E2)

Не могли бы выложить эту рабочую версию файла на rghost.ru

Может быть я не смог правильно объяснить условие?
Пробую еще раз:
Есть в таблице А1:Е2 закрашенные цифры.
Надо, чтобы после выполнения макроса, все ячейки с цифрами в книге окрасились бы соответственно заданным цветам ячеек таблицы A1:E2 (цвета таблицы могут быть изменены пользователем в любой момент).

Скажем, поменял пользователь в таблице цвет восьмерки с желтого на зелёный - все восьмёрки в книге (которые ранее были закрашены желтым) - перекрасились моментально в зелёный. И т.к. далее.


Автор: lorents
Дата сообщения: 20.11.2011 08:58
AndVGri
не выходит, тоже самое, если ячейка повторная то он выделяет ее желтым цветом, и не зависимо от цвета ячейки.
Автор: AndVGri
Дата сообщения: 21.11.2011 00:54
Niiks
http://rghost.ru/31356641
P.S. Не забудьте установить безопасность макросов в средний уровень и ответить разрешить выполнение макросов при открытии книги
JekG
В любой ячейке набираете =PreviousMonth() не забудьте для этой ячейки установить формат даты.
lorents
Скорее всего работаете не в 2003, тогда проверяйте
If x.Interior.Color = 16777215
Желательно эту константу определить в ячейке, которую считаете прозрачной, в Immediate выполнив
?ActiveCell.Interior.Color
Автор: SAS888
Дата сообщения: 21.11.2011 04:59
Niiks, AndVGri
Хочу отметить (добавить), что если речь идет о ячейках, требующих окрашивания, которые не содержат формул, то все можно сделать существенно проще:

Код: Sub ReColor()
With Application
.FindFormat.Clear: .ReplaceFormat.Clear: .ScreenUpdating = False
For Each x In [A1:E2]
.ReplaceFormat.Interior.ColorIndex = x.Interior.ColorIndex
ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants).Replace x, x, xlWhole, , , , , True
Next
.ScreenUpdating = True
End With
End Sub
Автор: lorents
Дата сообщения: 21.11.2011 06:46
AndVGri

Цитата:
Желательно эту константу определить в ячейке, которую считаете прозрачной, в Immediate выполнив
?ActiveCell.Interior.Color

можно поподробнее, как это сделать?

не подскажите, как можно сделать следующее:
допустим я закрасил ячейку B1, как можно закрасить тем же цветом ячейки от C1 до F1 автоматически. Т.е. суть в том, если я закрасил ячейку в столбце B, то по горизонтали заращиваются остальные ячейки в столбцах от C до F.
Автор: AndVGri
Дата сообщения: 21.11.2011 07:24
lorents

Цитата:
можно поподробнее, как это сделать?

В редакторе VBA меню View/Immediate window. В низу окна редактора VBA появится Immediate. Вводите и нажимаете [Enter]

Цитата:
то по горизонтали заращиваются остальные ячейки в столбцах от C до F

А не подскажете за какое событие зацепится, чтобы определить факт окрашивания?
Автор: dandyd
Дата сообщения: 21.11.2011 07:38
AndVGri
PreviousMonth() я бы сделал так:
PreviousMonth = DateSerial(Year(Now - Day(Now)), Month(Now - Day(Now)), 1)
Автор: lorents
Дата сообщения: 21.11.2011 07:39
AndVGri

Цитата:
В редакторе VBA меню View/Immediate window. В низу окна редактора VBA появится Immediate. Вводите и нажимаете [Enter]

сделал, получил 16777215

Цитата:
А не подскажете за какое событие зацепится, чтобы определить факт окрашивания?

как только я окрасил ячейку с столбце B
Автор: AndVGri
Дата сообщения: 21.11.2011 07:45
dandyd
Спасибо
Автор: dandyd
Дата сообщения: 21.11.2011 07:53
AndVGri
Это Вам за Events спасибо, научили.
Автор: JekG
Дата сообщения: 21.11.2011 13:46
Непонятно почему у меня эксель на все попытки вместо даты выдает #ИМЯ? (неверное имя)

Ни макросом

Код: Range("B2").Select
Selection.NumberFormat = "m/d/yyyy"
ActiveCell.FormulaR1C1 ="=PreviousMonth()"
Автор: ZlydenGL
Дата сообщения: 21.11.2011 14:41
Пардон, по-понедельничному оттормозился, мысли не в тему вынес.
Автор: AndVGri
Дата сообщения: 21.11.2011 15:01
JekG
PreviousMonth - функция у Вас находится в проекте VBA той же книги, что и приведённый Вами код? Если нет, то возможно потребуется корректировка. Посмотрите как будет выглядеть на рабочем листе в другой книге, если использовать мастер функций (находится в группе пользовательские). Полученный синтаксис и вставляйте в FormulaR1C1
Автор: JekG
Дата сообщения: 21.11.2011 15:33
У меня офис 2003 русский. В мастере нет таких функций как пользовательские
Автор: aidomars
Дата сообщения: 21.11.2011 16:12
JekG
На то она и пользовательская, что создается пользователем. Ищите в книге модуль, где создана функция PreviousMonth. Может и в другой книге быть.
Автор: AndVGri
Дата сообщения: 22.11.2011 00:52
JekG
Я конечно извиняюсь - косноязычно написал, но когда Вы нажимаете = в ячейке рабочего листа, то слева от строки формул в раскрывающемся списке можно выбрать "другие функции", в диалоговом окне "мастер функций" есть раскрывающийся список "категория" там выбираете "определённые пользователем" - там и отображаются функции (формулы), которые написаны в VBA.
И к сути. Для функции, определённой в VBA проекте другой книги формула выглядит
='d:\path\MyFunctions.xls'!PreviousMonth()
для функции в VBA проекте этой же книги формула может быть сокращена до:
=PreviousMonth()
P. S. Что бы не было проблем (того же ИМЯ? при закрытой книге с функциями) желательно сохранить книгу с функциями в VBA как надстройку (xla) и подключить через Сервис/Надстройки
Автор: psiho
Дата сообщения: 22.11.2011 08:08

Цитата:
Непонятно почему у меня эксель на все попытки вместо даты выдает #ИМЯ? (неверное имя)


Вместо "Selection.NumberFormat = "m/d/yyyy"" должно быть Selection.NumberFormat = "mm/dd/yyyy"



Автор: JekG
Дата сообщения: 22.11.2011 17:07
AndVGri
Не могли бы вы где-то выложить свой файлик с сохраненной в нем этой функцией. Не выходит у меня чето. Думал тут проще простого все ан нет, а это только первая часть задумки...
Автор: AndVGri
Дата сообщения: 23.11.2011 01:07
JekG
http://rghost.ru/31634761
Автор: JekG
Дата сообщения: 23.11.2011 17:07
AndVGri
Огромное спасибо. Так сработало все на ура.
Еще вопрос.
Как задать Range диапазону ячеек начиная скажем с A1 и заканчивая A1+x ячеек вправо где х - число лежащее в ячейке B2?
Автор: AndVGri
Дата сообщения: 24.11.2011 00:36
JekG

Код:
Dim pRange As Excel.Range
Set pRange = Range("A1").Resize(1, Range("B2").Value + 1)
Автор: NiNo52RUS
Дата сообщения: 28.11.2011 20:20
Ребят помогите плиз,
проверить является ли введенное в строку число шестнадцатиричным
Автор: AndVGri
Дата сообщения: 29.11.2011 01:09
NiNo52RUS
Несколько длинновато, через regular expression было бы поизящнее, но не соображу. Для нотации Си "0x1234567890abcdef"

Код:
Option Compare Text
Public Function IsHexC(ByVal this As String) As Boolean
If InStr(this, "0x") = 1 Then
If Mid$(this, 3) Like "*[!0-9a-f]*" Then
IsHexC = False
Else
IsHexC = True
End If
Else
IsHexC = False
End If
End Function
Автор: JekG
Дата сообщения: 07.12.2011 20:02
Подскажите пожалуйста в таком вопросе. Есть столбец с данными. В последней строке этого столбца есть ячейка "Итого : 2345" (без кавычек но с пробелами.) Мне для дальнейшей работы нужно получить просто число без "Итого:" Данный код вроде как справляется с задачей но есть один ньюанс: при увеличении или уменьшении разряда числа, количество пробелов после двоеточия тоже меняется и тогда поиск не срабатывает. Как это можно обойти?


Код:
Selection.Cells.Replace What:="Итого : ", Replacement:="", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Автор: aidomars
Дата сообщения: 07.12.2011 20:55
JekG

Код: y = Split(ActiveCell)
For n = 0 To UBound(y)
MsgBox y(n)
Next
Автор: JekG
Дата сообщения: 07.12.2011 22:25
aidomars
И как этим пользоваться в моем случае? Побить на слова ячейку можно многими способами, а как взять из нее только последнее слово?

Автор: AndVGri
Дата сообщения: 08.12.2011 04:15
JekG
Лучше так

Код:
Public Function GetValue(ByVal fromText As String) As Double
Const findChar As String = " "
GetValue = CDbl(Mid$(fromText, InStrRev(fromText, findChar) + 1))
End Function
Автор: aidomars
Дата сообщения: 08.12.2011 07:37
JekG, после сплита сравнивай данные на текст/число. А если последнее слово надо, то
msgbox y(UBound(y)).
Автор: indapublic
Дата сообщения: 08.12.2011 10:27
Написал скрипт, который в цикле удаляет строки. Проблема в том, что строки, в которых есть объединенные ячейки не удаляются. можно ли что-то сделать в этой ситуации?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.