surgutfred, а можешь обоих в формате MS Excel 2003 сохранить? Посмотрю с удоволствием
» Excel VBA (часть 3)
Цитата:
а можешь обоих в формате MS Excel 2003 сохранить
Вот в 2003, токо сразу предупреждаю что спецам наверно мое "творение" покажется смешным, но - я не волшебник, я только учусь
Код: lLastRow = Cells(Rows.Count, s).End(xlUp).Row
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
Обычно в случаях, когда надо удалить или добавить строки/столбцы, цикл пускают в обратную сторону, в данном случае надо пускать вверх:
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
ZlydenGL
Hugo121
Спасибо за помощь
Цитата:
просто пока разбирался с непонятками убрал тот код, искал где собака "порылась"
Hugo121
Спасибо за помощь
Цитата:
что-то не нашёл, где там в Вашем коде их вставляете или планируете вставлять.
просто пока разбирался с непонятками убрал тот код, искал где собака "порылась"
Здравствуйте,Уважаемые Специалисты!
Пожалуйста..помогите исправить макрос
Его задача - вырезать выделенные строки и вставить в заданный диапазон в свободную ячейку с уже имеющимся списком со СМЕЩЕНИЕМ ВНИЗ НА СТРОЧКУ
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
Пожалуйста..помогите исправить макрос
Его задача - вырезать выделенные строки и вставить в заданный диапазон в свободную ячейку с уже имеющимся списком со СМЕЩЕНИЕМ ВНИЗ НА СТРОЧКУ
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
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
Код: 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
Спасибо,LacaStet!)) за отклик))
Но...
У меня в выделении блок из 25 ячеек (5 строчек х 5 столбцов)
Ваш макрос раскидал каждую ячейку в новую строчку...
Простите,что потревожил....может сам неправильно объяснил..
При каждом новом запуске макроса он должен вставлять НОВЫЙ блок выделенных ячеек ЧЕРЕЗ строчку
после каждого предыдущего блока в указанный диапазон (I49-I200)
Спасибо за ответ))
PS посмотрите,как мой работает...только через строчку новый выделенный блок не переносит...
===========================================================
Прошу модератора удалить мои сообщения) Спасибо,что помогли)) Вопрос решён)
Но...
У меня в выделении блок из 25 ячеек (5 строчек х 5 столбцов)
Ваш макрос раскидал каждую ячейку в новую строчку...
Простите,что потревожил....может сам неправильно объяснил..
При каждом новом запуске макроса он должен вставлять НОВЫЙ блок выделенных ячеек ЧЕРЕЗ строчку
после каждого предыдущего блока в указанный диапазон (I49-I200)
Спасибо за ответ))
PS посмотрите,как мой работает...только через строчку новый выделенный блок не переносит...
===========================================================
Прошу модератора удалить мои сообщения) Спасибо,что помогли)) Вопрос решён)
подскажите, пожалуйста как сделать кнопку для макроса.
Важно! Версия оффиса (и excel соответственно) 2010.
Важно! Версия оффиса (и excel соответственно) 2010.
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/
Чтобы увидеть 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/
Спасибо, Gyura
Добавлено:
Попробую помучить. Надеюсь, Вы не против.
Цитата:
Не понял предназначения всех переменных. Точнее - понял не всех.
Цитата:
это в переменную пишем номер последней колонки. Он, кстати, по сути своей номер или буква?
Цитата:
Тэкс... счётчик на I понятен. А во второй строчке что происходит?
Цитата:
Совсем не понял.
Что происходит?
Цитата:
Опять - не понимаю как оно работает.
Как я вижу механизм работы.
1. колонка, где искать заранее известна. Поэтому берём и ищем в колонке С уникальные значения, разделённые "; ". Однако, это знак разделения, то есть последнее значение этим знаком не оканчивается.
2. Создаём новый лист с новым уникальным именем.
3. после создания всех новых листов снова проход по колонке С и, если имя листа там присутствует - копируем строчку в тот лист
Добавлено:
Попробую помучить. Надеюсь, Вы не против.
Цитата:
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. после создания всех новых листов снова проход по колонке С и, если имя листа там присутствует - копируем строчку в тот лист
Запускаю на компе, где стоит только OpenOffice, портативный Excel 2003 (Grizli). При попытке установить какой-либо элемент управления (кнопка или галка и т.п.) пишет, что Microsoft Map больше не поддерживает эти элементы.
Не подскажите, что необходимо установить, чтобы эта функция заработала?
Не подскажите, что необходимо установить, чтобы эта функция заработала?
Пока суть да дело...
Код: Range("E:E").Select
ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[2],(IF RC[8]=0,, "" / ""),RC[8])"
Selection.AutoFill Destination:=Range("E2:E1500"), Type:=xlFillDefault
Код: Range("E:E").Select
ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[2],(IF RC[8]=0,, "" / ""),RC[8])"
Selection.AutoFill Destination:=Range("E2:E1500"), Type:=xlFillDefault
Booklet,
Цитата:
В этой части происходит декларирование переменных. Вы говорите какого типа будут Ваши переменные.
Arr это массив (анг. Array). String, Long, Byte типы
Вообще, много можно узнать из самого VBE доводя курсор на типы переменных, свойства, методы и все экселевские ключевые слова (и сам так делаю), а потом вызивая помощь (F1). Ещё много можно узнать из хороших книжек (рекоммендую книжки Уолкенбаха, загляните в ГенЛибРусЕц).
Цитата:
Он по сути номер. Если Вам это облегчит жизнь, Вам можно в R1C1referenceStyle галочку поставить (OfficeButton/ExcelOptions/Formulas/ в Эксель2007) и Вам всё будет понятно.
Цитата:
Со Split не знаком. Тут что-то (Split) происходит в массиве (убирает знак ,?) по строчкам. Может кто-то из спецов объяснит
Цитата:
Определяется размер массива (LBound, UBound). Потом ищет в каждом Worksheet рабочей тетрадки (Workbook) и если название совпадает переменная становится True.
Цитата:
Это продолжение выше упомянутого цикла. Он проходит через все Листы (worksheets), а если не найдёт то что ищет, добавляет ещё 1 лист (именно тот который искал).
Цитата:
Цитата:
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 лист (именно тот который искал).
На форме есть объекты Label1, Label2, ...
Возможно ли для всех их сделать один обработчик события Click?
Возможно ли для всех их сделать один обработчик события Click?
Filosov13
Используй функцию. На Click поставь вызов этой функции с каждого контрола
Используй функцию. На Click поставь вызов этой функции с каждого контрола
Filosov13
neprcomp
Пока я так и сделал. Но в функции всего две строчки. Лаблов 32 шт. В итоге код не очень ... скажем элегантный.
neprcomp
Пока я так и сделал. Но в функции всего две строчки. Лаблов 32 шт. В итоге код не очень ... скажем элегантный.
Filosov13
Если надо исполнять одинаковый код для всех контролов, то других методов не существует.
Если надо исполнять одинаковый код для всех контролов, то других методов не существует.
Доброго времени суток, подскажите пожалуйста как вставить из модуля листа 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 то надо дописывать к ссылке имя листа.
Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
Добавлено:
Нашел ответ http://sql.ru/forum/actualthread.aspx?tid=23503
Порой на такие приколы в екселе нарываешься, почему то ссылку в виде A1 , без проблем воспринимает а вот если R1C1 то надо дописывать к ссылке имя листа.
Помогите пожалуйста разобраться.
Написал макрос в EXCEL 2007 с одним модулем и одной формой.
Внутри модуля значения переменных нормально передаются,
а в форму не передаются, хотя нужные переменные объявил в
начале модуля как public.
Написал макрос в EXCEL 2007 с одним модулем и одной формой.
Внутри модуля значения переменных нормально передаются,
а в форму не передаются, хотя нужные переменные объявил в
начале модуля как public.
Pavel745
Цитата:
Ошибку не Excel выдает, а Вы делаете. Строка вашего кода
Код: Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
Цитата:
если просто пишешь диапазон то все нормально в лист 1 и вставляет, а если приписать имя листа 2 то выдает ошибку
Ошибку не Excel выдает, а Вы делаете. Строка вашего кода
Код: Sheets(namei).Range(Cells(ri1 + 1, ci4), Cells(ri1 + si, ci4)) = Application.Transpose(massiv)
всем привет, у меня такой вопрос:
есть табличка, в ней ссылки на 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
тут проблема в том, что он открывает не отфильтрованные строки, а строки с соответствующими номерами в самой таблице без фильтровки (понимаю что так кодом прописано, но как правильно сообразить не могу)
есть табличка, в ней ссылки на 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
тут проблема в том, что он открывает не отфильтрованные строки, а строки с соответствующими номерами в самой таблице без фильтровки (понимаю что так кодом прописано, но как правильно сообразить не могу)
Глупый вопрос.
как из Chart получить по точке значение по оси Х. Полчаса голову ломаю - не мог7у
Разобрался. Оказывается у Series есть свойство XValues
как из Chart получить по точке значение по оси Х. Полчаса голову ломаю - не мог7у
Разобрался. Оказывается у Series есть свойство XValues
Привет, участникам!
Может кто-то подскажет какие-либо надстройки для эксель для построения диаграмм. Имею ввиду не традиционных диараграмм, что имеются в эксель, а что-то поинтереснее (на сколько это возможно), может даже интерактивные диаграммы, инструментальные панели...
Для отображения диаграмм подойдут также другие программы, важно только использовать эксель как источник (базу данных) и в результате получать диаграммы в виде, удобном для презентации.
Буду благодарен за любую помощь и ссылки по теме.
Спасибо.
Может кто-то подскажет какие-либо надстройки для эксель для построения диаграмм. Имею ввиду не традиционных диараграмм, что имеются в эксель, а что-то поинтереснее (на сколько это возможно), может даже интерактивные диаграммы, инструментальные панели...
Для отображения диаграмм подойдут также другие программы, важно только использовать эксель как источник (базу данных) и в результате получать диаграммы в виде, удобном для презентации.
Буду благодарен за любую помощь и ссылки по теме.
Спасибо.
Спасибо Member! В литературе пока до таких тонкостей дойдешь, глаза посадишь.
Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе. Идет например перебор строк и пользователь видит какая щас перебирается и сколько осталось?
Пробовал через форму. Но когда вызывается форма из макроса, то и управление ей передается и обратно возвращается лишь по закрытии формы. Соответственно я не могу из этого макроса передать данные на форму, ибо управление ушло к ней. Видимо надо код из макроса переносить в обработку события "UserForm_Initialize()"?
Или как по другому?
Может запустить окно Internet Explorer и в него данные передавать через WinAPI?
Пробовал через форму. Но когда вызывается форма из макроса, то и управление ей передается и обратно возвращается лишь по закрытии формы. Соответственно я не могу из этого макроса передать данные на форму, ибо управление ушло к ней. Видимо надо код из макроса переносить в обработку события "UserForm_Initialize()"?
Или как по другому?
Может запустить окно Internet Explorer и в него данные передавать через WinAPI?
Lovec
Цитата:
Я использовал это:
progress-1.xls
progress-2.xls
progress-3.xls
Цитата:
Как на VBA сделать что-то типа прогрессбара для пользователя при длительном процессе.
Я использовал это:
progress-1.xls
progress-2.xls
progress-3.xls
Самый простой способ - использовать application.statusbar
Drazhar
LaCastet
Спасибо. Интересные примеры.
Вот мне тоже понравился. Рисование прогрессбара прямо в окне самого Excel.
Добавлено:
И еще вопрос.
Мне надо отслеживать уникальность всех значений в определенном столбце (т.е. ни одно значение в этом столбце не должно повторяться дважды).
Щас я делаю это так. Вешаю на рабочий лист макрос Worksheet_Change(ByVal Target As Range) и в нем запустив цикл с первой ячейки столбца по последнюю заполненную (их примерно 600) с помощью функции Range.Find и Range.FindNext смотрю все ли значения уникальны.
В принципе не напрягает (т.к. новые значения добавляются нечасто), но задержка в 1 сек. примерно заметна.
Может есть способ улучшить алгоритм?
LaCastet
Спасибо. Интересные примеры.
Вот мне тоже понравился. Рисование прогрессбара прямо в окне самого Excel.
Добавлено:
И еще вопрос.
Мне надо отслеживать уникальность всех значений в определенном столбце (т.е. ни одно значение в этом столбце не должно повторяться дважды).
Щас я делаю это так. Вешаю на рабочий лист макрос Worksheet_Change(ByVal Target As Range) и в нем запустив цикл с первой ячейки столбца по последнюю заполненную (их примерно 600) с помощью функции Range.Find и Range.FindNext смотрю все ли значения уникальны.
В принципе не напрягает (т.к. новые значения добавляются нечасто), но задержка в 1 сек. примерно заметна.
Может есть способ улучшить алгоритм?
Lovec
имхо нет
имхо нет
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
Предыдущая тема: VS 2010
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.