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

» Excel VBA (часть 3)

Автор: chipius
Дата сообщения: 31.08.2011 12:04
DmitryPrint

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

Почему-то вариант с записью макроса не проходит: макрос записывается, но когда я его пытаюсь применить выскакивает ошибка 1004 - Application-defined or object-defined error

Вот такой код генерирует Excel


Sub Macro2_new()
'
' Macro2_new Macro
''
Range("AC9").Select
ActiveSheet.ChartObjects("Chart 2").Activate
ActiveChart.SeriesCollection(1).Name = "='Sheet4'!$B$29"
ActiveChart.SeriesCollection(1).Values = _
"='Sheet4'!$D$29;'Sheet4'!$U$29;'Sheet4'!$Y$29"
ActiveChart.SeriesCollection(2).Name = "='Sheet4'!$B$33"
ActiveChart.SeriesCollection(2).Values = _
"='Sheet4'!$D$33;'Sheet4'!$U$33;'Sheet4'!$Y$33"
End Sub
Автор: DmitryPrint
Дата сообщения: 31.08.2011 17:44
chipius
Дык отредактировать надо, примерно так:

Код:
ActiveSheet.ChartObjects("Chart 2").Activate
With ActiveChart
.SeriesCollection(1).Name = "B29"
.SeriesCollection(1).Values = "D29;U29;Y29"
.SeriesCollection(2).Name = "B33"
.SeriesCollection(2).Values = "D33;U33;Y33"
End with
Автор: nicka
Дата сообщения: 01.09.2011 10:42
Есть шаблонный текст, которого нужно вставить в определённом каличестве xlsx файлов во второй вкладке.
пожалуйста, подскажите как сделать это в батч режиме
спасибо
Автор: AKazak
Дата сообщения: 02.09.2011 17:11
nicka

Цитата:
Есть шаблонный текст, которого нужно вставить в определённом каличестве xlsx файлов во второй вкладке.


Как выбирается набор файлов и куда именно на второй вкладке нужно вставить?
Автор: AKazak
Дата сообщения: 04.09.2011 20:10
Известно, что не все функции меню доступны через методы VBA.

Например в PowerPoint 2007:


CommandBars.ExecuteMso "PictureReset"

Полный список команд для 2003 и 2007
Думаю, что для версии 2010 всё тоже подходит.
Автор: chipius
Дата сообщения: 05.09.2011 13:15
DmitryPrint

Большое спасибо за советы, код становится приятнее). Но почему-то макрос вроде бы и выполняется, но вот данные не переназначаются, т.е. залажу в данные диаграммы и вижу ссылки на "исходный файл", в чем может быть косяк??? Может проблема в диаграмме, может где-нибудь, какую-нибудь галку надо поставить???

Вот мой код:

Sub macro()
ActiveSheet.ChartObjects("Chart 2").Activate
With ActiveChart
.SeriesCollection(1).Name = Range("B29")
.SeriesCollection(1).Values = Range("D29,U29,Y29")
.SeriesCollection(2).Name = Range("B33")
.SeriesCollection(2).Values = Range("D33,U33,Y33")
End With
End Sub
Автор: AKazak
Дата сообщения: 05.09.2011 16:48
chipius
А почему бы не применить к листу-шаблону следующую операцию?


Код: Sheets("Sheet").Select
Sheets("Sheet").Copy After:=Sheets(1)
Автор: Solenaja
Дата сообщения: 05.09.2011 17:59
нужен макрос для объединения ячеек
пример файла http://www.sendspace.com/file/0zr5m7

например, нужно объединить ячейки B9:B16 в одну, текст в объединенной ячейке разделять абзацами.
т.е. сравнив ячейки из столбца А делать объединение.

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

p.s. объединяем ячейки:

Цитата:
Sub Макрос()
Dim c As Range
Dim s As String
For Each c In Selection
If s = "" Then
s = c
Else
s = s & Chr(10) & c
c.ClearContents
End If
Next c
With Selection
.Range("A1") = s
.HorizontalAlignment = xlLeft
.Merge
End With
End Sub

но пока не знаю как сделать условие...
Автор: DmitryPrint
Дата сообщения: 06.09.2011 03:24
chipius

Цитата:
в чем может быть косяк???

Какая книга активна на момент работы этого макроса? Как и когда производится переключение?
Автор: SAS888
Дата сообщения: 07.09.2011 08:25
Solenaja
Если я Вас правильно понял, то вам нужно это:

Код: Sub Макрос()
Dim c As Range, s As String: Application.DisplayAlerts = False
For Each c In Selection
If c <> "" Then s = s & c & Chr(10)
Next
If s <> "" Then Mid$(s, Len(s), 1) = ""
Selection.Merge: ActiveCell.Value = s
End Sub
Автор: flexoleonhart
Дата сообщения: 07.09.2011 11:31

Цитата:
Добрый день.
 
Есть файл excel с "только для чтения" для создания заявок (либо только для выгрузки для знающих пароль). У большинства сотрудников он работает нормально, однако у некоторых возникает ошибка "Гы гы гы..." (это не стеб - в коде есть эта ошибка). Может кто подсказать, что именно ее может вызывать, если настройки у всех одинаковые, а ошибка может возникать у случайного сотрудника (хотя есть люди у которых она постоянно).
p.s. я пытался логически прийти к проблеме,но сей язык прог-я я не знаю... поэтому очень надеюсь на любую помощь...
собсно код



Цитата:
Ячейка B1 на листе данной даты в файле реестра за данный месяц - пустая.
Надо поставить точку останова в этом месте и исследовать ситуацию в момент ее возникновения.

asbo, еще раз беспокою.

Ошибка все равно возникает. Хотя файл реестра расписан по дням на весь месяц и данная ячейка B1 на каждом листе заполнена датой.
Например: создается заявка 07.09.11 на 09.09.11 и возкает
Цитата:
ошибка "Гы гы гы..."
. Проверил файл реестра - все на месте (даты,поля, их номера).

Будут ли еще предположения/предложения?


Автор: Solenaja
Дата сообщения: 07.09.2011 11:44
SAS888
что-то я не пойму как он работает...
нужно чтобы макрос "пробежался" по ячейкам столбца А, увидел что там ячейки которые объединены и объединил ячейки из столбца B в одну, а текст (в этой объединенной ячейке) сделал разделенным абзацами.
Автор: SAS888
Дата сообщения: 07.09.2011 12:50
Solenaja
Понял. Тогда так:

Код: Sub Main()
Dim i As Long, j As Long, k As Long, s As String
Application.ScreenUpdating = False: Application.DisplayAlerts = False
i = 4
Do While Cells(i, 1).Row < Cells(Rows.Count, 1).End(xlUp).Row
j = Cells(i, 1).MergeArea.Count - 1
If j > 0 Then
For k = i To i + j
If Cells(k, 2) <> "" Then s = s & Cells(k, 2) & Chr(10)
Next
Range(Cells(i, 2), Cells(i + j, 2)).Merge
If s <> "" Then
Mid$(s, Len(s), 1) = "": Cells(i, 2) = s: s = ""
End If
End If
i = i + j + 1
Loop
End Sub
Автор: asbo
Дата сообщения: 07.09.2011 13:00
flexoleonhart

Цитата:
Ошибка все равно возникает

Значит условие выполняется:

Код: 'CHG2
If Workbooks(reestr).Sheets(datstr).Cells(1, 2) = "" Then
Stop ' asbo
' .... '
MsgBox ("Ошибка, гы гы попробуйте еще раз...")
Exit Sub
End If
Автор: chipius
Дата сообщения: 07.09.2011 15:33
DmitryPrint

Пробовал сначала с двумя открытыми книгами (одна с исходным шаблоном, вторая вновь созданная) и с одной (новой) открытой книгой, один черт, при этом на странице всего 6 диаграмм и с одной из них всё работает, а с остальными не хочет.


AKazak

Надо попробовать покрутить этот вариант, но фишка в том, что новый файл по-любому нужен. Получается, сначала я в исходный файл вставляю листы, а потом делаю им move в новую книгу...
Автор: AKazak
Дата сообщения: 07.09.2011 19:08
chipius

А так, например:


Код: Dim NewBook As Workbook
Dim NewBookName As String

Set NewBook = Workbooks.Add("Workbook")
NewBookName = NewBook.Name

Windows("TemplateBook.xlsm").Activate
Sheets("Template").Select
Sheets("Template").Copy After:=Workbooks(NewBookName).Sheets(1)
Автор: DmitryPrint
Дата сообщения: 08.09.2011 02:01
chipius

Цитата:
при этом на странице всего 6 диаграмм и с одной из них всё работает, а с остальными не хочет.
У меня c 2-мя работает, дальше не проверял. Если хотите выкладывайте, можно посмотреть.

Цитата:
Стояла задача написать макрос, который бы создавал новую книгу с пользовательским количеством листов, основанных на существующем шаблоне из "исходной" книги.

А что мешает открыть макросом шаблон, сказать Save As… и просто удалить те листы, которые не нужны текущему юзеру? Или, если требуется, зачистить ненужную информацию с листа. Удалять ненужное проще. Юзеру дать выбор из нескольких пресетов и все.

P.S. Выполняя Save As… Excel сам все переназначит в лучшем виде.
Автор: Strong64
Дата сообщения: 08.09.2011 09:27
Подскажите пожалуйста как скрыть строки, в которых есть формула (но она из за опредленных условий пустая), в определенном диапазоне строк

Такой код не подходит из-за нахождения в ячейках формул (например ячейка А38 имеет формулу =А32):


Код:
Private Sub ToggleButton1_Click()
Dim i As Range
Application.ScreenUpdating = 0
If ToggleButton1 Then
For Each i In [A30:A39]
If Len(i) = 0 Then i.EntireRow.Hidden = 1
Next
Else
[A30:A39].EntireRow.Hidden = 0
End If
Application.ScreenUpdating = 1
End Sub
Автор: asbo
Дата сообщения: 08.09.2011 09:56
Strong64
Что понимается под "в которых есть формула " и "она ... пустая" и "не подходит из-за нахождения в ячейках формул". Как все это сочетается с проверкой на длину строки содержимого If Len(i) = 0 ? Бзв, просто ссылка на ячейку - тоже формула.

Поможет:
i.HasFormula
i.Formula
i.Text
i.Value
Автор: Strong64
Дата сообщения: 08.09.2011 10:23
Спасибо! Перепробовал разные варианты - сделал так - для моего примера всё хорошо работает, но правильно ли по синтаксису кода? в VBA новичок ...


Код:
Private Sub ToggleButton1_Click()
Dim i As Range
Application.ScreenUpdating = 0
If ToggleButton1 Then
For Each i In [A30:A39]
If Len(i) = 0 Then i.EntireRow.Hidden = 1
If i.Value = 0 Then i.EntireRow.Hidden = 1
Next
Else
[A30:A39].EntireRow.Hidden = 0
End If
Application.ScreenUpdating = 1
ActiveSheet.DisplayPageBreaks = True
End Sub
Автор: asbo
Дата сообщения: 08.09.2011 11:05
Strong64
i (в приведенном коде) - объект Range. HasFormula, Formula, Text, Value - его свойства. Value - св-во по умолчанию, соотв-но, Len(i) это Len(i.Value) - длина строки, содержащей значение этого диапазона. Все это смотрится по F1, установив курсор на требуемое.

Вместо ответа на два своих вопроса я получил два в догонку :) Ты сформулируй, что ты хочешь? Сейчас у тебя получилось, что будут скрыты строки, в которых проверяемая ячейка или пуста (NB) или ссылается на пустую (NB).

If Len(i) = 0 Then i.EntireRow.Hidden = 1
If i.Value = 0 Then i.EntireRow.Hidden = 1

==
With i
If Len(.Value) = 0 Or .Value = 0 Then .EntireRow.Hidden = True
End With

И не надо забывать об обратной операции Hidden = False.
Бзв, вместо 0 и 1 лучше использовать False и True

Автор: Strong64
Дата сообщения: 08.09.2011 12:01
Чтобы не быть многословным... отсылаю файлик где хочу сделать это действо : http://zalil.ru/31666382 там все написал
Автор: alin
Дата сообщения: 08.09.2011 14:50
Доброе времени суток!
Помогите, пожалуйста, с макросом.
Имеем:
Лист1
А1, В1, С1...
А2, В2, С3...
...
А..., В..., С...

Необходимо получить на выходе:
Лист2
A1
В1
С1
...
============
Лист3
A2
В2
С2
...
============
Лист...
A...
В...
С...
...
============
Добавлено:
Если можно, сделать второй макрос по тому же условию на одном листе:
Лист2
A1 | A2 | ... | A... |
В1 | В2 | ... | B... |
С1 | С2 | ... | C... |
...........................

Заранее благодарен!
Автор: aidomars
Дата сообщения: 08.09.2011 17:51
alin
Записью иакроса не пробовал?
Автор: alin
Дата сообщения: 08.09.2011 18:20
aidomars
Пробовал, проблема в том что неизвестно сколько строк и столбцов в каждой проверяемой книге. Обработка не завершается до конца в некоторых случаях.
Кол-во ячеек достигает >3000
Автор: mp65
Дата сообщения: 08.09.2011 22:24
Народ, подскажите, плз, из личного опыта, где быстрее работает (выполняется) код VBA Excel в 2003 или 2010 версиях?

Единственное, что нашёл по теме:
- сравнение 2007 vs 2010 - http://www.databison.com/index.php/excel-2010-vs-excel-2007-basic-performance-test/ там иногда встречаются сравнение и с 2003-им.
- здесь говорится, что часто 2010 проигрывает 2003-му http://www.networkworld.com/community/blog/excel-2010-might-be-slower-excel-2003-power-u

там описано не совсем то, что нужно.

Понятно, что однозначного ответа быть не может. Меня интересует случай, когда идёт активный импорт в Excel через DDE (торговая система) и параллельно сложная обработка данных в VBA Excel.

Автор: asbo
Дата сообщения: 08.09.2011 22:59
mp65
2010 vs 2003 опыта нет. Распараллеливания в офисе нет. Поэтому все "быстродействие" VBA будет перекрыто, импортом (как ты выразился) - процессом сохранения данных в таблице. Но, главное, порочна концепция - посмотри на время исполнения ордера, плюсани к нему длину провода х2 и сравни со временем выпонения цикла на тике - осетрина второй свежести, увы :( и скорострельность Екселя или еще чего - последний вопрос. Пиши в личку, если что.
Автор: mp65
Дата сообщения: 08.09.2011 23:36
asbo
Пасиб, похоже, придётся тестить самому.
Автор: AKazak
Дата сообщения: 09.09.2011 03:56
asbo
Похоже, что распараллеливание в Excel'е (начиная с версии 2007) имеется:

Я проверял на больших циклах - грузятся оба процессора.

Для некоторой оптимизации можно использовать следующее:

Код: ' Optimization variables
Dim ScreenUpdatingState As Boolean, _
DisplayStatusBarState As Boolean, _
CalculationState As Integer, _
EnableEventsState As Boolean, _
DisplayPageBreakState As Boolean

' Disable screen updating
ScreenUpdatingState = Application.ScreenUpdating
Application.ScreenUpdating = False
' Display message at Status bar
DisplayStatusBarState = Application.DisplayStatusBar
Application.StatusBar = "!!!"
' Disable automatic calculation
CalculationState = Application.Calculation
Application.Calculation = xlCalculationManual
' Disable events
EnableEventsState = Application.EnableEvents
Application.EnableEvents = False
' Disable display page breaks
DisplayPageBreakState = ActiveSheet.DisplayPageBreaks
ActiveSheet.DisplayPageBreaks = False

....

' Enable features that were disabled for optimization
Application.ScreenUpdating = ScreenUpdatingState
Application.StatusBar = False
Application.DisplayStatusBar = DisplayStatusBarState
Application.Calculation = CalculationState
Application.Calculate
Application.EnableEvents = EnableEventsState
ActiveSheet.DisplayPageBreaks = DisplayPageBreakState
Автор: asbo
Дата сообщения: 09.09.2011 06:26
AKazak
Я 2007 не трогаю по разным причинам, спасибо за скрин. Две галки увидел - Formulas и Web Options.

Неплохо, конечно, но, имо, не лечит... Ну реализована эта беда для пересчета формул, и что? Кто же большие объемы (тем более рилтайм) через формулы считает? А для VBA такая галка есть? Или только к формулам применимо?

А соптимизировать-то, понятно, можно за счет интерфейсных прибамбасов... Можно и код, и обрабатываемые данные соптимизировать... Только концепцию-то (в описанном случае) не соптимизируешь.


Добавлено:
mp65
Тести :) Только вот взгляни на мой расклад (у меня не DDE, а COM API):
- исполнение мгновенно (вычислительные мощности вендоров)
- провод 150-200 мск, в обе стороны можно принять за 350
- цикл на одном тике < 0.1 мсек (оффлайн производительность 10-30 тыс циклов в сек)
- за сутки обрабатывается ~ 5 млн отсчетов по нескольким инструментам (с разной интенсивностью, в зависимости от времени суток)...

Вычисления не очень сложные - особо тяжелая математика вынесена в библиотеки на C++, код, данные и структура хранения максимально оптимизированы, Access)
Так что, если сам грааль плодотворен, то надо в первую голову смотреть в сторону арнеды сервера на площадке с временем доступа на порядок меньше - 10-ки мсек.

Сорри за оффтоп.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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