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

» Excel VBA

Автор: Linda
Дата сообщения: 04.06.2005 17:23

Цитата:
ActiveSheet.ChartObjects(1).Activate
ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Select
Cells(1, 1) = Selection.Characters.Text


Тренд имеет след. вид функции: y = -0,1818x2 + 2,4109x + 8,4. (x2 - это х в квадрате).
Указанный способ считывает функцию в таком виде. Но, как известно, в ячейку можно "вбить" функцию, и она при изменении данных в соответствующих ячейках меняет автоматически свое значение. Указанный вариант просто полностью считывает, а как автоматизировать ее "вбиение" в ячейки, чтобы потом данные соответственно изменялись?
Автор: wtt
Дата сообщения: 04.06.2005 19:37
Ой,дамы и господа,а у меня такой вопрос
Есть клетка на листе Excel ,в ней формула: =3,5*4+2,3*12+1*5(например)
Вопрос: как можно каждое отдельно взятое число “вытянуть” с помощью VBA?
P.S.: таких клеток-великое множество, и все они разные по длине и содержанию.
Автор: evle
Дата сообщения: 04.06.2005 19:43
wtt
Скорее всего стандартными методами никак (если ты про числа внутри формулы). Они по отдельности нигде не хранятся. Можно получить всю формулу целиком и пропарсить как-нибудь (разбить на составные части).
Автор: wtt
Дата сообщения: 04.06.2005 20:07
evle

Цитата:
Можно получить всю формулу целиком и пропарсить как-нибудь (разбить на составные части)
-намекни,как примерно это можно сделать.

Автор: evle
Дата сообщения: 04.06.2005 20:22
wtt
02:07 05-06-2005
Цитата:
намекни,как примерно это можно сделать.

Пробежать по строке, добавлять в строковую переменную текущий символ, если это цифра или запятая (точка). Если встретился символ, отличный от нужных, содержимое переменной добавлять в массив, переменную очищать, идти дальше.
В общих чертах так.
А вообще, для какой цели это надо? Может исходная проблема проще решается?
Автор: wtt
Дата сообщения: 05.06.2005 21:12
evle
В принципе,что-то похожее и я думал.
Это надо для удобства и быстроты.Речь идёт про анализ большого количества однотипных деталей которые отличаются друг от друга двумя параметрами: длиной и количеством.
т.е.:=длина1*кол-во1+длина2*кол-во2+ и т.д.(таких клеток много)
Классический метод заполнения отдельного столбца-длина и отдельного-количество неудобен по производительности и по некоторым другим причинам.

Цитата:
Пробежать по строке
-так пробовать и буду,только возникают вопросы,как VBA сможет отличить числа от знаков "=","+","*"?
Автор: GrayElf
Дата сообщения: 06.06.2005 04:23
wtt
Что ты имеешь в виду? Ищи знаки той же функцией InStr и все.
Linda
Как уже сказал evle, нужно не сразу писать текст в ячейку, а сначала его пропарсить, например так:

Код:
ActiveSheet.ChartObjects(1).Activate
ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Select
Dim a As String
a = Selection.Characters.Text
a = Right(a, Len(a) - InStr(1, a, "=") + 1)
a = Left(a, InStr(1, a, "x2") - 1) + "*A1" + Right(a, Len(a) - InStr(1, a, "x2") - 2)
a = Left(a, InStr(1, a, "x") - 1) + "*A2" + Right(a, Len(a) - InStr(1, a, "x") - 1)
Cells(1, 3) = a
Автор: evle
Дата сообщения: 06.06.2005 05:19
GrayElf
10:23 06-06-2005
Цитата:
Только вот срабатывает этот код, только если в установках языковых параметров в качестве разделителя дробной части точка, кто-нибудь знает как поправить?


Цитата:
DecimalSeparator Property
Sets or returns the character used for the decimal separator as a String. Read/write.

expression.DecimalSeparator
expression Required. An expression that returns an Application object.

Example
This example places "1,234,567.89" in cell A1 then changes the system separators to dashes for the decimals and thousands separators.

Sub ChangeSystemSeparators()

Range("A1").Formula = "1,234,567.89"
MsgBox "The system separators will now change."

' Define separators and apply.
Application.DecimalSeparator = "-"
Application.ThousandsSeparator = "-"
Application.UseSystemSeparators = False

End Sub
Автор: GrayElf
Дата сообщения: 06.06.2005 09:07
evle
Я не о том, DecimalSeparator устанавливает системный разделитель, он стоит нормальный - запятая, а Excel ругается при вводе через макрос, например, "=1,5". Еще один похожий глюк есть, если вводить формулу с русскими символами ("=сумм(a1:a5)" например) через VBA, то результат не появляется в ячейке, пока не нажмешь ее редактировать и обновить
Автор: evle
Дата сообщения: 06.06.2005 10:01
GrayElf
Я так понимаю, ты использовал свойство Formula. А с какой стати русский язык и DecimalSeparator должны там работать?
Чтобы вводить на русском используется свойство FormulaLocal

Цитата:
Assume that you enter the formula =SUM(A1:A10) in cell A11 on worksheet one, using the American English version of Microsoft Excel. If you then open the workbook on a computer that's running the German version and run the following example, the example displays the formula =SUMME(A1:A10) in a message box.

А лучше все-таки для уменьшения путаницы пользоваться английской версией формул (с английскими названиями функций и точкой в качестве разделителя).
Автор: GrayElf
Дата сообщения: 06.06.2005 11:40
evle
Большое спасибо! Действительно с FormulaLocal работает.
Автор: gloos
Дата сообщения: 07.06.2005 10:59
Народ, помогите, у меня есть отчет на одном листе. На другом листе имеется содержание, которое выполнено в виде гиперссылок на ячейки отчета. Как можно автоматически заполнить номера страниц в содержании. Пробовал работать с объектом HPageBreaks и VPageBreaks - ну очень долго.
Автор: 755df
Дата сообщения: 18.06.2005 16:52
кто подскажет как сделать следующее:
есть таблица
A B C D
1 100 aaa bbb ddd
2 101 ggg hhh ghk
3

нужно чтобы выполнилось условие : если в строке Х значение ячейки А =0 то выделить строки на 2 ячейки выше( в данном случае строка 2 и 1)
и скопировать выделенные строки в другой лист
Автор: Sleepwalker
Дата сообщения: 21.06.2005 20:44
755df
если тебе надо удалить таким образом пустые строки, то это можно гораздо проще сделать.
если какие-то свои мотивы, то всегда код можно получить, выполнив запись макроса.
Например

Dim last2 As Integer
last2 = 1
Лист1.Select
For i = 3 To 15
If Cells(i, 1) = "" Then
Range("A" & CStr(i - 2) & ":C" & CStr(i - 1)).Select
Selection.Copy
Sheets("Лист22").Select
Range("A" & CStr(last2)).Select
last2 = last2 + 2
ActiveSheet.Paste
Sheets("Лист1").Select
End If

Next i
Автор: Tema123
Дата сообщения: 29.06.2005 23:03
обращаюсь за помощью, проблема в следующем каждую неделю приходится тратить дофига времени на составление отчета по статусу багов, хотелось бы этот процесс упростить:
дано:
база багов в MySQL
екселевский документ с номерами багов
нужно, чтоб макрос (при нажатии кнопки) брал бы номера багов и смотрел в базе их статус, после чего сохранял этот статус напротив соответстующего номера бага в этот же екселевский документ.
помогите кто может...
Автор: ShIvADeSt
Дата сообщения: 30.06.2005 00:43
Tema123
при помощи цикла пробегаешь по всем номерам багов в екселе и для каждого делаешь при помощи Select выборку статуса из базы и занесение в таблицу статуса.
Автор: Tema123
Дата сообщения: 30.06.2005 09:15

Цитата:
Tema123
при помощи цикла пробегаешь по всем номерам багов в екселе и для каждого делаешь при помощи Select выборку статуса из базы и занесение в таблицу статуса.

проблема в том, что я не знаю как вставить селект в ВБ код, каким образом конект к базе сделать
Автор: ShIvADeSt
Дата сообщения: 30.06.2005 09:43
Tema123
Вот примерно что надо писать в макросе для заполнения

Цитата:

AppInitialize
Set Sht = Workbooks("Название.xls").Worksheets("Лист1")
Set Srv = CreateObject("sqlole.SQLServer") ' Create a SQL Server Object
If UserForms.Count = 0 Or _
Not Sht.Parent.Names("Connected").Value = "=ИСТИНА" Then
OK = False
fConnect.Show
If Not OK Then
Exit Sub
End If
Sql = _
"USE " + db + _
" SET DATEFORMAT dmy" + _
" SELECT Convert(varchar(10),DateDays,104), DateDays FROM vDateDays" + _
" UNION SELECT Convert(varchar(10),DateWork,104), DateWork FROM vDateWork" + _
" ORDER BY DateDays DESC"
Set res = Srv.ExecuteWithResults(Sql)
Load fBuhJrnl
For i = 1 To res.Rows
fBuhJrnl.cbDateDays.AddItem (res.GetColumnString(i, 1))
Next i
fBuhJrnl.cbDateDays.Value = res.GetColumnString(1, 1)
Else
Srv.Connect "Сервер", fConnect.tbName.Text, fConnect.tbPassword.Text
End If
OK = False
fBuhJrnl.Show
If Not OK Then
Exit Sub
End If
Sql = "USE " + db + " SET DATEFORMAT dmy Exec pBuhJrnl @DateJrnl=""" + fBuhJrnl.cbDateDays.Value + """"
Set res = Srv.ExecuteWithResults(Sql)
i1 = 0: i2 = 0: i3 = 0: i4 = 0
it1 = Sht.Parent.Names("_it1").RefersToRange.Row + 1
it2 = Sht.Parent.Names("_it2").RefersToRange.Row + 1
it3 = Sht.Parent.Names("_it3").RefersToRange.Row + 1
it4 = Sht.Parent.Names("_it4").RefersToRange.Row + 1
For i = 1 To res.Rows
If Left(res.GetColumnString(i, 2), 8) = "20202810" Or Left(res.GetColumnString(i, 3), 8) = "20202810" Then
If Sht.Cells(it2 + i2 + 1, 1).Text = "Итого по" Then
Sht.Cells(it2 + i2, 1).EntireRow.Insert
ins = True
Else
ins = False
End If
Sht.Cells(it2 + i2, 1).Formula = res.GetColumnString(i, 1)
Sht.Cells(it2 + i2, 2).Formula = "'" + res.GetColumnString(i, 2)
Sht.Cells(it2 + i2, 3).Formula = "'" + res.GetColumnString(i, 3)
Sht.Cells(it2 + i2, 4).Formula = res.GetColumnString(i, 4)


Автор: Cfg3001
Дата сообщения: 30.06.2005 20:07
Как можно макросом свернуть таблицу:

Есть таблица с несколькими колонками - часть из них числа, часть текст.
В таблице есть повторяющиеся строки (т.е. текстовые колонки одинаковые, числовые могут быть разные). Нужно сложить числовые колонки в одну строку. Остальные строки удалить.
Автор: Asylum
Дата сообщения: 30.06.2005 23:21
Можно ли запускать EXCEL в фоновом режеме без запросов из HTM файла?
Задача простая - надо в htm-файле (менно в htm!) каталог сделать, чтобы при нажатии на картинку нужный файл вместе с excel - ем подгружался. И не задавал дурацких вопросов типа "Открыть или сохранить этот файл?"
Может кто-нибудь что-то другое предложит? Буду весьма признателен.
Автор: vworld
Дата сообщения: 08.07.2005 22:51
Подскажите мне пожалуйста....вот такая проблема у меня, есть прйс в формате *.xls
мне необходимо из этого файла повыдергивать только некоторые колонки и перебросить в другой файл, кде буду добавлены к перенесеным колонкам еще и добавочная строка и дополнительные колонки...как это реализовать?
Автор: wtt
Дата сообщения: 19.07.2005 21:30
В это форуме тоже спрошу:
Кто нить даст качнуть русскую справку на VBA, или ссылку на неё (имеется в виду офис 97)?
Заранее пасибо.
Автор: Asylum
Дата сообщения: 19.07.2005 22:35
wtt
Могу дать ссылку на "Уокенбах Джон Профессиональное программирование на VBA в Excel 2002".
Только она отсканенная и весит 127 М.
Грузи здесь
Автор: vworld
Дата сообщения: 20.07.2005 07:11
wtt
Постараюсь дома посмотреть...я скачивал не так довно "VBA для чайников" там в pdf примерно 5М вроде как...
4ALL
Можно ли например так сделать, есть у меня прайс в *.xls и есть прайс спустя например пару недель...мне надо эти файлы сравнить и в новом чтобы была подсветка, что изменилось за это время?
Автор: UserOKA
Дата сообщения: 20.07.2005 07:21
Нужно организовать просмотр, редактирование, добавление записей таблицы Access из Excel. Меня интересует вопрос интерфейса. Грустно делать тучу Edit-ов на форме для просмотра БД. Может есть что-то типа сетки, можно ссылку где ее можно скачать и как ее потом прицепить. Если нет такого, то может быть у кого-нибудь примерчики есть как это реализовано - поделитесь.
Автор: saintvadim
Дата сообщения: 25.07.2005 14:17
Две книги, довольно полезные по VBA:

Sybex - Mastering Excel 2003 Programming with VBA.
Wrox Press - Excel 2003 VBA Programmer's Reference

Забрать здесь: http://mtg.ur.ru/gallery/books/
Автор: ghosty
Дата сообщения: 26.07.2005 16:47
Помогите, пожалуйста, написать простенькую функцию. Нужно, чтобы она выводила определенный диапазон ячеек с текстовыми значениями (как правило, прерывистый) в виде списка через запятую.
Нашел вот что:
Public Function MultiCat( _
ByRef rRng As Excel.Range, _
Optional ByVal sDelim As String = ", ") _
As String
Dim rCell As Range
For Each rCell In rRng
MultiCat = MultiCat & sDelim & rCell.Text
Next rCell
MultiCat = Mid(MultiCat, Len(sDelim) + 1)
End Function

Но пока эта функция не переваривает прерывающиеся диапазоны. Т.е в случае (A1:B2) работает, а в случае (A1;B2) - нет
Срочно нужна помощь!
Автор: distance
Дата сообщения: 26.07.2005 18:51
У меня совсем простые вопросы - только начал пиcать на VBA
1. если у меня есть функция, описанная в одном модуле, то как мне её вызвать из другого модуля? То же самое относится к константам - не видны-с...
2. как сделать, чтобы моя функция вызывалась при открытии документа?
Автор: GrayElf
Дата сообщения: 27.07.2005 07:29
ghosty
Все из-за опционального параметра sDelim
Использовать функцию надо так:
=multicat((A1:A2;A3;A4))
Автор: saintvadim
Дата сообщения: 27.07.2005 08:38
Подскажите, как в VBA предусмотрен перенос программного кода из одного Excel-файла в другой?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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