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

» Excel VBA

Автор: DONRU1
Дата сообщения: 24.08.2006 19:06
Как в Excel отследить программно конец страницы, выводимой на печать? Т.е. последнюю строчку для каждой страницы. И подсчитать количество страниц?
Ну не считать же количество строк и их высоту
Автор: sgulinsky
Дата сообщения: 24.08.2006 21:43
Ya pytayus' otkryt' outline cherez VBA, vot tak:

Dim TheName As String
Dim i, As Integer

For i = 1 To Sheets.Count
TheName = Sheets(i).Name
Sheets(TheName).Unprotect
Sheets(TheName).Activate
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
Next i

Pochemu-to ShowLevels ne srabatyvaet. Pomogite pozheluysta - mne nado zastavit' Exel spreadsheet avtomaticheski otkryvat' "+" outline, chtoby user mog vybrat' kolonku v detalyah... a seychas u menya input box vyskakivaet, a detali spryatany i na "+" nel'zya kliknut' vo vremya macro.
Spasibo,
Sabina
sgulinsky@yahoo.com
sv1423@att.com
Автор: KLERIK2222
Дата сообщения: 25.08.2006 08:27
Здравствуйте.
У меня такой вопрос. Имеется книга Excel с формулами, макросами (далее программа). Как сделать, что бы после установки у пользователя в Excel'e появилась кнопка, запускающая мою прогу?
Автор: divik
Дата сообщения: 25.08.2006 11:05
Проблема вот в чем : мы купили 4 сист.блока Селерон 2600(около того)
с опер.системой win XP SP2.Установив офис 2003 на них обнаружилась одна проблема:
в Exel пишу в ячейке число больше нуля с тремя цифрами после запятой , а он в ячейке также и пишет, но в строке формул пишет его без запятой.
Т.е. пишу 5,758 , а в строке формул пишет 5758.
Соответственно и вычисление делает с чилом без запятых.
При этом любое число с 2 знаками после запятой воспринимает нормально!
В чем дело если сможешь подскажи????
В любом случае жду ответа. ответ в ПМ....
Автор: SERGE_BLIZNUK
Дата сообщения: 25.08.2006 13:03
agrippa

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


Цитата:
если на этом листе что-то было до запуска макроса, то мой макрос всё это заменял теми данными,которые содержаться в текстовом файле

а может просто банально всё очищать перед заполнением?

Код:
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.ClearContents
Автор: agrippa
Дата сообщения: 25.08.2006 19:52
SERGE_BLIZNUK

Спасибо большое.
Всё попробую...
Автор: Yuk
Дата сообщения: 27.08.2006 07:30
sgulinsky


Цитата:
Pochemu-to ShowLevels ne srabatyvaet. ... a seychas u menya input box vyskakivaet, a detali spryatany i na "+" nel'zya kliknut' vo vremya macro.

Цитата:
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1

Все правильно. ColumnLevels:=1 означает показать только 1-й уровень, остальные спрятать. Чтобы показать все уровни, надо чтобы эта величина была больше числа уровней. 0 означает оставить без изменения.
Вот только не знаю, есть ли возможность запомнить и восстановить прежнее состояние.


KLERIK2222

Цитата:
Как сделать, что бы после установки у пользователя в Excel'e появилась кнопка, запускающая мою прогу?

Сохранить файл как надстройка (Addin). Создание/удаление кнопки прописать в функциях AddinInstall/AddinUninstall.

Пример из хелпа:

Код: Private Sub Workbook_AddinInstall()
With Application.Commandbars("Standard").Controls.Add
.Caption = "The AddIn's menu item"
.OnAction = "'ThisAddin.xls'!Amacro"
End With End Sub
End Sub
Автор: DONRU1
Дата сообщения: 28.08.2006 18:11
Yuk
Если б все так было просто. Файл формируется макросом автоматически и количество строк в нем все время разное. Есть казначейская программа "Рабочее место распорядителя средств" вот она каким-то образом так делает, а как я не пойму. Она использует Excel файл-шаблон в котором забиты все строки которые могут быть в результирующем файле.
Автор: Yuk
Дата сообщения: 28.08.2006 19:15
DONRU1
Что-то я не совсем уловил связь с твоим предыдущим постом.

Цитата:
Файл формируется макросом автоматически и количество строк в нем все время разное. Есть казначейская программа вот она каким-то образом так делает, а как я не пойму.
Что так делает? Подробнее, пожалуйста.
Что за программа? На VBA?

Автор: DONRU1
Дата сообщения: 28.08.2006 21:28
Yuk
Эта программа формирует Экселевский файл и в конце каждой страницы добавляет три строчки в которых содежтся информация об исполнителе документа, количество страниц в документе и номер текущей страницы. Программа на Windows Foxpro.
Скорее всего придется считать строки.
Автор: Yuk
Дата сообщения: 28.08.2006 22:56
DONRU1
Ты уверен, что программа вставляет эти строчки в сам файл, а не через футер в настройках страниц (нижний колонтитул, что ли)? По крайней мере, мне это представляется более правильным способом.
Автор: DONRU1
Дата сообщения: 29.08.2006 07:41
Yuk
Совершенно уверен. Если бы они вставлялись через колонтитул, то их было бы видно только на распечатках, не так ли? А так вставляются 3 строки с форматированием ячеек. Я думал, есть вариант решить задачу проще. Единственное что пока не получается - узнать общее количество страниц, сразу, а то приходится простчитывать общее количество строк и делить на то количество, которое помещается на страницу, а уж потом пробегаться по заданным ячейкам и ставить туда это значение.
Автор: utmpatpc
Дата сообщения: 29.08.2006 09:26
Здравствуйте!
К своему стыду совершенно не знаю VBA Excel .
У меня есть весы подключенные через com-порт по RS-232 к компу. Данные от весов передаются в открытый экселевский файл, совершенно произвольно иногда строки дублируются. Проблема в лимите строк в Экселе (65500).
Если бы можно было бы регулировать время передачи данных от весов в Эксель. Связывался с производителем весов, он сказал Весы могут передавать данные через Com-порт после каждого АЦП-преобразования. Вопрос отображения значений веса только в интересующие Вас моменты времени решается программно. То же самое касается и вывода данных непосредственно в таблицу Excel.
Мне бы хватило, если бы данные передавались в Эксель один раз через 2 минуты.
Как решить эту проблему?
Зарание благодарен

(Могу выслать экселевский сэмпл с логом)
Автор: Anton T
Дата сообщения: 29.08.2006 12:28
Yuk

Цитата:
В свойствах комбобокса установи MatchEntry в 2 - fmMatchEntryNone.
В конец функции ComboBox1_Change добавь
ComboBox1.DropDown

ок, спасибо. продолжение следует...
Автор: Yuk
Дата сообщения: 29.08.2006 17:51
utmpatpc

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

Я бы проработал этот вопрос с производителем. Возможно в их программе есть установки для этого. Если надо программировать, дают ли они какие рекоммендации? Можно ли это сделать с Excel VBA?

Как временное решение, можно установить макрос в лист, который при появлении новых данных будет проверять время и удалять ненужные строки.
Нажми Alt-F11, в левой панели найди свой лист (файл должен быть предварительно открыт естественно). Двойным кликом по нему откроется страница с кодом, возможно пустая. Туда ввести:

Код: Private Sub Worksheet_Change(ByVal Target As Range)
For Each r In Target.Rows
If Second(r.Cells(1, 1)) Mod 10 <> 0 Then
r.Delete
End If
Next
End Sub
Автор: Yuk
Дата сообщения: 30.08.2006 08:28
DONRU1
Нашел, как определить конец страницы. Используются коллекции HPageBreaks и VPageBreaks.
Например,
Код: Dim i As Long
For i = 1 To ActiveSheet.HPageBreaks.Count
MsgBox ActiveSheet.HPageBreaks(i).Location.Row
Next i
Автор: namomelkorsp
Дата сообщения: 30.08.2006 10:40
День добрый!
Имеется книга экселевская в ней один лист.
На листе есть списки с полями (ComboBox). В списках есть данные. Так вот я не могу ничего сделать с этими списками. Не могу поменять размер поменять свойства а также немогу найди где хранятся эти данные (в макросах они не заполняются). Также книга связана с другим файлом (ATPVBAEN.XLA) файла у меня нет и данные не обновляются.
Если кто знает объясние что это такое со списками и как с этим бороться.

Добавлено:
Немного разобрался нашел где находятся данные этих списков они были в скрытом листе. ) Но пока всеравно не могу понять как работать с этими списками. Если кто знает подскажите. Или дайте ссылочку на пример или литературку.
Автор: Anton T
Дата сообщения: 30.08.2006 12:37
Yuk
Как можно сделать "фильтр" в Listbox1? Например, ввод фамилию "Бондар" в TextBox1, а автоматические отображене в листбоксе.
Автор: vladimir_oz
Дата сообщения: 30.08.2006 12:45
Мне надо распечатать userform на принтер. Но так как форма достаточно большая то при печати через printform она не умещается на листе.
Вопрос как распечатать ее или в альфомном формате (повернуть на 90 градусов) или уменьшить масштаб рисунка. Лучше первое
Автор: utmpatpc
Дата сообщения: 30.08.2006 14:04

Цитата:
Private Sub Worksheet_Change(ByVal Target As Range)
For Each r In Target.Rows
If Second(r.Cells(1, 1)) Mod 10 <> 0 Then
r.Delete
End If
Next
End Sub

Провожу код макроса в Экселе!
Подскажите куда вставлять Ваш код, я его вставил в конце, но ничего не происходит
Global RowPtr As Long, ColPtr As Long, PortNum, CPSVal
Global Const CmdLine = "C:\Program Files\CPS Plus\cps.exe /MINIMIZED" ' program install dir

Sub Auto_Open() ' this sub runs automatically when you open the spreadsheet

PortNum = InputBox("Collect data from Communcation port: (enter port number)", "Excel DDE Example", 1)
RowPtr = 2
On Error Resume Next ' ignore errors and try to launch cps.exe
RetVal = Shell(CmdLine, 4) ' launch CPS Plus using command line defined above
If RetVal = 0 Then ' error - cps not found
Beep: MsgBox ("Cannot Find " & CmdLine) ' display warning
End If
Application.Wait Now + 0.00002 ' delay
AppActivate Application.Caption ' set the focus back to excel
StartCollecting ' set up excel to collect data from CPS Plus
End Sub

Sub StartCollecting()
RowPtr = 2: ColPtr = 1 ' initialize global variables
Sheets("Sheet1").Activate ' activate sheet 1 and set up a DDE link to CPS Plus
Sheets("Sheet1").Cells(1, 50).Formula = "=CPSPLUS|DRIVER!NEWDATA"
Sheets("Sheet1").Cells(2, 50).Formula = "=CPSPLUS|DRIVER!NEWDATA"
Sheets("Sheet1").Cells(3, 50).Formula = "=CPSPLUS|DRIVER!NEWDATA"
ActiveWorkbook.SetLinkOnData "CPSPLUS|DRIVER!NEWDATA", "GetCPSData"
' the SetLinkOnData method causes excel to run the GetCPSData macro
' automatically when new data is available in the CPS Plus.
End Sub

Sub GetCPSData()
' this example is setup to collect data from COM1
On Error Resume Next
CPSVal = "COM" & PortNum & "_VALUE"
chan = DDEInitiate("CPSPLUS", "DRIVER")
F1 = DDERequest(chan, CPSVal)
CPS$ = F1(1)

CPSVal = "COM" & PortNum & "_DATEA_STAMP"
F2 = DDERequest(chan, CPSVal)
CPS2$ = F2(1)

CPSVal = "COM" & PortNum & "_TIME_STAMP"
F3 = DDERequest(chan, CPSVal)
CPS3$ = F3(1)

Sheets("Sheet1").Cells(RowPtr, 1).Formula = CPS$
Sheets("Sheet1").Cells(RowPtr, 2).Formula = CPS2$
Sheets("Sheet1").Cells(RowPtr, 3).Formula = CPS3$
RowPtr = RowPtr + 1
DDETerminate chan
End Sub

Sub Auto_Close() ' this macro runs automatically when you close the spreadsheet
StopCollecting ' set up excel to stop collecting data from CPS Plus
'chan = DDEInitiate("CPSPLUS", "DRIVER")
'DDEExecute chan, "[UnloadCPS]" ' tell CPS to quit
'DDETerminate chan
End Sub

Sub StopCollecting()
Sheets("Sheet1").Activate ' activate sheet1
Sheets("Sheet1").Cells(1, 50).Formula = "" ' remove the dde link from R1C50
Sheets("Sheet1").Cells(2, 50).Formula = "" ' remove the dde link from R1C50
ActiveWorkbook.SetLinkOnData "CPSPLUS|DRIVER!NEWDATA", ""
' shut down the SetLinkOnData function by
' assigning it an empty string to the macro name
End Sub

Как мне добиться чтобы данные от весов в Эксель вводились через равные промежутки времени (черех минуту, через две минуты) или хотябы чтобы строки дубликаты удалялись?
Заранее благодарю
Автор: Yuk
Дата сообщения: 30.08.2006 14:25
utmpatpc
Попробуй поизменять число здесь:
Цитата:
Application.Wait Now + 0.00002 ' delay

Можно задать задержку явным образом (10 секунд):
Код: Application.Wait Now +TimeValue("0:00:10")
Автор: namomelkorsp
Дата сообщения: 30.08.2006 15:42

Цитата:
Добавлено:
namomelkorsp
Посмотри мои ответы для Anton T.
Список заполняется либо через свойство RowSource, либо методом AddItem. Можно также заполнить из массива через свойства List или Column.
А насчет литературы - хелп и гугл.


Да это я знаю в принципе но я не могу понять что у меня с этими списками: списки создовал не я. У них нет никаких свойств, их нельзя изменять в размерах и при выделении даве в режиме конструктора показывается не имя списка а номер ячейки (((

Как с таким списком работать я не могу понять.

Добавлено:
Да еще извеняюсь но у меня вопрос который скорее всего уже гдето здесь проскакивал.
Просто срочно надо а искать некогда.
Впрос как в VBA обращатся к ячейкам не по букве и индексу а по двум индексам.
Автор: Yuk
Дата сообщения: 30.08.2006 16:02
namomelkorsp
Проверь свойство BoundColumn.


Цитата:
как в VBA обращатся к ячейкам не по букве и индексу а по двум индексам.

Cells(строка,столбец)
Автор: vladimir_oz
Дата сообщения: 30.08.2006 16:07

Цитата:
Добавлено:
vladimir_oz

Цитата:Мне надо распечатать userform на принтер. Но так как форма достаточно большая то при печати через printform она не умещается на листе.
Вопрос как распечатать ее или в альфомном формате (повернуть на 90 градусов) или уменьшить масштаб рисунка. Лучше первое

Взято отсюда.
Делается PrintScreen формы, вставляется во временный лист, который уже печатается как угодно. Подробнее здесь .

Yuk Спасибо заработало!
Автор: namomelkorsp
Дата сообщения: 31.08.2006 11:41
Доброго времени суток.
я отркываю текстовый фаил и записываю его в ячейки по строчно перед этим разбив строки на столбцы. Так вот чтение файла происходит быстро, разбор строк тоже быстро а вот запись в ячейку происходит очееееень медленно
в ячейку произвожу запись через
Worksheets("FirmatSortedCopy").Cells(i, j + 44).Value = s1
Подскажите как ускорить этот процесс.
тк мне надо заполнить 7000 ячеек, а 80 ячеек оно заполняло около 10-ти минут )))
кто знает подскажите
Автор: Anton T
Дата сообщения: 31.08.2006 12:40
Yuk

Цитата:
Практически то же самое с небольшими изменениями

Большое спасибо, пойду пить пить пиво за тове здоровье!
Автор: Yuk
Дата сообщения: 31.08.2006 15:10
namomelkorsp
Что-то уж правда сильно медленно. Формулы, условное форматирование, обработчики событий есть?
Попробуй сначала записать в массив (такого же размера, что и область данных), который затем записать в ячейки зараз. С памятью эксел работает гораздо быстрее. Если размерность данных неизвестна, используй динамический массив. Тут были примеры, например в шапке по ранжированию.
Автор: namomelkorsp
Дата сообщения: 31.08.2006 15:24
Yuk
Нету ни формул ничего такого почему так тормозит не знаю.
А с массивами сделал работает быстро но пока что коряво ))
Спс.
Автор: sgulinsky
Дата сообщения: 01.09.2006 09:36
Yuk Bol'shoe spasibo za poyasnenie, no problema okazalas' ne v RowLevels.

Ya pytalas' otkryt' outline cherez VBA, vot tak:

KOD
Цитата:


For i = 1 To Sheets.Count
TheName = Sheets(i).Name
Sheets(TheName).Unprotect
Sheets(TheName).Activate
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
Next i
ne srabatyvaet


A nado bylo tak:
For i = 1 To Sheets.Count
TheName = Sheets(i).Name
Sheets(TheName).Unprotect
Sheets(TheName).Select
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
Next i

Pochemu-to ShowLevels rabotaet posle .Select, no ne posle .Activate... A
Автор: namomelkorsp
Дата сообщения: 01.09.2006 10:52
Создаю динамический массив:

Dim MyArray()
ReDim MyArray(1 To 4)
ReDim MyArray(1 To 3, 1 To 4)

это получится двумерный массив
так вот если я меняю его размер
ReDim Preserve MyArray(1 To 3, 1 To 7)
тогда все работает а мне нужно менять первый размер :
ReDim Preserve MyArray(1 To 7, 1 To 3)
Тогда пишет "out of range"
Кто знает как поменять размер помогите плиз.
P.S В массиве есть данные их нельзя удалять и нельзя поменять местами строки и столбцы.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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