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

» Excel VBA (часть 3)

Автор: Stradler
Дата сообщения: 23.04.2012 01:30
Думаю без макросов не получится. Я в них не бум-бум, поэтому сюда и пишу. Годятся любые варианты. Сделать книгу ЭКСЕЛ с листами содержащими чертежи тоже можно (и печатать нужные листы из этой книги), но это не совсем удобно. Во первых большое количество чертежей, во вторых появляется доп. файл. Основной документ в дальнейшем будет сохраняться в папку с проектом, чтобы в будущем не забыть, что было заказано.
Автор: Stradler
Дата сообщения: 23.04.2012 08:11
Где-то в нете наткнулся на более-менее подходящий вариант. Запускать печать по гипперссылкам поочередно (открыть ПДФ, печать, закрыть ПДФ, открыть ПДФ, печать ...... и так далее) можно ли так реализовать задачу?
Автор: psiho
Дата сообщения: 23.04.2012 08:53
Stradler
вот попробуй:
http://rghost.ru/37722967
Только в ячейки "D2","D3" и "D4" свои гиперссылки подставь и, если у тебя на листе нет шапки, то в редакторе замени "i=2" на "i=1"
Автор: Stradler
Дата сообщения: 23.04.2012 14:01
Благодарю за отзывчивость. Буду пробовать.
......
При запуске файла вылетает окошко (что-то видимо про совместимость с 64 разрядами)
[img] [/img]
Также сразу запускается окно бэйсика с програмным кодом. Что там поправить? У меня как раз Офис 64-bit.
......
Изменил "Declare Function" на "Declare PtrSafe Function" ошибка ушла, но не печатает (вообще ничего не происходит.).
Прикрепил более приближенную таблицу.
Ссылка
Автор: psiho
Дата сообщения: 23.04.2012 16:01

Цитата:
но не печатает (вообще ничего не происходит.)


А в какой программе по умолчанию открываются файлы с расширением "pdf"?

Добавлено:

Цитата:
Прикрепил более приближенную таблицу.

Вот с этого примера и нужно было начинать. А то в первом у тебя в столбце "A" нет пустых ячеек, я на них и ориентировался, т.е. код прекращал печатать, если в очередной ячейке столбца А пустое значение. Поэтому у тебя во втором случае и не печатает, т.к. сразу идёт первая пустая ячейка в столбце А. Нужно немного доработать.

Добавлено:
Stradler
Вот держи под данный вид листа:
http://rghost.ru/37728799
Только "Declare Function" замени на свою для офиса 64
Автор: Stradler
Дата сообщения: 24.04.2012 13:27
psiho
Спасибо за помощь. Один раз даже удалось распечатать. Потом че-то перестало. Короче решил лист ссылками набить, потом буду прикручивать.
Автор: V4mp
Дата сообщения: 24.04.2012 18:16
Всем привет.
Может кто-нибудь подскажет нормальную dll-ку (add-in) для отправки-приема почты через vba?
Отправка через CDO работает, а вот прием... Замучался искать(

Добавлено:
Зашел с другой стороны) Буду использовать консольные клиенты(например postie) и запускать их скрыто через CreateProcess.
Автор: timex
Дата сообщения: 25.04.2012 10:44
подскажите пожалуйта из-за чего проблема? офис 2007 (12.0.6550.5004) sp2 mso (12.0.6554.5001)

записываю в макрос действия - выделяю несколько листов, на них по очереди выбираю столбцы и ввожу нужную ширину - 35, 24, 10. останавливаю запись макроса.

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

те же грабли при удалении столбцов. выбираю лист - удаляю два последних столбца (J и K), на следующем листе и так на всех. всего 23 листа. при записи макроса - всё ок, при выполнении же удаляются все столбцы кроме первого. только два листа остались в нужном для меня виде, (первый и один из последних). остальные - рисунки сместились, столбцы все удалились...

т.е. из-за чего такая разница в поведении Экселя при записи макроса и при его выполнении (на одном и том же файле)???!?

может паузу нужно руками в макросе выставлять? подозрения именно на это т.к. файл большой (7 мб в xlsx или 15 мб в старом формате) и возможно vba ставит команды в очередь и какие-то выполняются раньше чем нужно...

----
добавлено: пробовал удалить макросом один столбец на одном листе - те же грабли...

да, книга на всех листах содержит зафиксированную верхнюю строку и рисунок в неё (как шапка у web-сайтов)... может в этом дело?
---------
добавлено: дело оказалось в наличии объединённых строк. отменил - макрос сработал как задумано.

тогда вопрос - как убрать влияние сгруппированнх ячеек на выполнение макроса - т.е. чтобы результат выполнения записанного макроса был такой же как и при записи этих действий?


Автор: V4mp
Дата сообщения: 25.04.2012 22:02
timex
Ну если уж по быстрому - то
1 - включите запись макроса
2 - отмените объединение нужных строк
3 - делайте что нужно
4 - примените объединение строк
5 - остановите запись макроса

Как то так
Автор: timex
Дата сообщения: 27.04.2012 10:41
V4mp, а какой тогда смысл в макросе? ведь он должен будет испольозваться на уже подготовленных листах с объединёнными там где надо ячейками!!


кстати, проблему решил - как записывалось экселем и как сделал руками:

Код:
Sheets("Модульные").Select
Columns("J:K").Select
Selected.Delete Shift:=xlToLeft
Автор: SAS888
Дата сообщения: 28.04.2012 02:54
timex
Адрес верхней левой ячейки объекта на рабочем листе можно определить так:

Код: MsgBox ActiveSheet.Shapes("Rectangle 1").TopLeftCell.Address
Автор: V4mp
Дата сообщения: 28.04.2012 13:02
timex
ну если уж руками, то тогда вообще так
Sheets("Модульные").Columns("J:K").Delete Shift:=xlToLeft
быстрее выполняться будет

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

Код:
Option Explicit
Option Private Module

Public hwndMain As Long

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal WindowStyles As Long) As Long
Private Declare Function ShowWindow Lib "user32.dll" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Enum WindowStyles
WS_OVERLAPPED = &H0
WS_POPUP = &H80000000
WS_CHILD = &H40000000
WS_MINIMIZE = &H20000000
WS_VISIBLE = &H10000000
WS_DISABLED = &H8000000
WS_CLIPSIBLINGS = &H4000000
WS_CLIPCHILDREN = &H2000000
WS_MAXIMIZE = &H1000000
WS_BORDER = &H800000
WS_DLGFRAME = &H400000
WS_VSCROLL = &H200000
WS_HSCROLL = &H100000
WS_SYSMENU = &H80000
WS_THICKFRAME = &H40000
WS_GROUP = &H20000
WS_TABSTOP = &H10000
WS_MINIMIZEBOX = &H20000
WS_MAXIMIZEBOX = &H10000
WS_CAPTION = WS_BORDER Or WS_DLGFRAME
WS_TILED = WS_OVERLAPPED
WS_ICONIC = WS_MINIMIZE
WS_SIZEBOX = WS_THICKFRAME
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU
WS_CHILDWINDOW = WS_CHILD
End Enum

Public Sub FormStart(fForm As MSForms.UserForm, bMax As Boolean)
Application.EnableCancelKey = xlDisabled
hwndMain = FindWindow("ThunderDFrame", fForm.Caption)
Do While hwndMain = 0
hwndMain = FindWindow("ThunderDFrame", fForm.Caption)
DoEvents
Loop
If bMax = True Then
SetWindowLong hwndMain, -16, WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX + WS_MAXIMIZEBOX '+ WS_SIZEBOX
Else
SetWindowLong hwndMain, -16, WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX '+ WS_MAXIMIZEBOX '+ WS_SIZEBOX
End If
DoEvents
ShowWindow hwndMain, 1
End Sub
Автор: ANRY_7777
Дата сообщения: 10.05.2012 13:30
Копирование ячеек из одного файла в другой с условием

Есть два файла
файл 1

файл 2


Важно в файле 2 наименования не дублируются. Нужно из файла 1 взять цену за кг и поместить ее к соответствующему наименованию в файл 2 в столбец Д
Как видно на картинка то в файле 1 наименование дублируются тогда нужно под соответствующим наименованием в файле 2 Создать строку и скопировать цену за кг.

Т.е. например по грепфрукту. в файле 2 должно появиться 3 позиции с ценами на кг 45, 38, 12 грн
То есть если грепфрукту встречается в файле 1, один раз то просто скопируйте его цену за кг, а если больше 1 то уже в файле 2 добавить позицию в грепфруктом и вставить соответственно цену 38 и цену 12. Саму условие я понимаю но как то все описать на VBA. (( Буду очень благодарен за помощь. Спасибо
Автор: psiho
Дата сообщения: 10.05.2012 19:58

Цитата:
Копирование ячеек из одного файла в другой с условием

Не совсем ясно с партией товара. В файле 1 её нет?
Автор: iDancer
Дата сообщения: 16.05.2012 17:16
Помогите нубу с кодом в VBA Excel, старые работы которые делали на парах остались на учебе, дали на дом задание и я забыл все -_-
Нужно составить программу для вычисления квадратного уравнения AX2 + BX + C = 0 при этом A не равно нулю. Получилось это:

Цитата:
Dim a As Single, b As Single, c As Single
Private Sub CommandButton1_Click()
a = Val(TextBox1)
b = Val(TextBox2)
c = Val(TextBox3)
d = b * b - 4 * a * c
Label5.Caption = Sqr(d)
If d <= 0 Then
MsgBox "Нет корней"
Else
If a <> 0 Then
x1 = (-b - Sqr(d)) / (2 * a)
x2 = (-b + Sqr(d)) / (2 * a)
Label8.Caption = x1
Label9.Caption = x2
Else
MsgBox "Нет решения"
End If
End Sub

Выглядит вот так: http://img688.imageshack.us/img688/3861/1232v.jpg
Автор: Ann211
Дата сообщения: 16.05.2012 18:05
помогите решить задачу(никак не получается

Переписать положительные элементы массива X(100) и Y(80) в массив Z подряд.(примечание: запись в массив Z осуществляется в подпрограмме)
Автор: SAS888
Дата сообщения: 17.05.2012 03:10
Ann211
1. Что значит "подряд"?
2. Исходные массивы X и Y уже имеются? Или их нужно откуда-то взять (получить)?
Автор: psiho
Дата сообщения: 17.05.2012 06:55

Цитата:
Помогите нубу с кодом в VBA Excel

iDancer, забыл один оператор "End if" в конце поставить, а именно:

Код: Dim a As Single, b As Single, c As Single
Private Sub CommandButton1_Click()
a = Val(TextBox1)
b = Val(TextBox2)
c = Val(TextBox3)
d = b * b - 4 * a * c
Label5.Caption = Sqr(d)
If d <= 0 Then
MsgBox "Нет корней"
Else
If a <> 0 Then
x1 = (-b - Sqr(d)) / (2 * a)
x2 = (-b + Sqr(d)) / (2 * a)
Label8.Caption = x1
Label9.Caption = x2
Else
MsgBox "Нет решения"
End If
End if
End Sub
Автор: grbdv
Дата сообщения: 17.05.2012 11:17
psiho
Вот так немного повеселее будет:
Dim lNewDim&
lNewDim = lNewDim + 1
ReDim Preserve Z(lNewDim)
Z(lNewDim) = X(i)

Да и размерности обоих исходных массивов лучше определить заранее, а не в цикле...
Dim lLB&, lUB&
lLB = LBound(X): lUB = UBound(X)
For i = lLB To lUB

И, почему > 0 , а не >=?
Автор: psiho
Дата сообщения: 17.05.2012 11:23

Цитата:
И, почему > 0 , а не >=?

Потому что автору необходимы только положительные значения.
Автор: grbdv
Дата сообщения: 17.05.2012 12:02
psiho
А разве 0 отрицательное?
Автор: hitridjus
Дата сообщения: 17.05.2012 16:33
Пытался найти способ доработать UDF, чтобы работало с закрытой книгой. Но все усилия тщетны. На одном из форумов нашел подобное решение проблемы (с помощью Variant http://www.planetaexcel.ru/forum.php?thread_id=16634&forumaction=newreply&page_forum=lastpage&allnum_forum=5), но ни как не могу внедрить его себе.
http://forum.ru-board.com/topic.cgi?forum=33&topic=10903&start=2410&limit=1&m=1#1
Автор: psiho
Дата сообщения: 18.05.2012 06:32

Цитата:
ни как не могу внедрить его себе.


Вместо "Range" должно быть "Variant",т.е.:

Код: Function hitridjus(x As String, a As Variant, b As Variant)
Автор: timex
Дата сообщения: 18.05.2012 12:55
прошу помощи, подскажите каким образом код vba может поставить пароль на другой (открытый) проект?

нашёл только свойство "только для чтения"
---
Const vbext_pp_locked = 1
Const vbext_pp_none = 0
Member of VBIDE.vbext_ProjectProtection
---
Protection Property (VBA Add-In Object Model)
Returns a value indicating the state of protection of a project. Read-only.
Return Values
vbext_pp_locked The specified project is locked.
vbext_pp_none The specified project isn't protected.
---

а мне защитить проект нужно. программно.
Автор: KF121
Дата сообщения: 18.05.2012 13:00
так не работает?

Код: Worksheets(stSheet).Protect Password:="xxxx"
Автор: timex
Дата сообщения: 18.05.2012 14:14
KF121, не на лист, не на книгу, а на vba-проект.
редактор VBA > Tools > VBA Project Properties > Protection.

чтобы конечные юзеры не смогли смотреть код макросов.

знаю, что можно, на planetaexcel, vbanet.ru, на
http://www.sql.ru/forum/actualthread.aspx?bid=22&tid=278951&pg=1
народ упоминает о таких возможностях, но что-то никак решения найти не могу
Автор: SAS888
Дата сообщения: 20.05.2012 09:00
grbdv

Цитата:
Вот так немного повеселее будет...

Как известно, при выполнении ReDim Preserve, определяется новый массив с указанной размерностью, а затем все требуемые элементы массива переписываются заново. Поэтому, применять данный оператор в цикле не рационально.
Для того, чтобы стало "еще веселее", лучше исходно определить массив с максимально возможной размерностью, затем заполнить его требуемыми значениями, и после этого "обрезать" массив результатов, используя ReDim Preserve всего один раз. Например, так:

Код: Sub qq()
Dim a As Integer, b As Integer, c As Integer, d As Integer
Dim i As Integer, j As Integer, Z()
a = LBound(X): b = UBound(X): c = LBound(Y): d = UBound(Y)
ReDim Z((b - a + 1) + (d - c + 1)): j = LBound(Z)
For i = a To b
If X(i) > 0 Then
Z(j) = X(i): j = j + 1
End If
Next
For i = c To d
If Y(i) > 0 Then
Z(j) = Y(i): j = j + 1
End If
Next
ReDim Preserve Z(j)
End Sub
Автор: gangsterA
Дата сообщения: 22.05.2012 15:55
Коллеги, добрый день!

Хотелось бы узнать возможно ли решить такую задачу. И если возможно предложить какое-нибудь описание решения.

Задача в следующем:

При нажатии на кнопку в Excell мы запускаем в с помощью функции WinApi CreateProcess сторонний .exe файл. После того как отработает этот exe файл он как-то, должен сообщить Excell что он отработал.

Вопрос в том, как excell может понять, что exe отработал и прочитать, то что он написал в stdout?

Естественно, что exe файл запускается асинхронно.
Как сделать с синхронным запускам и я так знаю =)
Автор: psiho
Дата сообщения: 22.05.2012 16:51

Цитата:
то что он написаль в stdout

Пардон, где он должен записать свои данные?
На диск может этот файл записывать данные и,если "да", то в каком формате?
Автор: gangsterA
Дата сообщения: 22.05.2012 23:21
Хмм..

Процесс ничего не записывает в файл. Результат сохраняется в некотором объекте передаваемом в CreateProcess. Если делать синхронно то stdout можно взять из свойств процесса. Т.е. это обычный exe файл который мы запускаем в консоли и он нам что-то та пишет (в консоли), т.е. я тут имел ввиду, под stout стандартный поток вывода. Хотя хз может в CreateProcess можно задать и имя файла для перенаправления stdout.

А формат естественно текстовый.

Самый главный вопрос как улавить в excell что процесс отработал. А это скорей вопрос второстепенный...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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