Перейти к содержимому

Фото
- - - - -

Для тех кто знает VBA


  • Вы не можете создать новую тему
  • Please log in to reply
11 ответов в этой теме

#1 foreverman

foreverman
  • Постоялец
  • 743 сообщений

Отправлено 26 Октябрь 2009 - 23:04

Запарился я искать в нете как это сделать а также в экселе функции...

Вообщем задача следующая дан массив 5 х 6 полей в каждом поле разные цыфры Нужно чтоб процедура выполнила поиск самых часто встречающихся цыфр и выписала все цыфры в отдельные ячейки в столбец...
Затем.. сначало это потом может разбирусь
  • 0
Работа в европе.
www.farusco.eu

#2 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 26 Октябрь 2009 - 23:48

Проходишь весь массив, заносишь с проверкой на наличие элементы в другой массив, содержащий элементы и кол-во повторений. Если элемента нет, добавляешь, ежели есть, никременируешь кол-во повторений. Сортируешь полученный массив по кол-ву повторений.
При чем здесь ВБА? Ждешь, что кто-то код напишет? Зря.
Если ждешь некоей помощи именно по ВБА, то задавай более конкретные вопросы, касающиеся непосредсвенно языка, а не по алгоритмам.
  • 0

#3 foreverman

foreverman
  • Постоялец
  • 743 сообщений

Отправлено 26 Октябрь 2009 - 23:59

я думал код напишут :) должно ведь быть не сложно кто программит... Или может есть пример похожий а то гугл всякую туфту выдёт.. про count counta (никогда так долго в интернете не искал что либо)
тогда где можно хороший справочник в нете посмотреть ?

во идея.. алгоритм я сам придумаю. напишите плиз подходящие функции...
  • 0
Работа в европе.
www.farusco.eu

#4 Pevko

Pevko
  • Пользователь
  • 261 сообщений

Отправлено 27 Октябрь 2009 - 00:03

Гг)) конченный ВБА)) благо пройденный этап ))
  • 0

#5 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 27 Октябрь 2009 - 00:10

F1
for, if

Считать/изменить значение конкретной ячейки (например А2) на активном листе можно обратившись к
Activesheet.Range("A2").Value или
Activesheet.Cell(2,1)

Как осуществляеть сортировка средствами VBA, можно начав запись нового макроса, совершив сортировку вручную, остановив запись и наконец изучив, что же ексель записал в макрос.
Соответсвенно, данный ход можно применять и к другим манипуляциям.
  • 0

#6 foreverman

foreverman
  • Постоялец
  • 743 сообщений

Отправлено 27 Октябрь 2009 - 22:10

Sub Button()
сюда надо поставить функцию которая справшивает область значений... тобишь она спрашивает какой массив выбрать..
А если не знаешь название этой функции то искать её бесполезно.. правильно ведь...
  • 0
Работа в европе.
www.farusco.eu

#7 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 27 Октябрь 2009 - 23:15

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

В чем загвоздка?

А если не знаешь название этой функции то искать её бесполезно.. правильно ведь...

О чем речь? О функции, запрашивающей область массива? Inputbox() в помощь.
  • 0

#8 foreverman

foreverman
  • Постоялец
  • 743 сообщений

Отправлено 28 Октябрь 2009 - 15:55

мда... этот инпут бокс он просит в ручную ввести а мне надо выделить какие то ячейки на листе и чтоб она их добавила к себе в расчёты ... дальше она будет считать каких значении было больше каких меньше и в отсортированом виде выдавать в столбик там где я покажу первую ячейку..
  • 0
Работа в европе.
www.farusco.eu

#9 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 28 Октябрь 2009 - 19:08

Selection
  • 0

#10 foreverman

foreverman
  • Постоялец
  • 743 сообщений

Отправлено 29 Октябрь 2009 - 03:05

Вообщем первый шаг сделан... блин еслиб я знал что это так просто сам бы подсказал... да и функцию я отыскал... это COuntif() но это только первые шаги
Вот что получилось...

Sub putDates()

Dim rRange As Range, startcell, allnumbers

On Error Resume Next

Application.DisplayAlerts = False

Set rRange = Application.InputBox(Prompt:="Please select a range.", Title:="SPECIFY RANGE", Type:=8)

On Error GoTo 0

Application.DisplayAlerts = True

If rRange Is Nothing Then
Exit Sub

Else
Set startcell = Application.InputBox(Prompt:="Cell for input", Title:="SPECIFY RANGE", Type:=8)
End If
End Sub

Но теперь мне надо чтоб из тои области которую я положил в инпут бокс вытащить значения ячеек и посчитать количество одного типа значении, другого и так далее... . А затем он будет спрашивать целл инпут для того чтоб вывести показаные значения в ячеку друг за другом после той которую я ввёл...
хмм а могу я просто из этого кфтпу приделать к нему Countif(rRange,5)

Я так думаю мне там понадобится оператор FOR ... ещё бы узнать по человечески как она работает


Range("startcell").CountIf(rRange, 5).Paste почему такая штука не прокатывает?

Сообщение изменено: foreverman (29 Октябрь 2009 - 03:44 )

  • 0
Работа в европе.
www.farusco.eu

#11 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 29 Октябрь 2009 - 09:26

Dim rRange As Range, startcell, allnumbers
Notes: В VBA при декларировании переменных конкретного типа, тип необходимо указывать для каждой переменной.
В данном случае имеем
rRange As Range
startcel As Variant
allnumbers As Variant
ибо, для них тип не указан

Но теперь мне надо чтоб из тои области которую я положил в инпут бокс вытащить значения ячеек и посчитать количество одного типа значении, другого и так далее

Range.Value

Я так думаю мне там понадобится оператор FOR ... ещё бы узнать по человечески как она работает

F1
For I = 1 To 10
	For J = 1 To 10
		For K = 1 To 10
			...
		Next K
	Next J
Next I
или
For Each MyObject In MyCollection	' Iterate through each element. 
	If MyObject.Text = "Hello" Then	' If Text equals "Hello".
		Found = True	' Set Found to True.
		Exit For	' Exit loop.
	End If
Next
В твоем случае
Dim r as Range
for each r in rRange do
  'r.Value - значение текущей ячейки
Next

хмм а могу я просто из этого кфтпу приделать к нему Countif(rRange,5)

Можешь, обращение к формулам Excel из VBA ведеться посредством
Application.WorksheetFunction
Учти, что на данном этапе неизвестен список уникальных значений

Range("startcell").CountIf(rRange, 5).Paste почему такая штука не прокатывает?

А почему он должен прокатывать? "startcell" - строковое значение, а не переменная startcell. У тебя на листе определена область с таким именем? Сильно сомневаюсь. К тому же Range не обладает функцией CountIf. Итого, 2 ошибки в одной строке.

Какого назначение области, хранящейся в startcell? Подозреваю, что в ней нет никакой необходимости
  • 0

#12 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 29 Октябрь 2009 - 09:49

Совет
Debug.Print
Может значительно упростить отладку, результат можно увидеть открыв окно Immediate. View -> Immediate Window, или Ctrl + G
Совет 2
Старайся не использовать GoTo, усложняет чтение кода

Notes: код поставленной задачи с объявлением процедуры, всеми переменными и форматированием с лихвой укладываеться в 30 строк.
  • 0