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

» Excel VBA

Автор: vzbzdnov
Дата сообщения: 03.01.2007 05:37
С Новым Годом! С Новым Багом!
Ну не может Билли нормальный софт выпускать! Наверное, с генами что-то не то.
Имел нормальный работающий динамический 3D Pie chart, строящийся в VB macro. Всего 7 секторов, показывающих только проценты (в сумме 100%) и скрывающих сами суммы.
После апгрейта на 2007 - оппа! Новогодний подарок! Чарт стал показывать и суммы и проценты! Мало того - все проценты вдруг стали либо 0, либо 1, либо 2! Так, что о суммарных 100% и речи нет.
Код SeriesCollection(1).ApplyDataLabels ShowPercentage := True почему-то уже не работает, хотя Help говорит, что должен.
В новой версии, чтобы заработало, пришлось сделать так SeriesCollection(1).ApplyDataLabels Type := xlDataLabelsShowPercent. Тогда всё верно.
Клёво, а? Пожизненная работа обеспечена. Каждый раз редактировать макро. Спасибо Билли за совместимость!

Для желающих поэксперементировать. Проверьте сей код в разных версиях EXCEL. Может, я чё-то недопонимаю??
Sub AddPieChart()
Dim ch As ChartObject
Set ch = Worksheets("Sheet2").ChartObjects.Add(10, 10, 210,210)
With ch.Chart
.SetSourceData Source:=Sheets("Sheet1").Range("A1:C7"), PlotBy:=xlColumns
.ChartType = xl3DPie
With .SeriesCollection(1)
.XValues = Sheets("Sheet1").Range("A1:A7")
.ApplyDataLabels ShowPercentage:=True
End With
End With
End Sub

"Sheet1":
1101    Product1    $2,197.99
1102    Product2    $5,731.24
1103    Product3    $9,613.70
1104    Product4    $6,053.07
1105    Product5    $6,177.96
1106    Product6    $3,700.14
1107    Product7    $3,765.61



Добавлено:
Захотелось мне чегой-то высказать Microsoft-у своё фэ по поводу обнаруженного бага. Провёл быстрый поиск и выяснил офигенную вещь - оказывается, Microsoft не принимает bug reports!!
Вот здесь можно прочитать, как мелкософт содрал с чела $35 за то, чтобы принять от него bug report!!


Добавлено:
Требуется в английском EXCELe сохранить worksheet с русским текстом в файл, чтобы в файле получился оттабулированный текст, т.е. чтоб все строчки в колонках чётко начинались в одних и тех же позициях.
Не нашёл, как такое сделать, поэтому сначала сцепил все колонки построчно в одну выравнивая текст дополнительными пробелами и эту одну широченную колонку пытаюсь сохранить в файл. Делаю следующие манипуляции
ActiveWorkbook.SaveAs FileName:="MyFile.txt", FileFormat:=xlUnicodeText, CreateBackup:=False
В результате в файле имеем красиво оттабулированный текст, только .... он в двойных кавычках... Такое вот безобразие.. Приходится потом файл вручную редактировать и удалять кавычки.
Как упростить процедуру, или, если такое низзя, то как сохранить в файл, чтоб было без кавычек?
Автор: giash
Дата сообщения: 03.01.2007 12:14
to The okk
Приветствую! C новым!

"Почему бы и нет. Пиши название файла в отдельной ячейке, а на листе все формулы, ссылающиеся на лист, пиши в виде: =ДВССЫЛ(ячейка с названием) & нужная ячейка этого листа.
Например:
У нас есть файлы 1.xls, 2.xls и 3.xls. Нам нужно в файле 1.xls сделать ссылки на третий лист второй книги, потом заменить в ссылках вторую книгу на третью.
В отдельной ячейке (например, A1) любого (например, третьего) листа первой книги создаем ссылку на третий лист второй книги: [2.xls]Лист3! (БЕЗ знака "=")
А формулы в первой книге пишем в виде: =ДВССЫЛ(A1 & "ячейка_листа"), где A1 - ячейка со ссылкой на книгу, ячейка_листа - адрес ячейкй в указанной книге.
Вот, собственно, и все. Теперь достаточно изменить адрес в ячейке A1 на [3.xls]Лист3!, чтобы адреса во всех ссылках поменялись."

Еще раз спасибо за подсказку, проверил все работает. Однако, слишком много неудобств при работе с этой функцией, напр., файл на который мы ссылаемся должен быть обязательно отркрыт, да и запись с названием книги - первой части ссылки, требует дополнительного редактирования. Мне то ничего, но вот моим сотрудницам, которым уже за 50-т разобраться во всем этом будет не легко. Исходя из этого нет ли иного решения данной проблемы?
Заранее благодарен за помощь
С уважением
Автор: Anton T
Дата сообщения: 03.01.2007 12:30
The okk

Цитата:

Код:
Sub Calling()
Call SplitNum(Cells(1, 1))
End Sub
Автор: crewgehr
Дата сообщения: 03.01.2007 15:38
to SERGE_BLIZNUK
Спасибо!
Прекрасный макрос. Я почему-то уперся именно в ячейки и совсем не подумал, что удобнее реализовать данный код с помощью столбцов )))

По поводу foolproof. Я думаю можно вписать строку типа selection и потом всю селекцию в резервный файлик )) А лучше вообще без foolproof ))
Автор: Anton T
Дата сообщения: 03.01.2007 19:45
The okk
Уже все, добавил On error goto eee:
Все ок.
Автор: razhev
Дата сообщения: 04.01.2007 14:16
Подскажите плиз, а то ни как не выходит.
Сижу я в общем в Экселе и экспортирую таблицы в Ворд.
после экспорта хочу пробежаться по всем таблицам и сделать им
авторазмер по ширине. вот делаю так.
Все классно только авторазмер не пашет
таблицу выдиляет по таблицам бежит а по ширине ровнять не ровняет
Где грабли ?


For Each aTable In DocWord.Tables
aTable.Select
aTable.AutoFitBehavior (wdAutoFitWindow)
Next aTable

Добавлено:
Спасибки всем уже разобрался из Excel надо делать так


For Each aTable In DocWord.Tables
aTable.Select
aTable.AutoFitBehavior (1)
Next aTable

вместо wdAutoFitWindow ставим 1
Автор: AleLuk
Дата сообщения: 05.01.2007 10:58
Использую в ячейке формулу для получения данных через DDE.
В этой ячейке данные авоматически меняются - тут все нормально.
Но как мне выполнить автоматически код при изменении данной ячейки?

Worksheet_Change пробовал - не пашет. Здесь код выполняется токо когда ячейки изменяешь вручную.

Помогите плиз.
Автор: giash
Дата сообщения: 05.01.2007 11:22
Помогите, пожалуйста!
В Excel-файле смежные ячейки связаны следующим образом когда в ячейке А1 записывается сумма (А1<>0), тогда в ячейке B1 проставляется дата (TODAY), т.е. я это сделал применив ЕСЛИ(A1<>0;TODAY();"") для того, чтобы мои сотрудницы не отвлекались на проставление дат, т.к. когда они это делали самостоятельно в графе дата записывалось все что угодно кроме числа. Проблема же заключается в следующем при новом открытии файл обновляется и в ячейках дат появляется текущая дата. Нельзя ли сделать так, чтобы при закрытии файла те ячейки в которых дата проставлена запоминались как значения, а те которые пока еще пусты оставались бы как есть.
Очень надеюсь на вашу помощь
Спасибо
Автор: Anton T
Дата сообщения: 05.01.2007 12:23
Мне нужен сделать правильные сортировки по числовому с конца до начальную.
Смотри рисунки, сейчас не порядок, как обычный:

сортировал по числовому, но не порядок до конца номеры:

а вот должна выглядить правильная сортировка:

Автор: SERGE_BLIZNUK
Дата сообщения: 05.01.2007 12:54
giash
Цитата:
А1<>0), тогда в ячейке B1 проставляется дата (TODAY), т.е. я это сделал применив ЕСЛИ(A1<>0;TODAY();"") для того, чтобы мои сотрудницы не отвлекались на проставление дат

ну, раз вы написали в теме VBA - значит получите программку:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each r In Target.Rows
MyRow = r.Row
If (r.Column = 1) And (MyRow > 0) _
And (Not IsEmpty(Cells(MyRow, 1))) Then
If IsEmpty(Cells(MyRow, 2)) Then
Cells(MyRow, 2).Value = Date$
End If
End If
Next
Application.EnableEvents = True
End Sub
Автор: giash
Дата сообщения: 05.01.2007 14:47
ну, раз вы написали в теме VBA - значит получите программку - огромное спасибо
ну, раз вы творите добрые дела, то объясните, мне дураку, как ее запустить и я от вас отстану
С Уважением
Автор: SERGE_BLIZNUK
Дата сообщения: 05.01.2007 20:26
giash
Цитата:
раз вы написали в теме VBA - значит получите программку
правильно понимаете ;-))
Запускаете Excel, открываете вашу таблицу,
нажимаете Alt-F11 (тоже самое "Сервис" / "Макросы" / "Редактор Visual Basic")
Слева будет Project - двойной щелчок на "Лист1" - справа откроется окно скриптов (модулей) для этого листа. Туда вставляете код. всё - можно закрывать окно visual Basic'а и сохранять ваш Excel файл.
Если по коду нужны комментарии - спрашивайте - поясню.
Автор: alin
Дата сообщения: 07.01.2007 06:56
Всех с Рождеством!
Помогите, пожалуйста, советом.
Имеется рабочий лист, который формируется на каждый день путем копирования старого листа и удаления из таблиц данных (кроме формул). На листе имеются ToggleButton*, которые вставляют формулы в ячейки (по необходимости). Как сделать, чтобы при формировании нового листа эти кнопки имели вид ToggleButton*.Value = False?
Заранее благодарю.
Автор: NPC
Дата сообщения: 07.01.2007 12:56
попрошу внимания господа, снова нужна ваша помощь. нужен макрос
нужно из таблицы
20061221    105929    30917    7779    0    250    02    100%    -75    -    3091-7 МО,Любер,Котельники,Яничкин пр. 2
(каждое значение, отдельный столбец, 3091-7 МО,Любер,Котельники,Яничкин пр. 2 в одном)
и таких очень много строчек идущих вниз.
1. скопировать значения 30917, 7779, 3091-7 МО,Любер,Котельники,Яничкин пр. 2 в отдельную книгу
2. далее в новой книге у 30917 перевести в шеснатеричный формат, так же и 7779, потом объеденить в однин столбец, и дописать 25002, должно получится в столбеце А: 78C51E6325002, а в столбце Б 3091-7 МО,Любер,Котельники,Яничкин пр. 2
всех с Рождеством!!
Автор: giash
Дата сообщения: 08.01.2007 09:04
to:SERGE_BLIZNUK
С рождеством!
Огромное вам спасибо! По-моему, все слава Богу! Но помятуя ваши слова:"Если по коду нужны комментарии - спрашивайте - поясню.", оставляю за собой право обратиться за помощью.
С уважением
Автор: SERGE_BLIZNUK
Дата сообщения: 08.01.2007 19:11
giash
Спасибо за поздравление! Хотелось бы всех читателей поздравить с прошедшим светлым праздником Рождества Христова!
Цитата:
оставляю за собой право обратиться за помощью.
Так всегда пожалуйста. На самом деле, профи (мы все их знаем, поэтому поимённо не буду указывать!) вероятно на рождественнских каникулах - поэтому я тут в роли дежурного ;-)))


Добавлено:
NPC
обратите внимания на константы - номера столбцов и имя книги/листа заданы в макросе - измените по вкусу, если нужно.

Код:
Sub MoveDataToSheet2()
ColumnOfDigit1 = 3 ' константа - номер столбца с первым числом
ColumnOfDigit2 = 4 ' константа - номер столбца со вторым числом
ColumnOfMainText = 9 ' константа - номер столбца с текстом
Row1 = ActiveSheet.UsedRange.Row
Row2 = Row1 + ActiveSheet.UsedRange.Rows.Count - 1
For i = Row1 To Row2
Workbooks("Книга2").Worksheets("Лист1").Cells(i, 1).Value = _
Hex(Cells(i, ColumnOfDigit1).Value) + Hex(Cells(i, ColumnOfDigit2).Value) + "25002"
Workbooks("Книга2").Worksheets("Лист1").Cells(i, 2).Value = _
Cells(i, ColumnOfMainText).Value
Next i
End Sub
Автор: The okk
Дата сообщения: 09.01.2007 06:46
Уфф... отлично отдохнул - теперь и поработать не грех
Всех с прошедшими праздниками!

Нашел в сети книгу Дэна Эпплмана про API. Надо будет почитать на досуге.

Добавлено:
В VBA, оказывается, скрыта часть модуля, где задается его описание, сочетание клавиш для вызова и прочие атрибуты (Attribute).

Интересно, а какие вообще атрибуты VBA унаследовал от VB? Где-нибудь есть список? А то в обжект броузере не нашел.
Автор: ZORRO2005
Дата сообщения: 09.01.2007 14:33
Друзья есть такая задача:
Есть столбец F c наименованиями месяцев
(месяцы могут повторяться 1 и более раз)
В столбце G данные каждого месяца
В столбце A я делаю раскрывающийся список месяцев
(Данные->Проверка..Список)
В столбце B мне нужно тоже раскрывающийся список,
но только со значениями,которые соответствуют каждому месяцу.
То есть если я выбираю месяц февраль то в столбце B должны быть только значения 10,20,30 а не 10,20,30,100,200...
Мне нужно как на картинке


Автор: The okk
Дата сообщения: 09.01.2007 15:05
ZORRO2005
Ну, задача вроде ясна. Попробую сегодня сделать, если время будет (и если кто-нибудь раньше не ответит ). А для чего столбец D? Он тут тоже как-то задействован?
Автор: ZORRO2005
Дата сообщения: 09.01.2007 15:58
The okk

Цитата:
А для чего столбец D?

Да в столбце D уникальные значения столбца F.
В столбце F будет около 1500 строк и примерно 1000 уникальных значений.
Это я названия месяцев для примера поставил.
Вообще в столбце F будут артикулы одежды,
а напротив каждого артикула в столбце G цвета.


Автор: alin
Дата сообщения: 09.01.2007 20:16

Цитата:
Имеется рабочий лист, который формируется на каждый день путем копирования старого листа и удаления из таблиц данных (кроме формул). На листе имеются ToggleButton*, которые вставляют формулы в ячейки (по необходимости). Как сделать, чтобы при формировании нового листа эти кнопки имели вид ToggleButton*.Value = False?

Это возможно реализовать?
Автор: Yuk
Дата сообщения: 09.01.2007 21:01
alin

Цитата:
Как сделать, чтобы при формировании нового листа эти кнопки имели вид ToggleButton*.Value = False?

Как происходит формированиеие нового листа? Через VBA макрос?
Тогда в этом же макросе в цикле проходишь по всем ToggleButton на листе и присваиваешь им значение False.


Добавлено:
Реализация:

Код: For Each s In Worksheets(1).Shapes
If s.Type = msoOLEControlObject Then
If InStr(s.OLEFormat.progID, "ToggleButton") > 0 Then
s.OLEFormat.Object.Object.Value = False
End If
End If
Next
Автор: alin
Дата сообщения: 09.01.2007 23:30
Yuk

Цитата:
Как происходит формированиеие нового листа? Через VBA макрос?
Да

Цитата:
For Each s In Worksheets(1).Shapes
If s.Type = msoOLEControlObject Then
If InStr(s.OLEFormat.progID, "ToggleButton") > 0 Then
s.OLEFormat.Object.Object.Value = False
End If
End If
Next

Поясни, пожалуйста, все кнопки ToggleButton1, ToggleButton2, ToggleButton* будут иметь положение False? В моём случае ToggleButton1…*.Value = False заносят формулы, ToggleButton1…*.Value = True - формулы удаляются. Желательно, чтобы на новом листе формулы были удалены.
Автор: Yuk
Дата сообщения: 09.01.2007 23:41
alin
Если Application.EnableEvents = True, по идее должно отработать событие, привязанное к изменению статуса ToggleButton. В принципе, формулы можно удалить и программным путем из того же макроса, тем более код у тебя уже есть. Короче, тестируй.
Автор: alin
Дата сообщения: 10.01.2007 00:16
Yuk
Спасибо, буду пробовать.
Автор: aks_sv
Дата сообщения: 10.01.2007 04:54
Кто-нибудь подскажет, как решить такую задачку: имеется ListBox с девятью колонками, из них отображается только одна, остальные ColumnWidths 0 pt. Как при помощи нажатия, например, кнопки ОК на форме, переместить все 9 колонок c ListBox в таблицу.
Для пояснения:
ListBox заполняется из этой же таблицы с 9 колонками, затем на форме сортируется произвольным образом, необходимо чтобы в ListBox отображалась только одна колонка.
Автор: The okk
Дата сообщения: 10.01.2007 07:13
aks_sv

Код:
Application.ScreenUpdating = False
With Worksheets(номер_листа)
.Range(.Cells(первая_строка,первый столбец), _
.Cells(последняя_строка,послений_столбец)) = _
Me.ListBox1.List
End With
Application.ScreenUpdating = True
Автор: ZORRO2005
Дата сообщения: 10.01.2007 08:29
The okk

Цитата:
Столбец "F" отсортирован?

Я могу его предварительно отсортировать
Автор: The okk
Дата сообщения: 10.01.2007 08:40
ZORRO2005
Не стОит - сортировку и в макросе сделать можно .
Автор: aks_sv
Дата сообщения: 10.01.2007 09:10
The okk

Цитата:
Application.ScreenUpdating = False
With Worksheets(номер_листа)
.Range(.Cells(первая_строка,первый столбец), _
.Cells(последняя_строка,послений_столбец)) = _
Me.ListBox1.List
End With
Application.ScreenUpdating = True


Сделал как ты сказал, все-равно снимает с ListBox_а один столбец в таблицу

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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