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

» Excel VBA

Автор: Anjin_Kazawa
Дата сообщения: 27.03.2006 16:53
icywind
Существует. Через отклонения.
К примеру есть значение в ячейке 1 и через кучу формул иммем значение в ячейке 10.
Тогда в ячейку 1 заносим первое значение к примеру 100, тогда в 10 ячейке имеет какое-то число находим отклонение (полученное значение делённое на искомое) и умножаем 10 на отклонение, кажись так. Если нужно то могу поискать, точно такое делал.

Add
Ещё если хочешь использовать SOLVER, то его нужно подключить в Reference, для этого вызываешь функцию посик решений, делаешь неважно что, потому в VBA и подключаешь.
Автор: icywind
Дата сообщения: 27.03.2006 20:17
Anjin_Kazawa
Поищи пожалуйста, буду благодарен
Автор: Anjin_Kazawa
Дата сообщения: 28.03.2006 10:59
icywind

Цитата:
Поищи пожалуйста, буду благодарен

Вообщем поскольку проект в котором использовал был коммерческим, быстренько перекинул алгоритм.
Код на VBA

Код:
Sub Посик_решения()
CurrentValueInFirstCell = 0 'текущее значение в первой ячейке
CureentValueInFormulaCell = 0 'текущее значение в ячейке после всех формул
CurrentValueInNeedCell = 0 'требуемое значение
Pr = 0 'отклонение полученного числа от требуемого
Col = ActiveCell.Column
Row = ActiveCell.Row
ActiveCell.SpecialCells(xlLastCell).Select
EndRow = ActiveCell.Row
Cells(Row, Col).Activate
Cells(Row, Col).Select

For I = 2 To EndRow
Cells(I, 1) = 100
CurrentValueInFirstCell = Cells(I, 1)
CureentValueInFormulaCell = Cells(I, 12)
CurrentValueInNeedCell = Cells(I, 13)
Pr = CurrentValueInNeedCell / CureentValueInFormulaCell
CurrentValueInFirstCell = CurrentValueInFirstCell * Pr
Cells(I, 1) = CurrentValueInFirstCell
Next I
End Sub
Автор: OchkaritO
Дата сообщения: 29.03.2006 11:26
aquaman77

Это код, который добавляет данные. Я подкорректировал, чтобы данные забирались из пятой строки, но на другой лист он их не добавляет, а заменяет...

Private Sub CommandButton1_Click()
Dim i As Integer
Dim z As Integer
Set w1 = ThisWorkbook.Worksheets("Work")
Set w2 = ThisWorkbook.Worksheets("DB")
i = 5
j = 1 w1.Activate
Range(Cells(i, 1), Cells(i, 10)).Copy w2.Cells(j, 1)
j=j+1
MsgBox "Данные успешно добавлены."
End Sub

Блин. Допиши, пожалуйста, чего ему еще не хватает.
Автор: aquaman77
Дата сообщения: 29.03.2006 23:24
OchkaritO
Насколько я понял, ты каждый раз после ввода данных на лист "Work" запускаешь скрипт для копирования строки в лист "DB"? так?
Гм, тогда переменной j нужно присвоить значение "w2.UsedRange.Rows.Count+1", а не 1, т.е.:

Код:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim z As Integer
Set w1 = ThisWorkbook.Worksheets("Work")
Set w2 = ThisWorkbook.Worksheets("DB")
i = 5
j = w2.UsedRange.Rows.Count + 1
w1.Activate
Range(Cells(i, 1), Cells(i, 10)).Copy w2.Cells(j, 1)
MsgBox "Данные успешно добавлены."
End Sub
Автор: OchkaritO
Дата сообщения: 31.03.2006 08:19
aquaman77

Работет. Но на страницу DB надо добавить еще одну запись со страницы Zarplata из ячейки I18. Данные в I18 изменяются с вводом данных на листе Work и должны добавляться в туже строку, где данные с листа . Тоесть:

Work Work Work Work Zarplata
Work Work Work Work Zarplata
и т.д.

Но в лист Work данные с Zarplata выводить нельзя.
Подскажи, как как реализовать.

И еще ворос в догонку про Календарь 11. При клике на ячейку вылезает календарь и указываешь число... Мож ссылку дашь, где данная процедура описывается? Спасибо.


Автор: aquaman77
Дата сообщения: 31.03.2006 10:33
OchkaritO
Если данные по зарплате постоянно обновляются в ячейке I18 листа "Zarplata", то
соответственно так же, как и в предыдущем случае:

Код:
Set w3 = ThisWorkbook.Worksheets("Zarplata")
w3.range("I18").copy w2.cells(j,11)
Автор: OchkaritO
Дата сообщения: 31.03.2006 11:21
aquaman77
Неа. вместо суммы пишет ССЫЛКА! и все тут.

Вот сам файлик, посмотри "на месте", пожалуйста.
http://pavel-x1.narod.ru/PRIMER.xls

Автор: aquaman77
Дата сообщения: 31.03.2006 11:48
OchkaritO

Если бы ты сразу сказал, что в ячейке I18 - не значение, а выражение, то проблем бы не возникло..

измени процедуру так:

Код:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim z As Integer
Set w1 = ThisWorkbook.Worksheets("Work")
Set w2 = ThisWorkbook.Worksheets("DB")
Set w3 = ThisWorkbook.Worksheets("Zarplata")
i = 5
j = w2.UsedRange.Rows.Count + 1
w1.Activate
Range(Cells(i, 1), Cells(i, 9)).Copy w2.Cells(j, 1)
w3.Range("I18").Copy
w2.Cells(j, 10).PasteSpecial Paste:=xlPasteValues
MsgBox "Данные успешно добавлены."
End Sub
Автор: felix25
Дата сообщения: 31.03.2006 13:52
VBA в Excel занимаюсь давно, но возникла потребность в VBA в Outlook:
Подскажите, как при приходе определенного сообщения, например с определенной темой, средствами VBA пересылать его указанному получателю.
Автор: dneprcomp
Дата сообщения: 31.03.2006 22:17
felix25
_http://msdn.microsoft.com/office/understanding/outlook/codesamples/default.aspx?pull=/library/en-us/dno2k3ta/html/odc_ac_olauto.asp#odc_ac_olauto_introduction
В примере для Access, но думаю подойдет для любой програмы, использующей VBA.
[more=Sending an Outlook Mail Message Programmatically]Sending an Outlook Mail Message Programmatically
Create a sample text file named Customers.txt in the My Documents folder.
Start Access, and create a database named Automation.mdb.
Note The samples in this article use the Automation.mdb database that is included as a downloadable file with this article.
Create a module and type the following line in the Declarations section if it is not already there:
Option Explicit

On the Tools menu, click References.
In the References box, click to select the Microsoft Outlook 11.0 Object Library, and then click OK.
Note If the Microsoft Outlook 11.0 Object Library does not appear in the Available References box, do the following:
In Windows Control Panel, double-click Add or Remove Programs.
In the list of installed programs, select Microsoft Office 2003, and then click Change. Microsoft Office 2003 Setup starts in maintenance mode.
Click Reinstall or Repair, and then click Next.
Click Detect and Repair errors in my Office installation, and then click Install.
Click OK to close the References dialog box.
Type or paste the following VBA procedure in the new module:
Код:
Sub sbSendMessage(Optional AttachmentPath)
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim objOutlookAttach As Outlook.Attachment

On Error GoTo ErrorMsgs

' Create the Outlook session.
Set objOutlook = CreateObject("Outlook.Application")
' Create the message.
Set objOutlookMsg = objOutlook.CreateItem(olMailItem)
With objOutlookMsg
' Add the To recipient(s) to the message. Substitute
' your names here.
Set objOutlookRecip = .Recipients.Add("Nancy Davolio")
objOutlookRecip.Type = olTo
' Add the CC recipient(s) to the message.
Set objOutlookRecip = .Recipients.Add("Andrew Fuller")
objOutlookRecip.Type = olCC
' Set the Subject, Body, and Importance of the message.
.Subject = "This is an Automation test with Microsoft Outlook"
.Body = "Last test." & vbCrLf & vbCrLf
.Importance = olImportanceHigh 'High importance
' Add attachments to the message.
If Not IsMissing(AttachmentPath) Then
Set objOutlookAttach = .Attachments.Add(AttachmentPath)
End If
' Resolve each Recipient's name.
For Each objOutlookRecip In .Recipients
If Not objOutlookRecip.Resolve Then
objOutlookMsg.Display
End If
End If
Next
.Send
End With
Set objOutlookMsg = Nothing
Set objOutlook = Nothing
Set objOutlookRecip = Nothing
Set objOutlookAttach = Nothing
ErrorMsgs:
If Err.Number = "287" Then
MsgBox "You clicked No to the Outlook security warning. " & _
"Rerun the procedure and click Yes to access e-mail" & _
"addresses to send your message. For more information, & _
"see the document at http://www.microsoft.com/office" & _
"/previous/outlook/downloads/security.asp. " "
Else
Msgbox Err.Number, Err.Description
End If
End Sub
Автор: OchkaritO
Дата сообщения: 03.04.2006 09:15
aquaman77

Отлично! Спасибо. Все работает, но новые вопросы не устают появляться...

Вопрос певый: Необходимо чтобы наличие пустой строки (для вставки данных) проверялось только до столца J. В J и K буду выражения.

И второй: можно ли сделать так, чтобы данные забирались не только из пятой строки, а из некоторого диапозона, величина диапозона строк не известна (~ до 15), и пустые строки на в ставлялись в лист DB?

Такая вот мелочь для полного счастья...
Автор: Pahun78
Дата сообщения: 04.04.2006 12:40
Надо создать алгоритм вычисления максимума целевой функции, которая выражает прибыль от вкладов в проекты. Задача линейного программирования в VBA Exel.

Даны 3 объекта, их стоимость и годовой доход. Задача - сформировать макрос,
который бы расчитывал, сколько средств на какой проект надо вложить, чтобы получилась максимальная прибыль. Вот данные:
стоимость (млн): 0 10 20 30 40 50 60 70
Год. доход от 1-го проекта: 0 1,6 3,1 4,5 5,8 7 8,1 9,1
Год. доход от 2-го проекта: 0 1,2 2,2 3 3,6 4 4,2 4,2
Год. доход от 3-го проекта: 0 2,8 5,3 7,5 9,4 11 12,3 13,3

Да, забыл - у компании есть всего 70 млн


--------------------------------------------------------------------------------



Добавлено:
Надо создать алгоритм вычисления максимума целевой функции, которая выражает прибыль от вкладов в проекты. Задача линейного программирования в VBA Exel.

Даны 3 объекта, их стоимость и годовой доход. Задача - сформировать макрос,
который бы расчитывал, сколько средств на какой проект надо вложить, чтобы получилась максимальная прибыль. Вот данные:
стоимость (млн): 0 10 20 30 40 50 60 70
Год. доход от 1-го проекта: 0 1,6 3,1 4,5 5,8 7 8,1 9,1
Год. доход от 2-го проекта: 0 1,2 2,2 3 3,6 4 4,2 4,2
Год. доход от 3-го проекта: 0 2,8 5,3 7,5 9,4 11 12,3 13,3

Да, забыл - у компании есть всего 70 млн


--------------------------------------------------------------------------------

Автор: Parsen
Дата сообщения: 04.04.2006 16:24
Подскажите как макрос написать
Задача такая: из другой программы вставляю данные-
А В
1 ХХХ 0.444
2 ХХХ 3.554
нужно привести к такому виду:
А В
1 ХХХ 0,444
2 ХХХ 3,554
т.е. точки заменить запятыми.

Макрос в таком виде выполняется неправельно (заменяет если первая цифра "0", если не ноль то убирает и точку и запятую.
Sub Макрос1()
Range("В1:В20").Replace What:=".", Replacement:=","
End Sub
Автор: Troitsky
Дата сообщения: 04.04.2006 18:12
Parsen
А не проще будет поиграться с настройками разделителя целой и дробной части в Сервис/Параметры/Международные?
Иначе можно с форматами представления значений ячеек умучаться ничего кроме непонимания не испытывая.
Автор: Parsen
Дата сообщения: 04.04.2006 18:32
Troitsky
Так работает, но это не выход. Не знаю как себя поведут формулы на другой машине.
Автор: Troitsky
Дата сообщения: 04.04.2006 19:30
Parsen

Цитата:
Так работает, но это не выход. Не знаю как себя поведут формулы на другой машине.

Должны нормально себя повести.

А все, что ты считаешь результатом неправильной работы макроса, не инече как результат неверного истолкования форматов отображения и противоречие маждународных традиций разделения целой и дробной части числа.
Проще вот такого вида цикл использовать:
Код: For i = 1 To 20
Cells(i, 2).Formula = Cells(i, 2).Text
Next i
Автор: Parsen
Дата сообщения: 04.04.2006 20:23
Troitsky
Большое спасибо!!! Все работает.
Автор: felix25
Дата сообщения: 19.04.2006 13:12
Help. Как в помощью VBA (или VB 6.0) скачивать информацию с Интернета?
Автор: Dixi257
Дата сообщения: 19.04.2006 14:59
felix25

Цитата:
Как в помощью VBA (или VB 6.0) скачивать информацию с Интернета?


Вопрос очень уж объемный. Для начала посмотри сюда:
http://vbnet.ru/samples/showgroup.aspx?id=7
Автор: Alexey Step
Дата сообщения: 19.04.2006 15:20
Доброе время суток! Мне как начинающему тоже хочется помощи корифеев!
Есть проблема! Существует документ в Excel 2003 из 2 листов, 1лист для просмотра данных а на втором эти данные вводятся т.е. две таблицы. Задача: при вводе платижей в определеную ячейку на 2 листе на 1 листе нужно отобразить в соответствующей ячеке дату когда этот платеж был введен! И так по всей таблице ячейки совподают по строкам но не по столбикам. о-как!

Сдесь на форуме я видел формулу предложенную "Anjin_Kazawa" примерно для похожей задачи

Private Sub Worksheet_Change(ByVal Target As Range)
S = UCase(CStr(Cells(Target.Row, Target.Column)))
If (S = "ВЫПОЛНЕННО") Or (S = "ГОТОВО") Then
Cells(Target.Row, 5) = Date$ + " " + Time$
End If
End Sub

Но как я не бился и не пробовал ее туда сюда ничего не получилось ПОМОГИТЕ!!! КТО МОЖЕТ!!! Могу прислать по эл. почте сам файл пишите stepanuk67@rambler.ru стучите ICQ 304364023 помогите выжить человеку!!!
Автор: DONRU1
Дата сообщения: 19.04.2006 19:57
Есть запароленый файл №1. В файле №2 есть ссылка на ячейку из №1. При отрытии №2 и обновлении ссылок появляется окно с запросом пароля.
Вопрос: Как программно подставить пароль (он известен) или вообщее обойти это окно, но чтобы ссылка обновилась. При этом файл №1 не открывать.

Добавлено:
При скрытии строк(столбцов) макросом на 2 выполенении скорость работы макроса падает в разы. В чем может быть дело?
Автор: ScorpionS
Дата сообщения: 21.04.2006 21:14
Подскажите, как можно реализовать такую простую задумку в VBA.
Я хочу, чтобы в Excel если я ввожу какое-либо (любое) значение в ячейку А1, то у меня должны очищаться ячейки A2 и A3, если я ввожу какое-либо (любое) значение в ячейку А2, то у меня должны очищаться ячейки A1 и A3, и если я ввожу какое-либо (любое) значение в ячейку А3, то у меня должны очищаться ячейки A1 и A2. Вроде все просто, но не могу сразу понять как это сделать. Помогите, plz!

P.S. И может кто подскажет, где скачать справку к VB на РУССКОМ языке?
Автор: Yuk
Дата сообщения: 22.04.2006 00:04
ScorpionS
B Sheet1 (Code):

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Select Case Target.Address
Case "$A$1"
Range("$A$2").Clear
Range("$A$3").Clear
Case "$A$2"
Range("$A$1").Clear
Range("$A$3").Clear
Case "$A$3"
Range("$A$1").Clear
Range("$A$2").Clear
End Select
Application.EnableEvents = True
End Sub
Автор: ScorpionS
Дата сообщения: 22.04.2006 16:57
Yuk
Дружище, спасибо! Вроде сработывает!
Подскажите как реализовать еще одну идею.
Нужно, чтобы при вводе в Ячейку A1 любого значения, отличного от 0, 10 или 20 (а также кроме пустоты, т.е. при очистке ячейки) выскакивал MessageBox с текстом собщение "Текс сообщения" и кнопкой OK, после нажатия на которую нужно вернутся на эту ячейку.
Автор: Yuk
Дата сообщения: 23.04.2006 06:53
ScorpionS
Не сложно:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Select Case Target.Address
Case "$A$1"
Range("$A$2").Clear
Range("$A$3").Clear
If Target.Value <> 0 And _
Target.Value <> 10 And _
Target.Value <> 20 And _
Target.Value <> "" Then
MsgBox "Текс сообщения"
Target.Select
End If
Case "$A$2"
Range("$A$1").Clear
Range("$A$3").Clear
Case "$A$3"
Range("$A$1").Clear
Range("$A$2").Clear
End Select
Application.EnableEvents = True
End Sub
Автор: ScorpionS
Дата сообщения: 24.04.2006 11:22
Yuk
Спасибо!
Слушай, а если нужно мне указать не явное число, а ячейки A10, A11 и A12, в которых 0, 10 и 20 соответственно (и эти ячейки имеют формат числовой). При этом строку

Код:
If Target.Value <> 0 And _
Автор: Yuk
Дата сообщения: 24.04.2006 17:11
ScorpionS
Target.Value - это значение ячейки. Ты же пытаешься сравнивать его с адресом ячейки. Используй Target.Address, значение которого всегда абсолютный адрес, типа $A$10.

Вообще, Target - это переменная данной функции, которая передает в нее ячейку(и), в которой произошло изменение.
Для твоего примера

Код:
If Target.Value <> Range("$A$10").Value Then
Автор: ScorpionS
Дата сообщения: 24.04.2006 17:42
Yuk
Большое спасибо!
Автор: ScorpionS
Дата сообщения: 25.04.2006 13:17
Yuk
А как в строке

Код:
Case "$A$1"

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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