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

» Excel VBA (часть 2)

Автор: iLord
Дата сообщения: 10.04.2009 11:16
Добрый день!
Прошу у Вас помощи. В Excel'e необходимо сократить таблицу выгруженную из SAP BW, Хочу сделать это при помощи макроса, но столкнулся с одной проблемой.

В солбцах С и D находится текстовые значения формата " 5.456,78", т.е впереди два пробела и разделитель разрядов "."

Перевод формата вида
Selection.Replace What:=".", Replacement:=""
Selection.Replace What:=" ", Replacement:=""
Selection.NumberFormat = "#,##0.00"

ни к чему не приводит, т.е. значение всё равно остаётся текстовым.
Автор: nordspirit
Дата сообщения: 10.04.2009 17:41
Помогите кто чем может... (С)

Задача достаточно простая (казалось бы). Есть лист (форма), в нем в отдельные ячейки записываются данные. Необходимо в отдельной книге (назовем её Базой) создавать записи, содержание которых постоянно фиксирует содержание ячеек из первой книги.

В общем то задача решается Мастером шаблонов, но... мне необходимо "уйти" от ручной работы (постоянного ручного сохранения данных). Процесс необходимо автоматизировать. Microsoft в надстройке Мастер шаблонов запаролил данную задачу и к исходникам у меня доступа нет.
Попробовал сделать макрос, который бы сам периодически сохранял данные, но не тут то было. Он сохраняет лист тупо без создания записи в Базе. Не знаю что придумать.

Понимаю, что истина где-то рядом, но где?..

В общем спасибо всем откликнувшимся!..
Автор: crotoff
Дата сообщения: 10.04.2009 21:07
iLord
попробуй проделать операции в обратном порядке - формат, замена пробелов, замена точки
Автор: SAS888
Дата сообщения: 11.04.2009 08:14
reanews1
Смотри ответ Здесь.

Добавлено:
iLord
Посмотрите Такой вариант.
Автор: x997
Дата сообщения: 12.04.2009 18:22
Подскажите, как автоматически сделать группировку листа ? (есть прайс-лист , нужно сгрупировать его по разделам, вручную это делать - нереально, 3000 позиций, почти 100 разделов)
Автор: SERGE_BLIZNUK
Дата сообщения: 12.04.2009 21:34

Цитата:
Подскажите, как автоматически сделать группировку листа ?

ну так напишите макрос для группировки!

p.s. сразу предвидя Ваш следующий вопрос - "а как это сделать":
точнее формулируйте задачу/выкладывайте пример (абстрактный - что есть и что надо получить) - т.к. телепаты все в отпуске...
Автор: x997
Дата сообщения: 12.04.2009 22:49
есть автоматически генерируемый прайс:

вот тут


из этого прайса нужно сделать что-то читаемое, выглядеть это должно примерно так:
Автор: strat
Дата сообщения: 14.04.2009 09:42
открывается книга и формулой
ЕСЛИ(ЕОШИБКА(СЦЕПИТЬ(данные));"";СЦЕПИТЬ(данные))

получается ячейки на листе
123456798912345678^123^123456^Иванов^Иван^Иванович^12345678^^
123456798912345678^123^123456^Иванов^Иван^Иванович^12345678^^
123456798912345678^123^123456^Иванов^Иван^Иванович^12345678^^


где не хватает данных формулой #н/д убирается

далее необходимо сохранить ячейки с данными в txt формат с разделителем табуляция
записал макрос

Sheets("фио").Select
Columns("A:A").Select
ChDir "C:\txt"
ActiveWorkbook.SaveAs Filename:="C:\txt\фио.txt", FileFormat:= _
xlText, CreateBackup:=False

при этом сохранение происходит с проблемой

в txt файле после данных есть куча пробелов которые возникают на формулах убирающих #н/д

батник который может убрать пробелы есть, но есть ли возможность сохранить без них

уточню - формул 100 штук, а данных каждый раз разное количество, так вот если было 3 строки с данными то в конце txt будет 97 пробелов


п.с. попробовал командой RetVal = Shell("C:\xml\test.bat", 1) обработать сразу выходной файл фио.txt для убирания пробелов но пока excel открыт он не дает это сделать, "не найден файл"
Автор: palamars
Дата сообщения: 14.04.2009 13:11
Здравствуйте, подскажите, пожалуйста, как программно поставить фильтр в сводной таблице:

Такой код работает:

ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("НужноеПоле").PivotItems("09-04-436а").Visible = False

А такой - нет

dim zakaz As String

zakaz="09-04-436а"

ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("НужноеПоле").PivotItems(zakaz).Visible = False

Выдает ошибку
Автор: DenisSmo
Дата сообщения: 14.04.2009 13:27
помогите нужен макрос
для сохранения файла по имени, которое берется из двух ячеек(при чем из одной ячейки береться только последние 13 символов, вторая ячейка берется полностью)
1 шаг формирование имени
2 шаг сохранение
3 шаг закрытие страницы
Автор: SAS888
Дата сообщения: 14.04.2009 13:51
DenisSmo
Пусть, например, ячейка "A1" содержит текст "abcd_C:\Temp\Test\", а ячейка "B1" - "MyFile.xls". Нужно сформировать путь и имя файла для сохранения в виде "C:\Temp\Test\MyFile.xls". Следите за тем, чтобы присутствовали все разделители "/" и расширение ".xls". Если таковых нет - добавьте через "&".
Итак, формируем имя из 13 правых символов ячейки "A1" и значения ячейки "B1", сохраняем файл (в примере это файл, содержащий данный код) по этому пути с указанным именем и закрываем файл без сохранения (это уже нам не нужно). Получаем код:

Код: MyPath$ = Right([A1], 13) & [B1]
ThisWorkbook.SaveAs Filename:=MyPath
ThisWorkbook.Close SaveChanges:=False
Автор: Yury555
Дата сообщения: 15.04.2009 00:01
Как реализовать автоматическую последовательную запись данных из OLE в Excel? подразумевается запись содержимого буфера обмена при каждом его изменении с сохранением каждого изменения. тип данных текст.
Помогите пожалуйста..
Автор: DenisSmo
Дата сообщения: 15.04.2009 11:20
спасибо SAS888
работает!
Автор: isabpchereda
Дата сообщения: 17.04.2009 09:39
Подскажите, можно ли разрешить изменение содержимого ячеек в Excel только через VBA-программу?
Автор: Grif91
Дата сообщения: 18.04.2009 17:20
Написал программу, а она не работает. Подскажите пожалуйста в чем ошибка!

Sub min()
Dim minim As Single, b As Single, c As Single, m As Single
If b < c Then min b Else min = c
End Sub
Function min (b As Single, c As Single, m As Single) As Single
If b < c Then min = b Else min = c
End Function

Private Sub CommandButton1_Click()
Dim x As Single, y As Single, x As Single, a As Single
Dim m1 As Single, m2 As Single, m3 As Single
x = Val(InputBox("x="))
y = Val(InputBox("y="))
z = Val(InputBox("z="))
Call minim(x + y, x * y, m1)
Call minim(x, y * z, m2)
Call minim(x * y, x * z, m3)
a1 = (m1 + m2) / m3
a2=(min(x+y, x*y)+(min (x, y+z))/(min(x*y, x*z))
TextBox1.Text = a1
TextBox2.Text = a2
End Sub

Private Sub CommandButton2_Click()
End
End Sub
Автор: dneprcomp
Дата сообщения: 18.04.2009 20:08
Grif91
Перепутаны имена функции min с переменной minim
В коде Call minim(x ... Должно быть Call min(x ...
Функция min() и sub min() c одинаковым кодом? Оригинально
x As Single декларирован 2 раза
z, а1, а2 не декларированы вообще
3-й параметер m As Single вообще не используется в функции
К переменным, объявленным в sub min(), нельзя обращаться из кода вне этой sub
Каждый вызов Call minim(x... не возвращает никакого значения.
Значения m1, m2, m3 ВСЕГДА = 0
На 0 делить нельзя
В строке a2=(min... функции передается только 2 параметра при каждом к ней обращении


Цитата:
Написал программу, а она не работает

Зто не программа. Просто набор псевдо кода.

Автор: AlexMV
Дата сообщения: 19.04.2009 22:33
Вот мне надо ввести кучу данных , как сделать чтобы я выделил те места куда были вставлены данные , а по завершению у меня выскакивает окно и я просто ввожу подряд данные, а они у меня становятся в те ячейки которые я выделил!
Автор: MaximuS_G
Дата сообщения: 20.04.2009 12:00
Всем привет!
Давно не заходил, так много новых пользователей
Подскажите следующий вопрос:

Есть вот такие числа и их порядковый номер:

1    1000
2    3000
3    2200
4    1000
5    5000
6    300
7    250
8    1000
9    800
10    1400
11    2300

Есть интервал : 4176 - 3888

Задача такая: необходимо провести группировку вышеприведенных чисел таким образом, чтобы они попали в этот интервал. Количество может быть разное. Например: 1000(1) + 3000(2) = 4000 - в интервал попадает, больше никакого другого числа добавить нельзя, потому что выйдет из интервала. То-есть это Вариант 1. И так дальше:1000(4) + 2300(11) + 800(9) = 4100. Это Вариант 2. Ну и так дальше. Нужно понимать, что 1000 с 1го числа, и 1000 с 4го это разные варианты, поэтому 1000(1)+3000(2) и 1000(4)+3000(2) - это 2 разных варианта.

Может кто подбросит идейку какаю, а может и код на vba
Спасибо большое за помощь!
Автор: SERGE_BLIZNUK
Дата сообщения: 20.04.2009 13:34
MaximuS_G
сам алгоритм там несложный — знай себе перебирай все возможные варианты и смотри сумму.
Вопрос такой - ограничения на количество чисел и на вложенность (т.е. сколько слагаемых в найденном сочетании может быть) есть?
Дело в том, что сложность задачи перебора резко (как бы даже не по экспоненте) возрастает с увеличением числа ингридиентов, участвующих в переборе... ;(
И ещё - задача стоит, чтобы найти варианты, или чтобы найти ВСЕ возможные варианты?

p.s. я писал для себя программку, подбирающую набор файлов так, чтобы вместить в определённый объём наибольшее (по сумме размеров) число файлов...
Но практической пользы полученное решение не получило. Т.к. нормальное (примемлимое) время работы было как раз что-то около 12 файлов... :(
Автор: MaximuS_G
Дата сообщения: 20.04.2009 15:51
SERGE_BLIZNUK

Цитата:
Вопрос такой - ограничения на количество чисел и на вложенность (т.е. сколько слагаемых в найденном сочетании может быть) есть?

Количество чисел - 11 - это то, что требуется в данный момент. Второй вопрос, что я не могу понять как составлять эти комбинации... как считать знаю из комбинаторики, а как составлять... К вопросу, если можна давайте установим ограничение 11 чисел. По-поводу вложенности. Я думаю начиная от одного (то есть число само уже сразу может входить в интервал, или сразу выпадать из него - как например 5000) и заканчивая всеми, то есть 11-ти. В данной задачи видно, что навряд ли будет больше 5ти, так как сумма наименьших пяти равна 3350, если добавить шестой = 4350, уже вылетает... по-этому если это имеет значения не для производительности, а для написания, то можем задать 5.
Итак ограничения: кол-во чисел - 11, количество вложенных чисел - 5.

Цитата:
И ещё - задача стоит, чтобы найти варианты, или чтобы найти ВСЕ возможные варианты?

Мне кажется, что любое дело надо доводить до конца, поэтому желательно найти ВСЕ.
Вот такой код мне предложили на другом сайте:

Код: Const n& = 11, la& = 3888, ra& = 4176
Dim a(1 To n)
a(1) = 1000: a(2) = 3000: a(3) = 2200: a(4) = 1000: a(5) = 5000: a(6) = 300
a(7) = 250: a(8) = 1000: a(9) = 800: a(10) = 1400: a(11) = 2300
Dim c(1 To n)
Dim i&, j&, p&, m&, r&, u&, s$
For m = 2 To 11
For i = 1 To m
c(i) = i
Next
p = n - m: r = m - 1
L1:
u = 0: s = ""
For i = 1 To m
u = u + a(c(i))
s = s & a(c(i)) & "(" & c(i) & ")+"
Next
If u >= la And u <= ra Then
Debug.Print Left$(s, Len(s) - 1) & "=" & u
End If
For i = m To 1 Step -1
If c(i) <> p + i Then
c(i) = c(i) + 1
For j = i To r
c(j + 1) = c(j) + 1
Next
GoTo L1
End If
Next
Next
Автор: Burk44
Дата сообщения: 20.04.2009 17:02
как для OLEObjectsControls (optionbutton штук 300) назначить один и тот же макрос. В FormsControl можно назначить, но есть другие неудобства. Советы типа
Sub OB2_Click
call OB1_Click
end sub
не предлагать.
У меня 0фис-2003.
Буду очень прнизнателен. Burk
Автор: isabpchereda
Дата сообщения: 21.04.2009 07:36

Цитата:
MaximuS_G



IMHO, это "одномерная задача упаковки предметов в контейнеры". В инете можно найти
закодированные алгоритмы.


Автор: AlexMV
Дата сообщения: 21.04.2009 15:56
Вот мне надо ввести кучу данных , как сделать чтобы я выделил те места куда были вставлены данные , а по завершению у меня выскакивает окно и я просто ввожу подряд данные, а они у меня становятся в те ячейки которые я выделил!
Автор: Pravoved90
Дата сообщения: 23.04.2009 14:13
Ребята, подскажите, как написать простой макрос. есть Диапозон ячеек А1:А20. Нужно сделать, чтобы при двойном клике на любую их этих ячеек, она закрашивалась в цвет. Макрос по закраске сделал - не знаю, как его задействовать для каждой ячейки..Заранее благодарю за помощь.
Автор: kent17
Дата сообщения: 23.04.2009 23:03
Хорошей всем погоды
Прошу помочь в написании программы которая будет писать введенные слова наоборот(т.е. справа-налево!
Автор: danreal
Дата сообщения: 24.04.2009 04:45
Помогите пожалуйста. Не хватает знаний.
Задача такова: создать массив, ориентируясь на функции.

Есть функция:

Код: Function Funy(x As Double) As Double
If x < 3 Then
Funy = Abs(x)
Else
Funy = (Sin(x)) ^ 3
End If
End Function
Автор: SERGE_BLIZNUK
Дата сообщения: 26.04.2009 19:53
danreal
ну, формально, чтобы компилировалось и что-то делало, достаточно написать так:

Код: Sub Generator()
Dim x01 As Double, xn1 As Double, n1 As Double
Dim x As Double
Dim h1 As Double, i As Integer, j As Integer
Dim B(3, 3) As Double

x01 = Range("xalg1"): xn1 = Range("xlopp1")
n1 = Range("znach1")
h1 = (xn1 - x01) / n1
For i = 1 To 3
x = x01 + (i - 1) * h1
For j = 1 To n1
B(i, 1) = x
B(i, 2) = Funy(x)
B(i, 3) = Funz(x)
Next j
Next i
End Sub
Автор: isabpchereda
Дата сообщения: 26.04.2009 21:56
Pravoved90

У меня получилось вот это:
________________________________________________________________________
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Single, g As Single, b As Single
r = (Rnd * 255) Mod 255
g = (Rnd * 255) Mod 255
b = (Rnd * 255) Mod 255
ActiveCell.Interior.Color = RGB(r, g, b)
End Sub
________________________________________________________________________

Забавно.



Автор: SAS888
Дата сообщения: 27.04.2009 05:53
kent17

Цитата:
писать введенные слова наоборот

В модуль нужного листа вставьте следующий код:

Код: Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False: Target = StrReverse(Target): Application.EnableEvents = True
End Sub
Автор: kent17
Дата сообщения: 27.04.2009 14:40
SAS888

спасибо большое!!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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