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

» Excel VBA (часть 3)

Автор: ZlydenGL
Дата сообщения: 04.08.2010 12:47
surgutfred, а можешь обоих в формате MS Excel 2003 сохранить? Посмотрю с удоволствием
Автор: surgutfred
Дата сообщения: 04.08.2010 13:05

Цитата:
а можешь обоих в формате MS Excel 2003 сохранить

Вот в 2003, токо сразу предупреждаю что спецам наверно мое "творение" покажется смешным, но - я не волшебник, я только учусь
Автор: ZlydenGL
Дата сообщения: 04.08.2010 13:09

Код: lLastRow = Cells(Rows.Count, s).End(xlUp).Row
Автор: Hugo121
Дата сообщения: 04.08.2010 13:33
surgutfred
Обычно в случаях, когда надо удалить или добавить строки/столбцы, цикл пускают в обратную сторону, в данном случае надо пускать вверх:

For i = lLastRow To 27 Step -1

Вот так например (лишнее повыкидывал):

Код:
C = 5 ' раз уж так, то пусть остаётся, только вне цикла
For i = lLastRow To 27 Step -1
Set N = w.Cells(i, C)
If N Like ("*" & Chr(10) & "*") Then
Z = Split(N, Chr(10))
Rows(i + 1).EntireRow.Insert ' , CopyOrigin:=xlUp 'вот это на 2000 не идёт, поэтому отключил
w.Cells(i, C).Value = Z(0)
w.Cells(i + 1, C).Value = Z(1)
Count = Count + 1
End If
Next
Автор: surgutfred
Дата сообщения: 05.08.2010 07:42
ZlydenGL
Hugo121
Спасибо за помощь


Цитата:
что-то не нашёл, где там в Вашем коде их вставляете или планируете вставлять.

просто пока разбирался с непонятками убрал тот код, искал где собака "порылась"
Автор: landlin
Дата сообщения: 07.08.2010 15:44
Здравствуйте,Уважаемые Специалисты!

Пожалуйста..помогите исправить макрос
Его задача - вырезать выделенные строки и вставить в заданный диапазон в свободную ячейку с уже имеющимся списком со СМЕЩЕНИЕМ ВНИЗ НА СТРОЧКУ

Sub cut_to_empty()
Application.ScreenUpdating = False
Dim cell As Range
For Each cell In Selection
Selection.Cut
Range("I49:I200").Select
Do While Not IsEmpty(ActiveCell.Value)
ActiveCell.Offset(1, 0).Select
Loop
ActiveSheet.Paste
Next cell
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Автор: LaCastet
Дата сообщения: 07.08.2010 17:29
landlin

Код: Sub cut_to_empty()
Application.ScreenUpdating = False
Dim Mycell As Range

Set Mycell = Selection

For Each Cell In Mycell
Cell.Cut
Range("I49:I200").Select
Do While Not IsEmpty(ActiveCell.Value)
ActiveCell.Offset(1, 0).Select
Loop
ActiveSheet.Paste
Next Cell

Application.CutCopyMode = False
Application.ScreenUpdating = True

End Sub
Автор: landlin
Дата сообщения: 07.08.2010 18:07
Спасибо,LacaStet!)) за отклик))
Но...
У меня в выделении блок из 25 ячеек (5 строчек х 5 столбцов)
Ваш макрос раскидал каждую ячейку в новую строчку...
Простите,что потревожил....может сам неправильно объяснил..

При каждом новом запуске макроса он должен вставлять НОВЫЙ блок выделенных ячеек ЧЕРЕЗ строчку
после каждого предыдущего блока в указанный диапазон (I49-I200)

Спасибо за ответ))

PS посмотрите,как мой работает...только через строчку новый выделенный блок не переносит...









===========================================================
Прошу модератора удалить мои сообщения) Спасибо,что помогли)) Вопрос решён)
Автор: Booklet
Дата сообщения: 09.08.2010 16:20
подскажите, пожалуйста как сделать кнопку для макроса.
Важно! Версия оффиса (и excel соответственно) 2010.
Автор: Gyura
Дата сообщения: 09.08.2010 17:31
Booklet,
Чтобы увидеть Toolbar с кнопками (Developer) надо нажать кнопку Office (у меня только анг. версия 2007 есть). Потом нажать кнопку Excel Options, потом Popular и Show Developer tab in the Ribbon.
Найти Developer таб в меню, потом Insert и тут можно выбрать то что надо (кнопку или что-то другое). Перейти в VBE можно как и раньше (Alt+F11)..

Нашёл и руководство про появление Developer Taba к 2010 версии

Код: http://www.excel-2010.com/the-developer-tab-in-microsoft-excel-2010/
Автор: Booklet
Дата сообщения: 10.08.2010 11:54
Спасибо, Gyura


Добавлено:
Попробую помучить. Надеюсь, Вы не против.

Цитата:
Dim Arr() As String, I As Long, J as Long, K As Byte, WS as Worksheet, Found as boolean, LastRow as Long, LastCol as Byte

Не понял предназначения всех переменных. Точнее - понял не всех.

Цитата:
LastCol = Cells.SpecialCells(xlLastCell).Column

это в переменную пишем номер последней колонки. Он, кстати, по сути своей номер или буква?

Цитата:
For I = 1 To Cells.SpecialCells(xlLastCell).Row
Arr = Split(Cells(I, 2), ", ")

Тэкс... счётчик на I понятен. А во второй строчке что происходит?

Цитата:
For J = LBound(Arr) To Ubound(Arr)
Found = False
For Each WS In ThisWorkbook.Worksheets
If WS.Name = Arr(J) Then
Found = True

Совсем не понял.
Что происходит?

Цитата:
Exit For
End If
Next WS
If Not Found Then
Set WS = Worksheets.Add
WS.Name = Arr(J)
End If
LastRow = WS.Cells.SpecialCells(xlLastCell).Row + 1
For K = 1 To LastCol
WS.Cells(LastRow, K) = Cells(I, K)
Next K
Next J
Next I

Опять - не понимаю как оно работает.

Как я вижу механизм работы.
1. колонка, где искать заранее известна. Поэтому берём и ищем в колонке С уникальные значения, разделённые "; ". Однако, это знак разделения, то есть последнее значение этим знаком не оканчивается.
2. Создаём новый лист с новым уникальным именем.
3. после создания всех новых листов снова проход по колонке С и, если имя листа там присутствует - копируем строчку в тот лист
Автор: timkuptsov
Дата сообщения: 10.08.2010 23:12
Запускаю на компе, где стоит только OpenOffice, портативный Excel 2003 (Grizli). При попытке установить какой-либо элемент управления (кнопка или галка и т.п.) пишет, что Microsoft Map больше не поддерживает эти элементы.
Не подскажите, что необходимо установить, чтобы эта функция заработала?
Автор: Booklet
Дата сообщения: 11.08.2010 14:06
Пока суть да дело...

Код: Range("E:E").Select
ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[2],(IF RC[8]=0,, "" / ""),RC[8])"
Selection.AutoFill Destination:=Range("E2:E1500"), Type:=xlFillDefault
Автор: Gyura
Дата сообщения: 11.08.2010 15:17
Booklet,


Цитата:
Цитата:
Dim Arr() As String, I As Long, J as Long, K As Byte, WS as Worksheet, Found as boolean, LastRow as Long, LastCol as Byte

Не понял предназначения всех переменных. Точнее - понял не всех.

В этой части происходит декларирование переменных. Вы говорите какого типа будут Ваши переменные.
Arr это массив (анг. Array). String, Long, Byte типы
Вообще, много можно узнать из самого VBE доводя курсор на типы переменных, свойства, методы и все экселевские ключевые слова (и сам так делаю), а потом вызивая помощь (F1). Ещё много можно узнать из хороших книжек (рекоммендую книжки Уолкенбаха, загляните в ГенЛибРусЕц).


Цитата:

LastCol = Cells.SpecialCells(xlLastCell).Column

это в переменную пишем номер последней колонки. Он, кстати, по сути своей номер или буква?


Он по сути номер. Если Вам это облегчит жизнь, Вам можно в R1C1referenceStyle галочку поставить (OfficeButton/ExcelOptions/Formulas/ в Эксель2007) и Вам всё будет понятно.


Цитата:

Цитата:
For I = 1 To Cells.SpecialCells(xlLastCell).Row
Arr = Split(Cells(I, 2), ", ")

Тэкс... счётчик на I понятен. А во второй строчке что происходит?

Со Split не знаком. Тут что-то (Split) происходит в массиве (убирает знак ,?) по строчкам. Может кто-то из спецов объяснит


Цитата:

Цитата:
For J = LBound(Arr) To Ubound(Arr)
Found = False
For Each WS In ThisWorkbook.Worksheets
If WS.Name = Arr(J) Then
Found = True

Совсем не понял.
Что происходит?

Определяется размер массива (LBound, UBound). Потом ищет в каждом Worksheet рабочей тетрадки (Workbook) и если название совпадает переменная становится True.


Цитата:

Цитата:
Exit For
End If
Next WS
If Not Found Then
Set WS = Worksheets.Add
WS.Name = Arr(J)
End If
LastRow = WS.Cells.SpecialCells(xlLastCell).Row + 1
For K = 1 To LastCol
WS.Cells(LastRow, K) = Cells(I, K)
Next K
Next J
Next I

Опять - не понимаю как оно работает.

Это продолжение выше упомянутого цикла. Он проходит через все Листы (worksheets), а если не найдёт то что ищет, добавляет ещё 1 лист (именно тот который искал).

Автор: Filosov13
Дата сообщения: 12.08.2010 16:01
На форме есть объекты Label1, Label2, ...
Возможно ли для всех их сделать один обработчик события Click?
Автор: dneprcomp
Дата сообщения: 13.08.2010 01:29
Filosov13
Используй функцию. На Click поставь вызов этой функции с каждого контрола
Автор: Filosov13
Дата сообщения: 13.08.2010 10:35
Filosov13
neprcomp


Пока я так и сделал. Но в функции всего две строчки. Лаблов 32 шт. В итоге код не очень ... скажем элегантный.
Автор: dneprcomp
Дата сообщения: 13.08.2010 16:19
Filosov13
Если надо исполнять одинаковый код для всех контролов, то других методов не существует.
Автор: Pavel745
Дата сообщения: 15.08.2010 11:44
Доброго времени суток, подскажите пожалуйста как вставить из модуля листа 1 массив в лист 2, если просто пишешь диапазон то все нормально в лист 1 и вставляет, а если приписать имя листа 2 то выдает ошибку т.е. в чужой лист почему то массив не хочет вставлять (через For next работает но долго - не вариант), а да из обычного модуля такой фокус проходит а вот из модуля листа почему то нет хотя очень надо именно из листа:
Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)

Добавлено:
Нашел ответ http://sql.ru/forum/actualthread.aspx?tid=23503
Порой на такие приколы в екселе нарываешься, почему то ссылку в виде A1 , без проблем воспринимает а вот если R1C1 то надо дописывать к ссылке имя листа.
Автор: Sergey071
Дата сообщения: 15.08.2010 15:10
Помогите пожалуйста разобраться.
Написал макрос в EXCEL 2007 с одним модулем и одной формой.
Внутри модуля значения переменных нормально передаются,
а в форму не передаются, хотя нужные переменные объявил в
начале модуля как public.
Автор: SAS888
Дата сообщения: 17.08.2010 10:13
Pavel745

Цитата:
если просто пишешь диапазон то все нормально в лист 1 и вставляет, а если приписать имя листа 2 то выдает ошибку

Ошибку не Excel выдает, а Вы делаете. Строка вашего кода
Код: Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
Автор: FEGORA
Дата сообщения: 17.08.2010 20:02
всем привет, у меня такой вопрос:
есть табличка, в ней ссылки на gif и параметры самих картинок справа
стоит задача после ручной фильтровки активировать (открыть) отфильтрованные скрины нажатием кнопки (после фильтровки их останется не больше 40)
написал такой код:


Sub открыть()
Dim x As Integer
Update_Screen
If Not ActiveSheet.FilterMode Then MsgBox "Не отфильтровано", vbOKOnl, "Ошибка добавления данных": Exit Sub
Set Range_From = ActiveSheet.AutoFilter.Range
For x = 43 To 3 Step -1 'вверху первых три строки-шапка
Cells(x, 2).Select
Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
Next x
End Sub


тут проблема в том, что он открывает не отфильтрованные строки, а строки с соответствующими номерами в самой таблице без фильтровки (понимаю что так кодом прописано, но как правильно сообразить не могу)
Автор: Drazhar
Дата сообщения: 18.08.2010 15:36
Глупый вопрос.
как из Chart получить по точке значение по оси Х. Полчаса голову ломаю - не мог7у

Разобрался. Оказывается у Series есть свойство XValues
Автор: ol7ca
Дата сообщения: 18.08.2010 16:51
Привет, участникам!
Может кто-то подскажет какие-либо надстройки для эксель для построения диаграмм. Имею ввиду не традиционных диараграмм, что имеются в эксель, а что-то поинтереснее (на сколько это возможно), может даже интерактивные диаграммы, инструментальные панели...
Для отображения диаграмм подойдут также другие программы, важно только использовать эксель как источник (базу данных) и в результате получать диаграммы в виде, удобном для презентации.
Буду благодарен за любую помощь и ссылки по теме.
Спасибо.
Автор: Pavel745
Дата сообщения: 22.08.2010 18:37
Спасибо Member! В литературе пока до таких тонкостей дойдешь, глаза посадишь.
Автор: Lovec
Дата сообщения: 23.08.2010 14:23
Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе. Идет например перебор строк и пользователь видит какая щас перебирается и сколько осталось?

Пробовал через форму. Но когда вызывается форма из макроса, то и управление ей передается и обратно возвращается лишь по закрытии формы. Соответственно я не могу из этого макроса передать данные на форму, ибо управление ушло к ней. Видимо надо код из макроса переносить в обработку события "UserForm_Initialize()"?

Или как по другому?

Может запустить окно Internet Explorer и в него данные передавать через WinAPI?
Автор: LaCastet
Дата сообщения: 23.08.2010 16:02
Lovec

Цитата:
Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе.

Я использовал это:
progress-1.xls
progress-2.xls
progress-3.xls
Автор: Drazhar
Дата сообщения: 23.08.2010 16:19
Самый простой способ - использовать application.statusbar
Автор: Lovec
Дата сообщения: 23.08.2010 19:46
Drazhar
LaCastet
Спасибо. Интересные примеры.
Вот мне тоже понравился. Рисование прогрессбара прямо в окне самого Excel.

Добавлено:
И еще вопрос.

Мне надо отслеживать уникальность всех значений в определенном столбце (т.е. ни одно значение в этом столбце не должно повторяться дважды).

Щас я делаю это так. Вешаю на рабочий лист макрос Worksheet_Change(ByVal Target As Range) и в нем запустив цикл с первой ячейки столбца по последнюю заполненную (их примерно 600) с помощью функции Range.Find и Range.FindNext смотрю все ли значения уникальны.

В принципе не напрягает (т.к. новые значения добавляются нечасто), но задержка в 1 сек. примерно заметна.

Может есть способ улучшить алгоритм?
Автор: Drazhar
Дата сообщения: 24.08.2010 08:58
Lovec
имхо нет

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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