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

» Excel VBA (часть 2)

Автор: lanselotideo1111
Дата сообщения: 15.01.2009 08:22
SAS888
Если можно, приведите пожалуйста пример кода.
Автор: SAS888
Дата сообщения: 15.01.2009 09:13
Пусть в ячейке "A1" создан выпадающий список из диапазона "D1:D3".
Для того, чтобы при выборе значения из списка заливка тоже менялась, можно, например, использовать следующий код, расположив его в модуле соответствующего листа:

Код: Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = [A1].Address Then
Set x = [D1:D3].Find([A1])
If Not x Is Nothing Then [A1].Interior.ColorIndex = x.Interior.ColorIndex
End If

End Sub
Автор: KolyaP
Дата сообщения: 15.01.2009 20:22
При открытии книги назначаются ссылки на объекты, доступные для любого мароса.
Если интерпретатор останавливает выполнение программы из-за ошибки, эти ссылки уничтожаются при нажатии на кнопку End. Каким образом сделать так, чтобы ссылки не уничтожались или сразу восстанавливались после нажатия End?

Добавлено:
Еще вопрос
a = Worksheets("Лист1").Range("a2:b4").Address()
работает

a = Worksheets("Лист1").Selection.Address()
не работает, не важно выделена одна ячейка или диапазон.

Хотя в описании свойства Selection сказано
The returned object type depends on the current selection (for example, if a cell is selected, this property returns a Range object).

Как добиться корректной работы во втором случае?

Добавлено:
По ходу нашел такой способ
a = ActiveWindow.RangeSelection.Address()
только его можно применять к окну, но нельзя к произвольному листу (например неактивному)
Автор: esse1
Дата сообщения: 19.01.2009 08:46
Вообщем есть такая проблема, существует база данных такого вида:


Цитата:
Rank    Company    Country    Industry    Sales ($bil)    Profits ($bil)    Assets ($bil)    Market Value ($bil)    
1    HSBC Holdings    United Kingdom    Banking    146,5    19,13    2348,98    180,81    
2    General Electric    United States    Conglomerates    172,74    22,21    795,34    330,93    
3    Bank of America    United States    Banking    119,19    14,98    1715,75    176,53    
4    JPMorgan Chase    United States    Banking    116,35    15,37    1562,15    136,88    
   


(в базе более 100 рядов, это только лишь отрывок)

К ней прикручен listbox в котором отфильтрованы все значения из столбца Industry. Задача в том чтобы при выборе отрасли например Banking, выводились все страны которые имеют отношение к этой индустрии вместе со всей инфой. Необходимо чтобы все это делалось на лету, тоесть при выборе отрасли сразу выводились страны в другой рабочий лист. Ниже предоставлен скриншот как это должно выглядеть:



ниже ссылка на лист с базой данных и листбоксом.

http://rapidshare.com/files/184783757/zada4a1.xls.html

Большая просьба помочь с решением этой задачи, заранее извиняюсь если уже есть похожая тема, просьба перенести или соеденить топик.
Автор: Solenaja
Дата сообщения: 19.01.2009 16:14
кто поможет с этой задачей справится.
1. со всех листов книги удалить картинки
2. после этого, удалить столбец "А" и 5 первых строк (с 1 по 5 включительно). проделать это на всех листах книги, кроме, оговоренных 5 листов, например, "один", "два", "три", "четыре", "пять".
3. начиная с уже третьей строки и до последней с данными выравнять высоту строк равную 15. проделать это на всех листах книги, кроме, оговоренных 5 листов, например, "один", "два", "три", "четыре", "пять".

p.s. названия листов, в которых ведутся изменения, имеют такой формат: 01_название, 02_название ... 20_название
"название" естественно меняется
Автор: nopoxz
Дата сообщения: 19.01.2009 17:35
Привет.
Пытаюсь написать макрос, ктотрый ищет ячейку со значением "BLine" и выделяет её. Не получается почему-то:


Код:

Dim x As Range

Set x = Cells.Find(BLine, , xlValues)
x.Select

Автор: Lady Black
Дата сообщения: 19.01.2009 19:20
Здравствуйте!
Простите меня, но я самый последний ламер в программировании, тем более в VBA... Но жизнь заставила меня с этим связаться. Пожалуйста, не игнорируйте мое сообщение...потому, что у меня есть стремление научиться...
Мне нужно сделать в Excel такую форму (или кнопку, которая запустить макрос) в ней будут поля, некоторые с выпадающими списками, некоторые поля будут, но могут остаться незаполненными, на этой форме должна быть кнопка "Сгенерировать" (или что-то с этом роде) которая закроет форму, а на листе построит (или/и добавит) таблицу с введенными значениями.
У меня есть некоторые книги по Excel, VBA но в них нет ответов на мои Тупые и простые вопросы Извините.
Где мне можно найти такую тупю информацию, например: каким кодом можно сделать так, чтобы при нажатиии на кнопку она закрывала и генерировала данные? или как устроить "сам механизм" переноса из заполненных полей в таблицу?
Автор: SAS888
Дата сообщения: 20.01.2009 10:48
nopoxz
У Вас BLine - это переменная. Для того, чтобы это было значением - поставьте кавычки.

Код: Dim x As Range
Set x = Cells.Find("BLine", , xlValues)
x.Select
Автор: Solenaja
Дата сообщения: 20.01.2009 13:06
SAS888
супер, работает на ура под Excel 2007, большое спасибо!
p.s. небольшое дополнение. Что нужно будет еще дописать, чтобы удалить
- один или несколько листов ("один", "два", "три", "четыре", "пять")
- один или несколько листов ( 01_название, 02_название ... 20_название)
Автор: SAS888
Дата сообщения: 21.01.2009 05:10
Solenaja

Код: Application.DisplayAlerts = False: On Error Resume Next
Sheets(Array("один", "два", "три", "четыре", "пять")).Delete
Автор: gorapteka
Дата сообщения: 21.01.2009 06:28
Приветствую Всех, помогите решить проблему...
Суть в следующем: есть прайс-листы в них есть графа срок годности, но
разные поставщики ее пишут по разному, примеры:
01.01.10 - нормально
10.05.2010 - нормально
04.10 - только месяц и год
0512 - только месяц и год
11210 - распозновать как 01.12.2010
62610 - распозновать как 26.06.2010 (т.к. 26 месяца нету)
Нужно соответсвенно правильно распознать и привести к виду ДД.ММ.ГГГГ
Если дата как в 3,4 примере значит надо дописать 01 к месяцу и году, т.е. к виду 01.04.2010, 01.05.2012

Вижу пока 2 способа решения:
1) написать макроск автоматического распознования даты, месяца, года (поиск вести по месяцу так как их не более 12)
2) можно сделать зопрос на ввод число, месяца, года т.е взять на себя эту функцию
распознования, и макросу сказать как его распозновать, например:
11110 - число это будет 1 знак, месяц это будет 2-3 знак, остальное год (получится 01.11.2010) или
11110 - число это будет 2-3 знак, месяц это будет 1 знак, остальное год (получится 11.01.2010).
0512 в этом случае дата будет 01(добавить), месяц 1-2 знак, остальное год (получится 01.05.2012)
Автор: SERGE_BLIZNUK
Дата сообщения: 21.01.2009 14:09
gorapteka - а здесь можно было и отписаться, что на другом форуме (programmersforum) SAS888 уже решил проблему через макрос....
Автор: mistx
Дата сообщения: 21.01.2009 20:46
Друзья, помогите решить задачу плиз.

в екселе 4 столбца

Петров Василий Федорович 5674897060 50.70
1. номер
2. ФИО
3. таб-й номер
4. сумма

необходимо получить в текстовом файле след-ю структуру

в первой строке хотелось бы увидеть общую сумму
50.70

1/текст/5674897060/Петров/Василий/Федорович/50.70/1/

1. номер
2. произвольный текст
3.таб-й
4.Фамилия
5.Имя
6. Отчество
7. сумма
8. номер

Реально ли это сделать с vba?

Заранее благодарю за любую помощь
Автор: KolyaP
Дата сообщения: 21.01.2009 23:22
gorapteka
Если один поставщик использует всегда один и тот-же формат, можно разложить прейскуранты разных поставщиков в заранее определенные папки
Например
с:\documents\поставщик А
с:\documents\поставщик Б
...
и написать макрос, который открывал бы из данной папки файл , который был изменен последним.

Второй вариант, если в названии прейскуранта поставщика всегда присутствует какое-нибудь характерное сочетание.
Например "Remedy_dealer_22_01_09.xls","Remedy_dealer_12_01_09.xls" всегда повторяется сочетание "Remedy_dealer" у поставщика А.
Можно искать по этому сочетанию прейскурант поставщика А.

Т.к. для конкретного поставщика известен формат, то можно преобразовать его в стандартный.
Автор: gorapteka
Дата сообщения: 22.01.2009 05:27
SERGE_BLIZNUK
Да проблема решена, отписаться не успел... спасибо SAS888
KolyaP
Вся проблема была в том, что нужен был макрос который и преобразовывал бы определенный столбец в формат дата. У каждого поставщика свой формат написания даты, а нужен был ДД.ММ.ГГГГ

Всем спасибо, тема закрыта.
Автор: nopoxz
Дата сообщения: 22.01.2009 14:53
SAS888

спасибо, работает!

Немного усложнил задачу:

у меня ячейки содержат: значения week 1, week 2, week 3... . Через инпутбокс я делаю переменную x цифрой. Введённая цифра, подразумевается как часть значений ячеек.

Хочу сделать так, чтобы поиск искал: week x, т.е. ту неделю которую ввёл через бокс.


Код:
Dim x As String
Dim y As Range
x = InputBox("Kuku", "Nomer", "1-52")
Set y = Cells.Find("week " & x", , xlValues)
y.Select

Автор: SAS888
Дата сообщения: 23.01.2009 12:42
nopoxz
Вот так

Код: Dim x As String
Dim y As Range
x = InputBox("Kuku", "Nomer", "1-52")
Set y = Cells.Find(What:="week" & x, LookAt:=xlWhole)
y.Select
Автор: nopoxz
Дата сообщения: 23.01.2009 15:14
SAS888

Спасибо.

Один момент:

week4 находит, а week 4 нет.


Код: (What:="week" & x, LookAt:=xlWhole)
Автор: SeriousPenza
Дата сообщения: 23.01.2009 18:22
Всем привет!
У меня вопрос.
Есть в 2003 Excel такая команда "Правка/Связи" (аналогично 2007му - "Данные/Подключения/Изменить связи"). Нужен макрос, который вытаскивает список полных адресов связанных книг. Подскажите, пожалуйста, как это можно сделать.

Заранее спасибо.

P.S. А общая задача такая, если кому интересно: в локальной сети с общим доступом лежит куча книг, которые перезавязаны между собой. Есть Главная книга. Нужна построить схему зависимостей Главной книги от других книг (с учетом того, что они в свою очередь о третьих зависят, а третьи от четвёртых и т.д.). Некоторые ссылки ошибочны - файлы удалены. Уверен, что там полно циклических зависимостей. В общем, это Авгиевы конюшни, в которых не прибирались лет пять, а прибраться позарез надо, а я не Геракл (

Добавлено:
Для начала кое-что накопал.
Например, ActiveWorkBook.LinkSources(1) возращает массив полных адресов книг, связанных с активной книгой (в Help'е нашёл).

Прошу прощения за беспокойство!
Автор: panda3
Дата сообщения: 28.01.2009 08:34
Как включить автофильтр по значению ошибки "#Н/Д" или по логическому значению "ЛОЖЬ"/"ИСТИНА" ? По команде Range.AutoFilter 1, "=#Н/Д" все строки полностью скрываются, хотя если вручную открыть условие автофильтра, то подсвечено правильное значение (#Н/Д) и если его перевыбрать вручную, то фильтруется нормально. ...Filters.Criteria1 при этом так же "=#Н/Д". И с ЛОЖЬ/ИСТИНА такая же фигня.
Автор: Troitsky
Дата сообщения: 28.01.2009 14:17
panda3

Цитата:
Как включить автофильтр по значению ошибки "#Н/Д"


Код: .AutoFilter 1, "#N/A"
Автор: Solenaja
Дата сообщения: 28.01.2009 16:17
задача такая
есть такая вот таблица


сама таблица
http://www.sendspace.com/file/4gmwki

мне нужно определить максимальное значение в каждом строке согласно условиям:
например, Колено 110*45' и массив данных ячеек C29:Q29 ("10,000" "2,000" "2,000" "4,000")
1. определить макс. среди всего массива = 10
2. найти 80% от макс. =8
3. проверить весь массив, если есть значение в массиве больше п.2 (8), но меньше п.1 (10) - принять макс. равный п.1; иначе принять макс. равный максимальному из значений меньше п.2, т.е. в данном случае равный 4 (проверяется "2,000" "2,000" "4,000" < п.2 (8) и находится макс. среди "2,000" "2,000" "4,000" - т.е. 4)

я не знаю решается ли такая задача встроенными фукнциями или нужно для этого импользовать VBA.
первый два пункта вычислить не сложно, а вот с проверкой у меня возникала проблема, т.к. не знаю как в одной ячейке сделать проверку всего диапазона, чтобы excel проверял каждую ячейку и делал из него выборку. есть функции "Работа с базой данных", но что-то не получается никак.

задача усложняется ещё тем, что таких файлов много и в каждом разный период кол-ва недель, т.е. может быть 15 недель, 10 недель, 20 недель и т.д. и разное кол-во строк (наименований товара)

заранее сенкс

Добавлено:
похоже что задача решилась средствами Excel
для данного выше примера
=ЕСЛИ(СЧЁТЗ(C29:V29)=1;0;ЕСЛИ(НАИБОЛЬШИЙ(C29:V29;2)>(МАКСА(C29:V29))*0,8;МАКСА(C29:V29);НАИБОЛЬШИЙ(C29:V29;2)))

теперь, для полного счастья, если бы кто помог с макросом, чтобы одним махом засунуть в столбец W эту форумулу, а в столбец X - значение W деленное 3
закрепить области в ячеке С13
все в файлы с именами вида ВыдКонXXXXXXX.xls (XXXXXXX произвольное)
Автор: KolyaP
Дата сообщения: 29.01.2009 23:51
В строке есть ячейки с включенным свойством "Переносить по словам". Если высота строки такая, что содержимое таких ячеек не видно полностью или наоборот строка растянута по высоте и после текста остается еще много свободного пространства, то можно отрегулировать высоту так, чтобы весь текст входил и не оставалось лишнего пространства. Есть такой метод AutoFit для этого случая.

Но он не работает для объединения ячеек.

Как отрегулировать высоту в случае, когда имеется объединение ячеек?
Автор: SAS888
Дата сообщения: 30.01.2009 07:48
Solenaja
Посмотрите Здесь.
Автор: Solenaja
Дата сообщения: 02.02.2009 17:24
SAS888
в очередной раз спасибо !
есть только проблемы с закреплением областей, они как-то беспорядочно закрепляются в разных файлах.
+ неправильно считаются значения.
нужно
Макс -> Y13 = ЕСЛИ(СЧЁТЗ(C13:V13)=1;0;ЕСЛИ(НАИБОЛЬШИЙ(C13:V13;2)>(МАКСА(C13:V13))*0,8;МАКСА(C13:V13);НАИБОЛЬШИЙ(C13:V13;2)))
Макс /3 -> Z13 = ОКРУГЛ(Y13/3;0)

а можно ещё сделать проверку на конечные (итоговые) столбцы и удалить их, т.е. в примере выше удалить R и S столбцы, т.к. R10 = "Итог", а S10 = "Средняя продажа" ? или не удалять, но после их добавить два искомых столбца Max и max / 3 ?
p.s. всего столбцов "Неделя с XX.XX.XXXX" будет 20-25
Автор: KolyaP
Дата сообщения: 03.02.2009 01:50
Подскажите пожалуйста как создать объект, в котором задать свои переменные, свойства и т.п. Или посоветуйте литературу, где бы это было отражено.
Автор: SAS888
Дата сообщения: 03.02.2009 06:38
Solenaja
По-моему, мы говорим о разных исходных файлах. За основу я взял Ваши файлы по Вашей ссылке
Цитата:
http://www.sendspace.com/file/4gmwki
, где данные расположены в столбцах
Цитата:
массив данных ячеек C29:Q29 ("10,000" "2,000" "2,000" "4,000")
А сейчас Вы говорите, что
Цитата:
ЕСЛИ(СЧЁТЗ(C13:V13)=1;0;ЕСЛИ...
Естественно, что все будет не так!!!!!!
Прикрепите правильный исходный файл и опишите более подробно задачу. Лучше всего, прикрепить также пример файла, который должен получаться в итоге.

Автор: Solenaja
Дата сообщения: 03.02.2009 10:51
SAS888
нет - всё так, я просто в задаче выше беру строку C29:Q29, а ниже тоже самое только для первой строки данных C13:V13 (исправлено, чтобы считало 20 недель; в макросе что выслан тоже поправлено)

вся задача сводится к вычислению максимального значения и отбрасыванию единичных покупок
смотри приват
Автор: MaximuS G
Дата сообщения: 03.02.2009 12:44
SeriousPenza
Sub links()
Dim x
Dim i As Integer

x = ActiveWorkbook.LinkSources
For i = 1 To UBound(x)
If Not IsEmpty(x) Then
Cells(i, 1).Value = x(i)
Next i
End If

End Sub
Автор: grooogler
Дата сообщения: 03.02.2009 23:19
Здраствуйте.

Кажется уже мелькал какой то такой скрипт, но чтото пересмотрел, никак не нашол.

Нужно два скрипта на excel

1.

Таблица А

111111111
222@:;zxf222
333333333
4444444
555555555
66666666
777
8888888
9999фф999ff999

Таблица B
222@:;zxf222
4444444
77777777
888

Скрипт должен поместить в таблицу C следующее:

Таблица C
111111111
333333333
555555555
66666666
777
8888888
9999фф999ff999

То есть в таблице B есть ячейки которые равны ячейкам в таблице A, мы их находим и вычитаем из таблицы A и отсавшиеся выводим в таблице C.

2.

Лист 1
А B
1:1@1:@ book.gooodd
2:2@2:@ cooodrrrrrrrr
3:3@3:@ faaaaaafaaaa
4:4@4:@ groonnnnnnn
5:5@5:@ zooorrrrrrrrrr

Лист 2

A
1:1@1:@
2:2@2:@
4:4@4:@

Наш скрипт должен поместить на Лист 3 следующее

Лист 3

A B
1:1@1:@ book.gooodd
2:2@2:@ cooodrrrrrrrr
4:4@4:@ groonnnnnnn

Ну как бы думаю понятно как он должен сделать... берёт ячейку A из Листа 2, находит соответствующую ей ячейку на листе 1 в таблице И и выводит их вместе на Листе 3. В принцыпе можно всё сделать и на один лист...

Заранее безмерно благодарен.

p.s. вот залил примерные макеты http://slil.ru/26613575
pp.s. в обоих примерах количество строк будет достаточно большое, около 10000

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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