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

» Excel VBA

Автор: SERGE_BLIZNUK
Дата сообщения: 13.09.2006 16:42
Funt123

Цитата:
Есть ряд переменных: StepPrice_n1, StepPrice_n2, ... StepPrice_nn со своими числовыми значениями.

Никак!
изначально неверная постановка задачи...
нужно заводить массив Dim StepPrice_n ( ) - массивы как раз для этого и придумали.

можно, если очень хочется, извернуться через пользовательскую функцию и глобальные переменные [more=вот так]

Код:

Dim StepPrice_n1 As Double
Dim StepPrice_n2 As Double
Dim StepPrice_n3 As Double

Public Function GetVarByName(ByVal VarName As String) As Double
If VarName = "StepPrice_n1" Then
GetVarByName = StepPrice_n1
Exit Function
End If
If VarName = "StepPrice_n2" Then
GetVarByName = StepPrice_n2
Exit Function
End If
If VarName = "StepPrice_n3" Then
GetVarByName = StepPrice_n3
Exit Function
End If
End Function

Public Sub Test1()
StepPrice_n1 = 100
StepPrice_n2 = 200
StepPrice_n3 = 300
n = 3

For i = 1 To n
curStepPrice_i = GetVarByName("StepPrice_n" & i)
Cells(i, 1).Value = curStepPrice_i
Next i

End Sub

Автор: Funt123
Дата сообщения: 13.09.2006 17:35

Цитата:
а цикл вы неправильно написали Next i надо )

ну это я здесь опечатался.

Цитата:
нужно заводить массив Dim StepPrice_n ( ) - массивы как раз для этого и придумали.

А как массиввом это провернуть. Я начал писать и что-то ошибка стала появляться:
Dim StepPrice("00", "20", "40", "60", "80") As String
MsgBox StepPrice(1)

Выводит ошибку "Wrong Number of dimensions"


Добавлено:

Цитата:
пользовательскую функцию

Функция прикольная, спасибо, но для моего случая слишком громоздко
Автор: opx
Дата сообщения: 13.09.2006 18:15
Есть такая заморочка: есть множество ячеек (около 3000), в которых повторяются некоторые символы (примерно так: вв 11 бб, вв 22 бб, аа 11 гг, бб 22 гг). Вопрос такой как найти и самое главное скопировать куда либо (в лист бокс, лэйбл, на другой лист или еще куда) ячейки имеющие 11 или гг
Автор: Funt123
Дата сообщения: 13.09.2006 18:30
opx

а простым реплейсингом не получается? В смысле Найти и Заменить через меню.
А если кодом, то можно записать макрос после ручной обработки.
Автор: SERGE_BLIZNUK
Дата сообщения: 13.09.2006 18:56
opx

Цитата:
Вопрос такой как найти и самое главное скопировать куда либо (в лист бокс, лэйбл, на другой лист или еще куда) ячейки имеющие 11 или гг

написать макрос на VBA :-)))
попозже постараюсь сделать.

Funt123

Цитата:
Dim StepPrice("00", "20", "40", "60", "80") As String
MsgBox StepPrice(1)


ну, не так быстро...
надо так:

Код:
Dim StepPrice(5) As String
StepPrice(1) = "00": StepPrice(2) = "20"
StepPrice(3) = "40"
StepPrice(4) = "60": StepPrice(5) = "80"

MsgBox StepPrice(1)
Автор: Yuk
Дата сообщения: 13.09.2006 20:36
opx
Примерно так:

Код: For Each c In Selection
If InStr(c.Value, "11") > 0 Or InStr(c.Value, "гг") > 0 Then
c.Offset(0, 1).Value = c.Value
End If
Next
Автор: Funt123
Дата сообщения: 13.09.2006 21:13
Yuk
ок. то что и хотел, просто Array не нашел в списке объектов. Это что, недокументированная функция?
SERGE_BLIZNUK
ок. так и сделал. Спасиб.
Автор: SERGE_BLIZNUK
Дата сообщения: 13.09.2006 21:22
opx
приведу свой вариант,
конечно у господина Yuk лаконичнее, но я и не собираюсь тягаться с профи...
(Yuk, моё почтение ;-)))

мой вариант копирует найденные в выделенном диапазоне на "Лист2" (имя листа можно задать своё в самой процедуре)
в самый низ Листа2, в один столбец значение ячейки, в которой содержится "11" или "гг", в соседний - адрес в виде Строка: Колонка
[more]

Код:
Sub Find_and_Collect_String()
MaxR = Worksheets("Лист2").UsedRange.Row + _
Worksheets("Лист2").UsedRange.Rows.Count
For Each c In Selection
Cur_Cell_Type = TypeName(c.Value)
If Cur_Cell_Type = "String" Then
If (InStr(1, c.Value, "гг", 1) > 0) Or (InStr(1, c.Value, "11", 1) > 0) Then
Worksheets("Лист2").Cells(MaxR, 1).Value = c.Value
Worksheets("Лист2").Cells(MaxR, 2).Value = Str(c.Row) & ":" & Str(c.Column)
MaxR = MaxR + 1
End If
End If
Next
End Sub
Автор: Yuk
Дата сообщения: 13.09.2006 21:28
Funt123

Цитата:
Array не нашел в списке объектов. Это что, недокументированная функция?

Это именно функция, а не объект. А почему недокументированная? В хелпе есть.

SERGE_BLIZNUK
Кончай прибедняться!
Автор: opx
Дата сообщения: 13.09.2006 23:19
Огромный респект всем. Большое спасибо.
Автор: tennisprof
Дата сообщения: 15.09.2006 12:30
Здравствуйте!

Необходимо в ExceL суммировать 2 3 4 5 столбцы, изходя из условия что в первом столбце одниковые значения и потом результат записывать в строку где были одинаковые значения в первом столбце, например

Исх.
1 2 3 4 5
3 5 6 7 5
1 2 4 6 8
4 3 5 7 9

Рез.
3 5 6 7 5
1 4 7 10 13
4 3 5 7 9

Как это сделать! Помогите пожалуйста , строк около 5 тысяч

Добавлено:
Здравствуйте!

Необходимо в ExceL суммировать 2 3 4 5 столбцы, изходя из условия что в первом столбце одниковые значения и потом результат записывать в строку где были одинаковые значения в первом столбце, например

Исх.
1 2 3 4 5
3 5 6 7 5
1 2 4 6 8
4 3 5 7 9

Рез.
3 5 6 7 5
1 4 7 10 13
4 3 5 7 9

Как это сделать! Помогите пожалуйста , строк около 5 тысяч
Автор: Yuk
Дата сообщения: 15.09.2006 16:44
Проще сделать без VBA, через СУММЕСЛИ:

Код: =СУММЕСЛИ(Лист1!$A$1:$A$5000;$A1;Лист1!B$1:B$5000)
Автор: tennisprof
Дата сообщения: 16.09.2006 00:57
Спасибо!

Я попробовал так сделать, но не получилось (а точнее получилось только в одной ячейке и то если 0 то не работает). Делаю наверное, что-то не то.... впервый раз такие действия выполняю.
Я делал так:

A B

1 2
3 5
1 2
4 3


1.Скопировал Столбец А на другой лист
2. И под 4 (A5) написал формулу =СУММЕСЛИ(Лист1!$A$1:$A$4;$A1;Лист1!B$1:B$4)
3. После этого она мне выдала ответ 7(2+7 (правильно)но! если 2 стоит 0 пишет 0 хотя на самом деле 5), только она пишет результат только в одной ячеке а не на месте 5 или 2 удаляя строку с двойкой


ПОЖАЛУЙСТА НАПИШИТЕ ЕЩЕ РАЗ !
Автор: Yuk
Дата сообщения: 16.09.2006 03:47
tennisprof
Формула
Цитата:
=СУММЕСЛИ(Лист1!$A$1:$A$4;$A1;Лист1!B$1:B$4)
в твоем примере должна выдать 4 (2+2 из столбца В). Конечно, если это данные с листа Лист1.

Как это работает.
Первые параметр (Лист1!$A$1:$A$4) - где искать
Второй параметр ($A1) - что искать (в данном случае в ячейке А1 - 1)
Третий параметр - какие данные суммировать.
В твоем примере 1 в столбце А в 2-х ячейках - в строке 1 и 3. В столбце В им соответствуют числа 2 и 2. В сумме получается 4. Опять же, если мы работаем в Листе1. Вообще, если не нужно переносить данные между листами, Лист1! можно убрать.

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

Цитата:
если 2 стоит 0 пишет 0 хотя на самом деле 5), только она пишет результат только в одной ячеке а не на месте 5 или 2 удаляя строку с двойкой

Здесь ничего не понял.
Автор: opx
Дата сообщения: 16.09.2006 11:05

Цитата:
opx
Примерно так:

Код:For Each c In Selection
If InStr(c.Value, "11") > 0 Or InStr(c.Value, "гг") > 0 Then
c.Offset(0, 1).Value = c.Value
End If
Next


Yuk, а по подробней ты не мог бы объяснить. Два дня парился над этими 5 строками, но так ничего и не получилось.
Автор: Yuk
Дата сообщения: 16.09.2006 18:45
opx
Ну, я вроде все раньше написал. А каждый раз объяснять что делать с кодом VBA уже поднадоело. Давай конкретно: что делал, что получилось, что не получилось, если вылезали ошибки, то какие и на каком шаге, в каком месте кода.

Да, тебе надо вставить этот код в Sub test() ... End Sub
Здесь что-ли проблемы?
Автор: SERGE_BLIZNUK
Дата сообщения: 16.09.2006 18:48
opx

Цитата:
Yuk, а по подробней ты не мог бы объяснить

я хоть и не Yuk но хочу ответить, пока он сам не ответил ;-)))
1) что значит - не получилось?... вы создали функцию на VBA, вставили туда код и что - выделили свои данные, нажали выполнить макрос и что... он ничего не делает? выдаёт ошибку?...
2) мой вариант смотрели?.. тоже не работает?..

Добавлено:
во... уже пост появился.. за Yuk не успеешь ответить ;-))))))))
Автор: DiMaS_2006
Дата сообщения: 17.09.2006 13:51
Доброго времени суток!
Посоветуйте, пожалуйста: Есть очень много вот такого вида данных. Нужно удалить все строки, кроме тех, которые содержат наибольшие значения из второго столбца; наибольшими они должны быть из диапазона, начинающегося целым числом, и заканчивающегося числом, предшествующим следующему целому. То есть: в массиве от 854 до 854,91 самое большое число из столбца B - 5345,5 - эта запись нужна, остальные из этого диапазона можно убрать. Числа в первом столбце идут от 500 до 1500, шаг и размер диапазона может варьироваться.
853,91    3037,3
854    2388,3
854,09    1978,8
854,18    2071,7
854,27    2631,5
854,36    3551,1
854,45    4525,8
854,55    5177
854,64    5345,5
854,73    4875,1
854,82    3902,5
854,91    2796,5
855    1809,2
855,09    1204
855,18    1107,6
Автор: SERGE_BLIZNUK
Дата сообщения: 17.09.2006 23:05
DiMaS_2006

смотри целую программу [more=тут]
обязательные условия:
1) данные в первом стобце должны РАСТИ - ВНИМАНИЕ! ЭТО ВАЖНО - иначе максимумы
найдутся не для диапазона!
2) должен быть "Лист2" (можно изменить имя на любой свой лист в теле программы)
3) работа идёт со стобцами 1 и 2 (т.е. A и B)

принцип работы - данные собираются на новом листе (Лист2).


Код:
Sub MaxFinder()
Row1 = ActiveSheet.UsedRange.Row
Row2 = Row1 + ActiveSheet.UsedRange.Rows.Count
MsgBox (Str(Row2))
SavedRows = 1
FNumber = Cells(Row1, 1).Value
MaxNumber = -999999
MaxNumberInRow = -1
For i = Row1 To Row2
If IsNumeric(Cells(i, 1).Value) And IsNumeric(Cells(i, 2).Value) Then
If Int(Cells(i, 1).Value) > FNumber Then
' нашли новый диапазон! Сохраняем ранее найденый максимум и вперёд
If MaxNumberInRow > 0 Then
Worksheets("Лист2").Cells(SavedRows, 1).Value = Cells(MaxNumberInRow, 1)
Worksheets("Лист2").Cells(SavedRows, 2).Value = Cells(MaxNumberInRow, 2)
SavedRows = SavedRows + 1
End If
MaxNumber = Cells(i, 2).Value
MaxNumberInRow = i
FNumber = Int(Cells(i, 1).Value)
Else
' мы в сейчас всё ещё диапазоне, ищем максимум
If MaxNumber <= Cells(i, 2).Value Then
MaxNumber = Cells(i, 2).Value
MaxNumberInRow = i
End If
End If
End If
Next
' всё... сохраним максимум для последнего диапазона!
If MaxNumberInRow > 0 Then
Worksheets("Лист2").Cells(SavedRows, 1).Value = Cells(MaxNumberInRow, 1)
Worksheets("Лист2").Cells(SavedRows, 2).Value = Cells(MaxNumberInRow, 2)
SavedRows = SavedRows + 1
End If

End Sub
Автор: DiMaS_2006
Дата сообщения: 18.09.2006 13:11
SERGE_BLIZNUK
Пребольшое спасибо! уже правлю результаты целыми файлами сразу!
Автор: tennisprof
Дата сообщения: 18.09.2006 13:40
Спасибо Yuk большое за помощь в суммировании.
Автор: DONRU1
Дата сообщения: 18.09.2006 19:19
DiMaS_2006
Как вариант. За мастерами не угонишься.
Sub fgh()
Dim i As Integer, a As Integer, Row1 As Integer, FirstSum As Long
a = 0 'нужно если первый элемент - не целое число
For i = 1 To 20
If Cells(i, 1) = "" Then Exit Sub
If IsNumeric(Cells(i, 1)) = True And Right(Cells(i, 1) * 100, 2) = "00" Then
FirstSum = Cells(i, 2)
Row1 = i
i = i + 1
a = a + 1
End If
If a > 0 Then
If Cells(i, 2) < FirstSum Then
Rows(i & ":" & i).Delete Shift:=xlUp
Else
FirstSum = Cells(i, 2)
Rows(Row1 & ":" & Row1).Delete Shift:=xlUp
End If
i = i - 1
End If
Next i
End Sub
Автор: PavelO
Дата сообщения: 19.09.2006 10:01
Здраствуйте, уважаемые форумчане!
Подскажите, пожалуйста как бы мне так получше код составить, в котором каждый из ста label'ов должен иметь caption такой же как и каждая из ста ячеек.
Автор: Xttx
Дата сообщения: 19.09.2006 13:16
Как в екселе сгруппировать одинаковые строчки, т.е в sql - select * from [asdf] GROUP BY [что_то_там].

Есть нечто такое
1010    x    1348    1600    x    1936    630
x    1094    1348    x    1684    1936    x
1010    x    1348    1600    x    2002    630
x    1094    1348    x    1748    2050    x


Нужно что б одинаковые строчки сливались в одну, игнорируя "х"!!!!
То есть в данном приере первые две строчки одинаковые. А остальные разные из за предпоследних двух колонок..

Предположительно сначала "х" заменить на пробел. А дальше???
Подскажите пожалуйсто.
Автор: SERGE_BLIZNUK
Дата сообщения: 19.09.2006 16:07
Xttx

Цитата:
sql - select * from [asdf] GROUP BY [что_то_там].

1) любой нормальный SQL сервер не даст вам выполнить подобный код!
выбирать можно только те поля, которые есть в group by
select [что_то_там] from [asdf] GROUP BY [что_то_там]
2) приведите пример строчек, которые (по вашему мнению) должны остаться после группировки - по вашему же примеру... если будет понятно, что вы хотите, может и получится вам помочь ;-)
Автор: Kurbanov
Дата сообщения: 19.09.2006 16:16
Здравствуйте у меня такой вопрос В VBA Я не силен задачка по сути не сложная
короче необходимо что бы при нажатии кнопки (елементы управления ) в EXCEL выходило окошко с возможностью указать нужную ячейку с данными данные экспортировались с другого листа этого же документа EXcel за ранее спасибо.
Автор: jtyler
Дата сообщения: 19.09.2006 16:56
Как сделать эмуляцию движения мышки и щелчка по кнопке?

Например как будто пользователь выбирает что-то в котекстном меню. Только ето надо не для проверки что выбрал пользователь, а для эмуляции самого пользователя.
Автор: DiMaS_2006
Дата сообщения: 19.09.2006 17:00
DONRU1
Тебе тоже большое спасибо. Сохраню, пригодится!
Автор: Yuk
Дата сообщения: 19.09.2006 19:33
PavelO

Цитата:
код составить, в котором каждый из ста label'ов должен иметь caption такой же как и каждая из ста ячеек.


Код: Private Sub UserForm_Activate()
Dim i As Long
Dim c as Control
i = 0
For Each c In Controls
If TypeOf c Is msforms.Label Then
c.Caption = Sheets("Sheet1").Cells(i, 1).Text
i = i + 1
End If
Next
End Sub
Автор: Xttx
Дата сообщения: 19.09.2006 21:06
SERGE_BLIZNUK
По моему примеру:
Есть нечто такое
1010 x 1348 1600 x 1936 630
x 1094 1348 x 1684 1936 x
1010 x 1348 1600 x 2002 630
x 1094 1348 x 1748 2050 x



Должно остаться следующее
1010 1094 1348 1600 1684 1936 630
1010 1094 1348 1600 1748 2002 630
Группируються все одинаковые строчки. х - это *, то есть может заменять собой любую цифру.

В ситуациях типа
700 х
х 800
701 х
Вторая строчка подходит по шаблону и к первой и к третьей строчки, но первая и третья не совпадают. Тогда береться в порядке сортировки. Например сверху вниз, тогда получаеться:
700 800
701 х

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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