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

» Excel VBA

Автор: PavelO
Дата сообщения: 19.09.2006 22:06
Спасибо, Yuk, ты наверное не одну книгу перелопатил. Дай пожалуйста ссылку на книгу, в которой описаны подобные приемы, или намыль opa-pavel@yandex.ru. (как тебе будет удобнее вообщем). А то если написать здесь все вопросы, которые меня интерисуют на серваке места не останется )
Автор: SERGE_BLIZNUK
Дата сообщения: 19.09.2006 22:54
Xttx

Цитата:
1010 x 1348 1600 x 2002 630
x 1094 1348 x 1748 2050 x

Должно остаться следующее
1010 1094 1348 1600 1684 1936 630
1010 1094 1348 1600 1748 2002 630

а куда делось 2050 в предпоследней колонке (см.последнюю строку примера)?!

нет - извините меня за возможно поданную вам надежду, но я не пойму что и как вы хотите сделать - по какому признаку проставляются x (если это числа), по каким колонкам идёт свёртка...


Цитата:
Вторая строчка подходит по шаблону

что такое "шаблон" в данном случае и как он задаётся?

бр-р-р-р... Ума не приложу, кому и зачем нужно решение подобной задачи...
или я всё таки туплю и чего-то не понимаю...




Автор: Yuk
Дата сообщения: 19.09.2006 23:15
PavelO

Цитата:
Дай пожалуйста ссылку на книгу, в которой описаны подобные приемы

Ты не поверишь: хелп + гугл


Добавлено:
Xttx
Согласен, задача не из простых. Имеет ли значение текущий порядок строк или надо проверить все пары? Другими словами, тебе нужно наилучшее совпадение пар строк или совпадение ближайших строк, принимая во внимание их текущий порядок?
Автор: PavelO
Дата сообщения: 20.09.2006 01:28
Yuk, а если задачку посложнее (ну для меня она конечно и вовсе нерешимая):
Хотел вставить в мою форму сто image'ов (ну это не проблемма, а вот вставить рисунки), а эти рисунки храняться в одной папке и имена их 10048.jpg, 11123.jpg, 10156.jpg и т.д
Но вставить их нужно только определенное количество, а оно определяется списком, который находится на втором листе, но каждая ячейка имеет строку примерно такую:
"Рисунок 10048 весит 30Кб", "Рисунок 11123 весит 50Кб", "Рисунок 10156 весит 24Кб" и т.д. Как бы мне вставить только те рисунки из этой папки, упоминание о которых есть в списке на втором листе? Во как.
Автор: Yuk
Дата сообщения: 20.09.2006 08:26
PavelO
Вытащить имя файла рисунка можно с помощью простого кода:

Код: Sub test()
Dim arr As Variant
For i = 1 To 3
arr = Split(Cells(i, 1).Text, " ")
imgname = arr(1) & ".jpg"
Debug.Print imgname
Next i
End Sub
Автор: Xttx
Дата сообщения: 20.09.2006 09:51
SERGE_BLIZNUK
Прости пожалуйсто. Извиняюсь за ошибку, конечно из:
1010 x 1348 1600 x 1936 630
x 1094 1348 x 1684 1936 x
1010 x 1348 1600 x 2002 630
x 1094 1348 x 1748 2050 x

Должно получиться
1010 1094 1348 1600 1684 1936 630
1010 x 1348 1600 x 2002 630
x 1094 1348 x 1748 2050 x



Добавлено:
Yuk
Cовпадения ближайших строк будет достаточно.
Автор: Yuk
Дата сообщения: 21.09.2006 09:11
Xttx
Попробуй вот такой макрос:
[more]
Код: Option Explicit

Sub MergeLines()
Dim rng As Range
Dim nr As Long, nc As Long
Dim r As Long, c As Long
Dim r2 As Long, c2 As Long
Dim arr As Variant
Dim same As Boolean

Set rng = ActiveSheet.UsedRange
nr = rng.Rows.Count
nc = rng.Columns.Count
r2 = 1
For r = 1 To nr 'run through rows
arr = Range(rng.Rows(r), rng.Rows(r + 1)) '2 lines to array
For c = 1 To nc ' run through columns
'Replace x by value in another row
If arr(1, c) = "x" Then
arr(1, c) = arr(2, c)
ElseIf arr(2, c) = "x" Then
arr(2, c) = arr(1, c)
End If
'Compare rows
If arr(1, c) = arr(2, c) Then
same = True
Else
same = False
Exit For
End If
Next c
If same Then 'copy combined row to 2nd sheet
For c2 = 1 To nc
Sheets(2).Cells(r2, c2) = arr(1, c2)
Next c2
r = r + 1 'skip a row
Else 'copy original row (1st)
For c2 = 1 To nc
Sheets(2).Cells(r2, c2).Value = _
rng.Cells(r, c2)
Next c2
End If
r2 = r2 + 1
Next r
End Sub
Автор: AltM
Дата сообщения: 21.09.2006 18:22
Добрый день.

Подскажите, пожалуйста, непрофессионалу как организовать следующее:

При открытии файла хочется иметь возможность одновременно изменять параметры в ячейке и нажать на кнопку (в поле страницы), которая бы вызвала выполнение макроса (программки).
Кнопка должна всегда быть видна на данной странице
Я попробовал сделать следующее (на вкладке "Эта книга"):

Private Sub Workbook_Open()
Worksheets("Interface").Activate ' activating interface worksheet
UserForm1.Show
End Sub

При этом "кнопка" выводится на страницу при открытии книги, но альтернатива только одна - на кнопку нажать и вызвать макрос (ну UserForm еще можно "крестиком" закрыть). А вот получить возможность одновременно и ячейки редактировать и на кнопку нажимать я не знаю как.

Спрасибо заранее если кто поможет
Автор: Yuk
Дата сообщения: 21.09.2006 18:39
AltM
Нет проблем. Правый клик по панели с кнопками и выбрать Control Toolbox (или как там в русском экселе). Откроется панель с набором контролей как для создания формы. ВЫбирай кнопку и рисуй прямо на листе. Двойным кликом по новой кнопке попадешь в ее код.
Автор: AltM
Дата сообщения: 22.09.2006 09:27
Yuk, спасибо большое!

Как все просто...
Автор: Dr Eam
Дата сообщения: 22.09.2006 09:36
Я вот тут в сообщении http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=640#2 жаловался на проблему, так я нашёл её решение.
На случай, если у кого что-нибудь возникнет подобное, напишу решение.
Прописывание перед каждой ячейкой/диапазоном листа не помогает. Лучше это не делать, а прописывать его в With:


Цитата:
With Sheets("Накладная")
Range(Cells(25, 1), Cells(24 + rows, 2)).HorizontalAlignment = xlLeft


Всё работает без глюков.

Напомню, что у меня глюки появляются только при применении форматирования, если же просто вписывать данные в ячейки, то всё работает нормально.

Добавлено:
Или же всё дело в том, что я прописывал префиксно "Worksheet", а нужно просто "Sheet"?
_______________________________________

Добавлено:
А я могу одной строкой поставить внешнюю рамку диапазона?
В более других языках я бы написал что-то вроде
ля-ля.Borders(xlEdgeBottom | xlEdgeTop | xlEdgeLeft | xlEdgeRight).ля-ля
Пробовал здесь писать Or вместо символа | - не срабатывает.
Автор: Yuk
Дата сообщения: 22.09.2006 16:13
Dr Eam
Код не верный (если скопирован точно). Нет точки перед Cells. Посмотри хелп по With statement.
Этот код будет работать, но без учета With. Области будут использоваться из активного листа, а не из листа "Накладная". Пробовал сменить активный лист? Или твой лист активируется где-то в коде?
Автор: Dr Eam
Дата сообщения: 22.09.2006 16:20
Точки, действительно, нет. Странно, работает ведь...
Автор: Yuk
Дата сообщения: 22.09.2006 16:20

Цитата:
А я могу одной строкой поставить внешнюю рамку диапазона?
В более других языках я бы написал что-то вроде
ля-ля.Borders(xlEdgeBottom | xlEdgeTop | xlEdgeLeft | xlEdgeRight).ля-ля
Пробовал здесь писать Or вместо символа | - не срабатывает.

Borders - это коллекция (Collection) объектов Border. А xlEdgeBottom и т.д. всего навсего константы, означающие индекс объекта - целое число. | не сработает, здесь нет логических/битовых значений. Только по объектам.


Добавлено:

Цитата:
Или же всё дело в том, что я прописывал префиксно "Worksheet", а нужно просто "Sheet"?

Sheets и Worksheets отличаются только тем, что в Sheets включаются также листы с диаграммами. При доступе к листу через его имя разницы никакой разве что Sheets короче.
Автор: Troitsky
Дата сообщения: 22.09.2006 18:42
Dr Eam

Цитата:
А я могу одной строкой поставить внешнюю рамку диапазона?

ну, например, вот так
Код: Range("B3:H6").BorderAround xlContinuous, xlMedium, xlColorIndexAutomatic
Автор: sword12
Дата сообщения: 23.09.2006 01:17
Защита ячеек в Exel-документе(для начинающих в VBA)


Часто при написании небольших програмок для инженерных расчетов в Екселе (формулы в ячейках), встает проблема по защите содержания ячеек от случайных измененний.При этом стандартные способы Exsel по защите листа фактически сводят на ноль всю прелесть пользования своей "эксклюзивной программой"(возможно в лецензионном Ofis ситуация иначе).
Програмист я некудышный, но после долгих и нерегулярных изучений путанно-высокомерно-непонятной литературы по прграммированию сваял такой фрагмент:

В начале пишем в Екселе (например на Лист1) свою программу с расчетами, формулами, коментариями, ну и прочим оформлениями и прелестями.

Далее: Сервис - Макрос - Создать... Создаем допустим макрос под названием w2

Выпадает окно VBasic , где:

В модуле1 автоматически создается запись для макроса w2, если нет, то напишите сами (в смысле вписать w2)

Sub w2()

End Sub

Далее на Лист1 (например) пишем следующий фрагмент кода, где указываем ячейки в каких можно и необходимо вводить данные.В зависимости от ввода единичной ячейки или диапазона, используют соответственно знак , либо : и так далее, все остальные ячеки листа в дальнейшем будут недоступны для редактирования.
Пример:


Private Sub Worksheet_Change(ByVal Target As Range)
Range("B1:D1,B10:D10,B20:D20,С25").Select ' перечень ячеек для ввода
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("B1:D1,B10:D10,B20:D20,С25").Select ' перечень ячеек для ввода
End Sub



Все, далее запуск, сохранить и пользуйся.


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

p.s. неудобства - после ввода данных в одну ячейку приходится к следующей переходить снова с первой ячейке посредством кнопки Таб.Для возможных исправлений в ячейках с формулами документе снова войдите на VBasic и поставьте апостроф перед оператором строки с Range... вот так 'Range ..., после изменений все вернуть назад.

Все ... 2006
Автор: Yuk
Дата сообщения: 23.09.2006 04:34
Troitsky

sword12
Это твое произведение или скопировал откуда? Нет, мне просто интересно, кто-нибудь пробовал понять или воспроизвести сие?

Цитата:
возможно в лецензионном Ofis ситуация иначе

Если тебя действительно интересует данная проблема, можно сделать все нормально. Или цель была запостить что-нибудь?
Автор: sword12
Дата сообщения: 24.09.2006 01:04
Во! я оказался прав.
Да нет, этого вы нигде не найдете, по сути две взаимо-исключающие инструкции.
В свое время я через эту "защиту" ячеек с одновременной возможностью ввода данных изрядно покувыркался. Перечитал неодну книгу по этому VBA, ненашел, во всяком случае в тех чо читал.

А теперь без обиды, знаете, вот смотрю я в интернет, черт, да полно умного народу, но вот у меня на работе...., ну некого спросить, а коллектив то 650 человек, из них, 300 сидит у компов.

Конечно я уверен что способ есть, подскажи...



Добавлено:
With Worksheets(1) .EnableSelection = xlNoRestrictions - это оно?

Добавлено:
Все, подсказки не надо, уже нашел.

Мое вам уважение!!!
Автор: Dr Eam
Дата сообщения: 25.09.2006 11:05
Yuk
А стоит только поставить префиксные точки в With-блоке, как сразу начинаются всё те же рантайм-ошибки.
Автор: Xttx
Дата сообщения: 25.09.2006 11:30
Yuk
Спасибо тебе за хлопоты. Твой макрос не подошел. Но я таки справился просто беру первую строчку и сравниваю с остальными по ходу дела все "х" заменяя числами. Потом вторую строчку сравниваю со всем и т.д.
Автор: virginijus
Дата сообщения: 25.09.2006 14:56
AT29=переменная - буквы (а,б,в,г....), BF23:CF23=буквы (а,б,в,г....), BF25:CF25=значение ячеек BF23:CF23 (цифры)
=LOOKUP(AT29;BF23:CF23;BF25:CF25)

Прошу помочь с макросом так как =LOOKUP(AT29;BF23:CF23;BF25:CF25) не идет. т.е при написании в AT29 букву "а", не находит значение в векторе BF25:CF25. Функцию IF не могу использоват т.к. в BF23:CF23 много значении. Спасибо
Автор: Yuk
Дата сообщения: 25.09.2006 18:15
virginijus
Должно работать. Ищи у себя тараканов.
Проверь русские или английские буквы используются? Например, А русскую и английскую легко перепутать. Имей в виду, что для LOOKUP данные в BF23:CF23 должны быть отсортированы. Также если нет точного совпадения, возвращается ближайшее меньшее.
Можно также использовать функции HLOOKUP или INDEX/MATCH:
=HLOOKUP(AT29;BF23:CF25;3;FALSE)
=INDEX(BF25:CF25;MATCH(AT29;BF23:CF23;0))
Нужно найти только одно значение или заполнить таблицу? В последнем случае необходимо установить абсолютные ссылки.
Макрос написать не сложно, но я бы не делал это для данной задачи.
Автор: aleksej71
Дата сообщения: 25.09.2006 20:06
всем привет и прошу помощи
очень нужно было написать несколько макросов для заполнения документов (типовые бланки), долго рассказывать и проще показать. В общем при закрытии файла постоянно вылетает сообщение об ошибке и Excel перегружается. В чем проблема никак не найду. Может кто из Титанов глянул бы критически - я был бы безмерно благодарен. Весит это чудо около 900 кб. Если кто может помочь, отпишите на aleksej71@gmail.com, вышлю свое "творчество". Заранее спасибо огромное...
Автор: virginijus
Дата сообщения: 26.09.2006 08:10
To Yuk
Огромное СПАСИБО за ликбез, оказываетьса надо было отсортировать буквы.
Автор: Canibal
Дата сообщения: 26.09.2006 13:43
Народ помогите с проблемой.
Получилось так, что мне нужно выгрузить данные из 1С в Excel, в котором есть процедура проверки правильности заполнения ячеек (Worksheet_Change()) ну и соответственно при выгрузке, когда значению ячейки присваиваю "неправильное" значение он ругается и все время приходится жать ОК перед открытием книги, как можно программно отключить выполнение этой проверки пока я заполняю ячейки???

Спасибо
Автор: Yuk
Дата сообщения: 26.09.2006 14:24
Canibal
В любом файле в VBA редакторе создай новый модуль и скопируй туда:

Код: Sub EventsOff()
Application.EnableEvents = False
End Sub

Sub EventsOn()
Application.EnableEvents = True
End Sub
Автор: Canibal
Дата сообщения: 26.09.2006 14:37
Yuk

Огромное спасибо!! Два дня искал! Спасибо!
Автор: virginijus
Дата сообщения: 26.09.2006 14:54
Помогите с макросом, ситуация такая - необходимо, чтобы при появлении записи в ячеке А1 - "Субота", В2 - "Воскресение" , ячеики А2:A5, B2:B5 стали красными. Спасибо

Добавлено:
Простите, предидущем посту ошибочка
Помогите с макросом, ситуация такая - необходимо, чтобы при появлении записи в ячеке А1 - "Субота", В1 - "Воскресение" , ячеики А2:A5, B2:B5 стали красными. Спасибо
Автор: DONRU1
Дата сообщения: 26.09.2006 18:30
virginijus
А точно нужен макрос, может проще через условное форматирование?

Добавлено:
Как определить наличие объекта (рисунка) на листе? Макросом вставляю на лист картинку, хочу проверить ее наличии там, чтобы не вставить повторно.
Автор: virginijus
Дата сообщения: 26.09.2006 19:48
А как это через условное форматирование? через ЕСЛИ ? Дело в том, что "Субота", "Воскресение" может окозаться допустим в интервале от А1 до АЕ1 в зависимости от года и месеца. Уточню- имеетса такая ситуация

Пн Вт Ср Чт Пт Сб Вс Пн Вт Ср Чт Пт Сб Вс....

A2 B2 C2 D2 E2 F2 G2 H2.....
A3 B3......
.....

Необходимо чтобы столбцы (в данном случае F2:F50, G2:G50) покраснели, в след. месяце Сб Вс выпадет на D1 E1 значит должны покраснеть D2:D50, E2:E50 и т.д.
Мне кажется через ЕСЛИ это невозможно или я ошибаюсь?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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