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

» Excel VBA (часть 2)

Автор: ssa9999
Дата сообщения: 17.04.2008 08:59
вот это пилота-аж
то есть подменяем назначения команд меню
мегареспект.

Может быть, Вам известно что-либо по проблеме выше:
http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=1880#3

не выполняются, с описанной там картиной, методы Workbooks.Add, Workbooks.Open, Application.DisplayAlerts, и наверно еще другие тоже. Как-то зарублено. Как бы открыть?
Автор: dmention
Дата сообщения: 17.04.2008 09:30
Может не совсем про VBA, а может и на нем, но не хотелось бы усложнять... тем не менее вопрос такой:

Существует ли формула в Excel для выполнеия следующей функции?

Есть 2 столбца A и B. Нужно найти сумму построчных произведений значений столбца A на соответствующие им столбца B.

Можно конечно создать столбец C где вычислить произведения A * B, а потом суммировать их функцией Сумм или задать формулу = A1*B1 + A2*B2 + A3*B3..., но если строк 700 и более, а пар столбцов несколько десятков, то это затруднительно, и таблица неоправданно расширяется и Excel такую формулу может не дать забить.

Думаю не я первый задался этим вопросом. Подскажите, пожалуйста, как выполнить данное вычисление? Может у кого сеть написанная для Excel такая функция?

Итоговая задача: вычисление средневзвешанного значения, т.е. если A это количество, а B цена, то вычислить надо:

= (A1*B1 + A2*B2 + A3*B3)/СУММ(A1:A3)

Спасибо!

__________________________

Все, нашел, функция называется СУММПРОИЗВ()
Автор: SAS888
Дата сообщения: 17.04.2008 09:52
ssa9999
Т.к. Вы открываете одно приложение из другого, то проверьте, что в момент выполнения макроса Excel активно именно это приложение. Переключение активного приложения выполняется командой "AppActivate" (см. help по VBA).
Автор: AndVGri
Дата сообщения: 18.04.2008 00:08
dmention
=СУММПРОИЗВ(A1:A4,B1:B4)
Автор: gvserg1
Дата сообщения: 18.04.2008 11:24
Добрый день!

Столкнулся с такой вот проблемой: выделяю вручную массив (произволный). Нужно чтобы в каждой ячейке этого массива прописывалась формула ROUND, независимо от того значения там или формулы.
Вот попробовал сделать,. но так как с макросами особо не знаком, немного не вышло, никак не могу определить длину строки для формул. С обычными значениями все вышло нормально.
______________________________________________
наконец то разобрался в чем была ошибка.
Если кто то подскажет можно ли это дело сделать проще - буду благодарен!
________________________________________________
Теперь вопрос следующего характера:
для макросов создал свою менюшку и назначил "горячие" клавиши которые работают в сочетании с Alt. Но в моем случае когда я нажимаю Alt+R менюшка только подсвечивается но не выпадает, не так как стандартные менюшки. Тоесть я не могу далее вызывать подменю просто нажав горячую клавишу подменю, тоесть вызвать подменю нажав комбинацию Alt+R -> R. Для этого мне нужно нажимать Alt+R -> Enter -> R.
Это можно как то исправить?
http://slil.ru/25704499

Спасибо
Автор: ssa9999
Дата сообщения: 19.04.2008 12:04
Скорее всего глюк Excel, и не лечится.
Следует добавить свою команду в одно из стандартных меню
Автор: shadur
Дата сообщения: 21.04.2008 13:21
Уважаемые знатоки Excel VBA-а понимаю что обращаюсь к Вам с обременительной просьбой, но своими силами я с этой проблемой справиться не могу, а потому надеюсь на Ваше участие.
Прежде всего необходимы 2 макроса: 1- когда значение ячейки не равно 0, тогда должна добавляться строка, содержащая форматы и формулы из прежыдущей строки; 2- всякий раз при открытии книги необходимо, чтобы добавлялся лист с незаполненной формой.
Что касается формулы, то она, безусловно, также нуждается в улучшении.
Очень надеюсь на Вашу помощь и заранее Всем благодарен.

Файлик здесь http://slil.ru/25702016
Автор: Vitus_Bering
Дата сообщения: 21.04.2008 16:31
shadur
Некоторые решения
Автор: shadur
Дата сообщения: 21.04.2008 19:22
Vitus_Bering
Витус - то что надо. Благодарен Вам всей душой. Если можно, с Вашего позволения, поинтересуюсь нюансами. Поскольку Ваше детище сразу не стало понятным фруктом, ибо чувствуется в нем рука большого мастера, то позвольте задать Вам несколько уточняющих вопросов?
Автор: CEMEH
Дата сообщения: 21.04.2008 20:55
vasiliy74
Я не сильно силен в ВБА но попробую помочь

Итак, если нам надо просто вставить функцию, то мы можем включить запись макроса, набрать формулу ручками и посмотреть, что получится. Потом отредактировать в ручную.

Можно по другому:
Имеем формулу:
прим (она вписана в ячейку A1)

=ЕСЛИ((I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT))=0;0;((J72-I72)+(СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AF:$AF)+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AV:$AV))/$E$4-I73)/(I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT)/$E$4))

на ВБА будет так:
If range("I72")+ Application.WorksheetFunction.SumIf(range(Transactions_TransactionsB!F:F),B72,range(Transactions_TransactionsB!AT:AT)=0 then
range("A1")=0' то есть если условие выполняется, ставим 0 в ячейку А1
else' если условие не выполняется то...
range("A1")=range("J72")+range("I72")+(Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"), range("B72"), range("Transactions_TransactionsB!AF:AF"))+Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"),range("B72"),range("Transactions_TransactionsB!AV:AV"))/range("E4")-173)/(range("I72")+Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"),range("B72"),range("Transactions_TransactionsB!AT:AT))/range("E4"))
end if

Код не проверял. Может какую кавычку или скобку не поставил. Вполне возможно кто-то предложит более простое решение. Повторюсь, я не силен в ВБА



Добавлено:
ВОПРОС

Возможно ли заставить ВБА залесть в интернет, открыть веб-страничку, выделить на ней все, скопировать, вставить на лист1 (использовать формат конечных ячеек)

Особенно интересен вариант, когда вход на страничку закрыт логин/паролем. (известным логин/паролем)
Автор: SERGE_BLIZNUK
Дата сообщения: 22.04.2008 08:19
vasiliy74

Цитата:
=ЕСЛИ((I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT))=0;0;((J72-I72)+(СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AF:$AF)+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AV:$AV))/$E$4-I73)/(I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT)/$E$4))

что то не вижу проблемы... (за исключением того, что у меня нет книги Transactions_TransactionsB...

попробуйте так (в одну строчку!!!):

Код:
Cells(1, 1).FormulaLocal = "=ЕСЛИ((I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT))=0;0;((J72-I72)+(СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AF:$AF)+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AV:$AV))/$E$4-I73)/(I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT)/$E$4))"
Автор: Vitus_Bering
Дата сообщения: 22.04.2008 09:14
CEMEH

Цитата:
Возможно ли заставить ВБА залесть в интернет...

Такой функциональности у VBA нет, но можно написать dll c такими функциями.
Автор: nick7inc
Дата сообщения: 22.04.2008 11:40
SERGE_BLIZNUK

Цитата:
что то не вижу проблемы...

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

Добавлено:
Так что решения проблемы пока нет. У самого есть проблемный код, который не работает в определённых ситуациях из-за этого тупого переполнения внутреннего буфера Excel.

Добавлено:
Vitus_Bering

Цитата:
Цитата:Возможно ли заставить ВБА залесть в интернет...
Такой функциональности у VBA нет, но можно написать dll c такими функциями.

Думаю, что многое можно сделать средствами WinAPI (думаю, что можно воспользоваться системной dll, а не свою писать). Я недавно писал программу для управления прибором в VBA, взаимодействие с железом шло через Dll. Работает. Excel задумывается, прибор щёлкает, работает.
Автор: Vitus_Bering
Дата сообщения: 22.04.2008 12:19
nick7inc

Цитата:
можно воспользоваться системной dll

Согласен, кому, что больше нравится.
Автор: ssa9999
Дата сообщения: 22.04.2008 13:24
Вот именно, в наше время обычно всё можно сделать через OLE, всегда есть готовые библиотеки.

Для работы с инетом через OLE есть, как минимум:
1) Библиотека "Microsoft Internet Controls" (shdocvw.dll)
2) к Visual Studio 6 прилагался элемент ActiveX "Internet Transfer" (Inet.ocx)

Чё с ними делать - см. справку MSDN, или в большинстве учебников по Бейсику что-нибудь написано про это
Автор: TONADOOM
Дата сообщения: 22.04.2008 19:28
CEMEH

Цитата:
Возможно ли заставить ВБА залесть в интернет, открыть веб-страничку, выделить на ней все, скопировать, вставить на лист1 (использовать формат конечных ячеек)

это сделать можно, называется - ВЭБ-ЗАПРОС. Чтоб изучить это - надо включить запись макросов и вставить на страницу ВЭБ-ЗАПРОС, потом в полученном коде макроса будет вырисовываться необходимое решение.
Тема настолько нетривиальна и индивидуальна в каждом случае, что для обработки данных придется изучить парсинг HTML страниц, но после - радоваться результату.
Лично у меня на изучение применения запросов при более-менее сносном знании основ ВБА ушло 2 месяца ...
Всё самое вкусное в данном случае находится в QueryTables , ищите всё, что связано с этим словом в гугле ...

Чтоб не так сильно мучаться - можно на необходимой Вам странице, открытой в браузере, выделить и скопировать необходимую информацию, потом - вставить в EXCEL. Посмотрите что получится, потом можно изменить свойства этого запроса через стандартное меню EXCEL.

Добавлено:
У меня есть вопрос к гуру.
кто-либо знаком с темой получения информации при помоши запросов к SOAP?
дополнение для работы с SOAP выходило для офисса XP и 2003, а вот для 2007 не было.
Конкретно моя проблемма - надо пример как написать на VBA код, который "заберет" в нужную мне переменную XML файл.
имеющаяся у меня информация - следующая:

Цитата:
HTTP POST
The following is a sample HTTP POST request and response. The placeholders shown need to be replaced with actual values.

POST /Services/EmExService.asmx/FindDetail HTTP/1.1
Host: www.autoemex.ru
Content-Type: application/x-www-form-urlencoded
Content-Length: length

_Login=string&_Password=string&_MakeLogo=string&_DetailNum=string&_Substs=string
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">string</string>

буду благодарен за любой совет.
Автор: CEMEH
Дата сообщения: 22.04.2008 21:08
Vitus_Bering
nick7inc
Если бы только еще знать, что такое dll и WinAPI. Я знгаю, что эти штуки есть и не более (((
Есть компилятор Бэйсик 3 (русский) и 5 (нерусский) Наверное у них возможностей больше в плане dll и WinAPI. Но максимум, что я на них смог сделать, это составление ЮзерФорм, (даже не знаю, как создать исполняемый файл exe)

пс.
Сегодня пришла в голову мысль:
Пишем файл Excel с безобидной табличкой "Отчет моему боссу о проделанной работе" по умолчанию все столбцы с отчетом скрыты и защищены паролем. В книге макрос: - "при открытии книги снять пароль, отобразить столбцы"
Отправляю "отчет" боссу. Он его получает и гневно ругается - где отчет? Я его не вижу!
- Иван Иванович! Ничего страшного, поставьте низкий уровень безопасности и все увидите.
Самое интересное в продолжении макроса...
... отправить исходящее по электронной почте боссу моего босса "Ты редиска"
И это самое безобидное из всех возможностей.

Не пинайте за флейм

Добавлено:
TONADOOM
СУПЕР!!! Спасибо.
Сейчас испытал, работает. Но вот с логинами/паролями как - не знаю.
Автор: nick7inc
Дата сообщения: 23.04.2008 10:29
CEMEH

Цитата:
Если бы только еще знать, что такое dll и WinAPI.

Смотрите сначала в шапке: WinApi. Лекция из курса "Основы офисного программирования и язык VBA" Если коротко, то можно объяснить, что такое WinApi так. У VBA есть стандартный, но ограниченый набор процедур и функций. Иногда приходится сделать что-то, чего нет в этом наборе, либо есть, но програмиста не устраивает. Например, нам надо вывести диалог выбора имени папки или выбора цвета. В первом случае у VBA есть только диалог "Сохранить как" и "Открыть". Можно ими воспользоваться, а можно сделать средствами WINAPI
[more=Далее....]
1. Добавляем новый модуль в проект со следующим содержимым (см. ниже).
Здесь и происходит взаимодействие с WinAPI. Обратите внимание на строчки типа Public Declare Function SHGetSpecialFolderLocation Lib "Shell32.DLL". Они означают, что процедура или функция с именем SHGetSpecialFolderLocation берутся не из вашего кода, не из стандартного набора VBA, а из файла динамической библиотеки Shell32.DLL. Как я понял (если не прав - поправьте), все процедуры и функции, которые берутся таким же образом из стандартных библиотек системы (*.dll), называются WinAPI:

Код: Option Explicit

Public Const dhcMaxPath = 260
Public Const dhcNoError = 0&
Public Const dhcErrorExtendedError = 1208&
Public Const MAX_PATH = 260
Public Declare Function SHGetSpecialFolderLocation Lib "Shell32.DLL" (ByVal hwndOwner As Long, ByVal Folder As Long, ByRef idl As Long) As Long ' Shell types
Public Declare Function SHBrowseForFolder Lib "Shell32.DLL" (ByRef bi As BrowseInfo) As Long
Public Declare Function SHGetPathFromIDList Lib "Shell32.DLL" (ByVal idl As Long, ByVal Path As String) As Integer
Public Type BrowseInfo
hwndOwner As Long ' Owner
pidlRoot As Long ' Can be null
strDisplayName As String ' Rcvs display name of folder (32 bytes)
strTitle As String ' title/instructions for user
ulFlags As Long ' 0 or BIF constants
' You won't use any of the following fields, from VBA.
lpfn As Long ' Address for callback: use NULL
lParam As Long ' Passes to callback
iImage As Long ' index to the system image list
End Type

Public Function dhBrowseForFolder( _
ByVal lngCSIDL As Long, ByVal lngBifFlags As Long, strFolder As String, _
Optional ByVal hWnd As Long = 0, _
Optional strTitle As String = "Select Directory") As Long
Dim usrBrws As BrowseInfo
Dim lngReturn As Long
Dim lngIDL As Long
If SHGetSpecialFolderLocation(hWnd, lngCSIDL, lngIDL) = 0 Then
With usrBrws
.hwndOwner = hWnd
.pidlRoot = lngIDL
.strDisplayName = String$(dhcMaxPath, vbNullChar)
.strTitle = strTitle
.ulFlags = lngBifFlags
End With
lngIDL = SHBrowseForFolder(usrBrws)
If lngIDL Then
strFolder = String$(dhcMaxPath, vbNullChar)
If SHGetPathFromIDList(lngIDL, strFolder) Then
strFolder = dhTrimNull(strFolder)
lngReturn = dhcNoError
Else
strFolder = dhTrimNull(usrBrws.strDisplayName)
lngReturn = dhcNoError
End If
Else
lngReturn = dhcErrorExtendedError
End If
Else
lngReturn = dhcErrorExtendedError
End If
dhBrowseForFolder = lngReturn
End Function

Private Function dhTrimNull(ByVal strValue As String) As String
Dim intPos As Integer
intPos = InStr(strValue, vbNullChar)
Select Case intPos
Case 0
dhTrimNull = strValue
Case 1
dhTrimNull = ""
Case Is > 1
dhTrimNull = Left$(strValue, intPos - 1)
End Select
End Function
Автор: David Kats
Дата сообщения: 23.04.2008 11:34
Всем привет! Кто-нибудь сталкивался с переносом данных из 1С в Эксель, или наоборот?
В принципе у меня все получается. Только не могу закрыть книгу Эксель из 1С.
Пишу такой код:
ApplicationExcel.Workbooks.Close("ПутьИИмяКниги.xls");

При выполнении выдает сообщение, что в методе Close нехватает параметров...
Автор: nick7inc
Дата сообщения: 23.04.2008 12:24
David Kats
Есть такая штука, как справка. Там чётко написано что и как передавать:

Цитата:
Workbooks("BOOK1.XLS").Close SaveChanges:=False
Автор: David Kats
Дата сообщения: 23.04.2008 12:35
nick7inc
Спасибо, конечно, за внимание. Однако, замечу, что есть еще такая штука, как ПЛАТФОРМА 1С. И когда обращаешься к MS Excel ИЗ ЕЕ кода, то конструкция, предложенная Вами, к сожалению, не работает. В том-то и вопрос КАК правильно обращаться к методам Экселя ИЗ ДРУГИХ приложений НЕ MicroSoft?
Автор: nick7inc
Дата сообщения: 23.04.2008 12:55
David Kats

Цитата:
ApplicationExcel.Workbooks.Close("ПутьИИмяКниги.xls")

Тогда скажите, откуда у вас этот кусок кода? В VBA так не пишут, может вам нужна помощь по специфическому бейсику (от фирмы 1C)? Я серьёзно.

Добавлено:
Посмотрите, вы имя книги не в том месте передаёте.
Автор: ssa9999
Дата сообщения: 23.04.2008 14:31
1) Что вообще такое "перенос данных из 1С в Excel"? ведь 1Сом можно сохранить таблицу в формате Excel. Не надо никакой химии

а в обратном направлении я бы переносил через ADO+ODBC. Работает в сотни раз быстрее

2) Действительно, имя книги надо передавать не методу Close, а коллекции Workbooks

а методу Close параметр SaveChanges можно передавать (если вообще надо передавать этот параметр) в виде 0 или -1 (что означает соответственно False и True)
Автор: TONADOOM
Дата сообщения: 23.04.2008 18:15
CEMEH
видел галочку "сохранить пароль" в свойствах диапазона данных запроса ...
надо исследовать свойства QueryTables - именно эта штука добавляет данные на страницу, а через меню реализованно не всё, на что эта штука способна.
Автор: CEMEH
Дата сообщения: 23.04.2008 19:39
Спасибо за ответы!


ВОПРОС
И еще вопрос, не столько из области программирования, сколько из области математики
Имеем строку из 20 ячеек, в которые занесены числа от 1 до 20
Надо получить все возможные варианты разнесения числел по ячейкам
т е
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
3 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

системы нет никакой условий три: Получить все возможные варианты, числа в строке не повторяются, одинаковых строк нет...
Автор: gvserg1
Дата сообщения: 23.04.2008 19:47

Цитата:
Теперь вопрос следующего характера:
для макросов создал свою менюшку и назначил "горячие" клавиши которые работают в сочетании с Alt. Но в моем случае когда я нажимаю Alt+R менюшка только подсвечивается но не выпадает, не так как стандартные менюшки. Тоесть я не могу далее вызывать подменю просто нажав горячую клавишу подменю, тоесть вызвать подменю нажав комбинацию Alt+R -> R. Для этого мне нужно нажимать Alt+R -> Enter -> R.
Это можно как то исправить?
http://slil.ru/25704499


А можно ли макросом емулировать нажатие кнопок, тоесть, например, назначить макрос на сочетание Alt+R, который бы запускался и открывал мое меню? Потом мне нужно только нажать R и сразу запустится подменю Rounding

Спасибо

Добавлено:

Цитата:
Имеем строку из 20 ячеек, в которые занесены числа от 1 до 20


Цитата:
Получить все возможные варианты

количество возможных вариантов: 20!=2432902008176640000
Автор: korvin76
Дата сообщения: 24.04.2008 10:12
Доброе время суток, уважаемые спецы.
Помогите решить задачи (ну не программист я, а по учебе задают ).

1.Для Word basic. Используя функции Inpput Box и Msg Box решить юбую математическую задачу.

2.Отформатировать несколько абзацев текста.

3.Написать программу форматирования таблицы:
(таблица 3 на 3, в каждой яцейки применить различное форматирование текста, напримерв одной ячейке текст выровнен по лев. краю, в другой по ценру, в третьей текст подчеркнутый, и т.д.)

4. Написать процедуру табулированияпростой функции с выводом в Excel
F = sin(x)
x в пределах [-П;+П]
x     F
-3.14 -0.054
-3.13 -0.055

5. Любая Вычислительная задача с элементами форматирования

6. Написать функцию, которая будет создавать дополнительные листы в Excel и на них организовывать вывод

7. В Excel вывести данные и разместить их по определенным ячейкам (Input Box) и вывести в Word.

Заранее спасибо за помощь
Автор: ssa9999
Дата сообщения: 24.04.2008 10:21
1) Что значит "получить все возможные варианты"?
Как получить, что ли? а разве есть варианты, как получить? Перебирать варианты, да и всё. В чем суть вопроса, не понял.

Чтобы не повторять комбинации, при перестановках следует, очевидно, придерживаться какой-нибудь системы. Самая очевидная система: на первое место ставим сначала число 1, на второе - первое из оставшихся, то есть 2. И т.д.

Потом на первое место ставим 2, на второе - первое из оставшихся, то есть 1. И т.д.

Вот и вся система.

Число комбинаций, как верно было замечено, равно 20!, то есть если вы намерены все эти комбинации где-то запечатлеть, то оставьте эту надежду - места нигде не хватит.

2) Эмулировать нажатие кнопок - стандартная команда во многих языках, SendKeys. И всего делов
Автор: lightyear
Дата сообщения: 24.04.2008 18:32
Добрый день
С наступающими праздниками

В связи с этими самыми праздниками передо мной возникла небольшая задачка, нужно отослать массу поздравлений (200 шт.)
Естественно, их очень не хотелось верстать руками, учитывая, что они достаточно однотипны, возникла мысль сделать список, по которому все это и сгенерить и выкинуть в Ворд, 1 поздравление - 1 страница, напечатать и вперед
+ это же решение чудно подойдет не только на Пасху), но и к любому другому празднику, когда нужны массовые поздравления.
Пользователь - секретарь, умеет что-от набить в Excel и запустить макрос .

VBA вообще пользуюсь от случая к случаю, но на этот раз он выглядел самым подходящим решением вопроса
Хочу сказать спасибо Вашему форуму, Вы дали мне направление поиска, а дальше все было легко

Все сделано элементарно в одной к книге, к которой макрос и прикреплен, никаких передаваемых или настраиваемых параметров не делалось, ибо на скорую руку
Устройство книги
В книге два листа
Список
Столбец А - № п/п - для макроса вообще говоря не надо, но для списка пригодиться
Столбец В - Фамилия
Столбец С - Имя Отчество (для украинского языка сразу в кличному відмінку, напр. Олено Миколаївно)
Столбец D - Пол (ж/м)
Столбец Е - Признак включения в список поздравляемых (0/1)
Остальные столбцы произвольны (наши товарищи их приспособили под фирмы и адреса)

Поздравление
Ячейка А1 - текст поздравления (многостроное набирается через Alt+Enter)
Ячейка B1 - обращение к мужчине (Дорогой/Любимый/Родной)
Ячейка C1 - обращение к женщине (Дорогая/Любимая/Родная)
Ячейка D1 - регалии (С уважением, большой начальник)
Ячейка E1 - посылатель поздравления (ФИО большого начальника)

И сам макрос, который по книге указанной структуры, выборочно для товарищей у кого в признаке поздравления стоит 1, генерит поздравления в ворд по ходу форматируя


Код:
Dim i As Integer
Dim g As String
Dim s As String
Dim s1 As String
Dim female As String
Dim male As String
Dim result As String
Dim wrd As Variant
Dim myRange As Variant

Worksheets("Поздравление").Activate
g = Range("A1").Value
male = Range("B1").Value
female = Range("C1").Value
s = Range("D1").Value
s1 = Range("E1").Value

Set wrd = GetObject(, "Word.Application")
wrd.Visible = True
wrd.Documents.Add
Set myRange = wrd.Selection
myRange.Font.Size = "16"
myRange.Font.Name = "Times New Roman"
myRange.Font.Italic = True

Worksheets("Список").Activate
For i = 1 To 1000 Step 1
result = ""

If Range("C" & i).Value = "" Then 'list ends
Exit For
End If

If Range("E" & i).Value = 1 Then 'include this record


If Range("D" & i).Value = "m" Then 'is man?
result = result & male
Else
result = result & female
End If

result = result & " " & Range("C" & i) & "!"

myRange.ParagraphFormat.Alignment = 1 'center
myRange.Font.Bold = True
myRange.TypeText result

myRange.TypeParagraph
myRange.TypeParagraph

myRange.ParagraphFormat.Alignment = 1 'center
myRange.Font.Bold = False
myRange.TypeText g

myRange.TypeParagraph
myRange.TypeParagraph
myRange.ParagraphFormat.Alignment = 0 'left
myRange.Font.Size = "14"
myRange.Font.Bold = True
myRange.TypeText s

myRange.TypeParagraph
myRange.TypeParagraph
myRange.ParagraphFormat.Alignment = 2 'right
myRange.TypeText s1

'break new page
myRange.InsertBreak Type:=7
End If
Next

Set wrd = Nothing
End Sub
Автор: CEMEH
Дата сообщения: 24.04.2008 22:18
На счет подбора комбинаций из 20 чисел: Сегодня написал макросик, который в каждой последующей строке меняет данные двух ячеек местами RND()
Вобщем затя безтолковая, ибо расчет по этим вариантам будет выполнятся годами.

А суть вопроса такова. Это связано с работой (График движения поездов)
Итак: Есть жесткий график движения поездов по станции, точное, заложенное в него время прибытия и отправления поездов как четных (туда) так и нечетных (обратно). Их 20 пар. На станции происходит смена локомотивных бригад. Т. е. прибывшая бригада с четным идет отдыхать, и после отдыха отправляется назад с нечетным. В полный расчет вникать не буду. Суть в том, что после отдыха бригаду надо запланировать под поезд обратно. Программа выдает "вилку" из двух значений времени "минимальное время возможного отправления" (раньше которого бригаду отправить категорически нельзя) и "максимально возможного времени" (после которого отправлять не рекомендуется т к начинает выплывать нерациональное использование) В итоге надо подвязать прибывшие бригады к отправляющимся поездам с минимальным отдыхом.
пример

вилка
миним максим №бриг №бриг время
туда обратно отпр
10:26     13:41     1         0:22
12:34     15:49     2         1:20
16:04     19:22     3        2:30
16:45     20:00     4         4:03
17:24     20:44     5         4:53
20:46     0:01     6         6:49
21:40     0:55     7         7:55
21:54     1:09     8         10:12
22:40     1:56     9        11:30
23:37     2:58     10         14:00
1:59     5:24     11         14:15
3:09     6:26     12         14:50
3:28     6:43     13          15:49
5:10     8:42     14         16:35
5:06     8:24     15         17:42
5:41     8:56     16         20:50
11:57     16:53     17         21:28
8:12     11:27     18         21:53
8:24     11:39     19         23:30

В итоге надо расставить 1, 2, 3, 4 .... 19 в столбце №бригады обратно с минимальными "расходами" Например, лучший вариант для первой прибывшей бригады отправиться в 11:30. Т е в столбце №бриг обратно на против 11:30 ставим однерку.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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