0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
1

Помогите доделать макрос (рабочий диапазон, функция и т.п.)

27.04.2007, 09:00. Показов 3492. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ помогите пожалуйста
Есть такой макрос:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub Macros()
'-------------begin----------
Dim LastValue As Single ' The value of last cell would be placed here
Dim I As Integer ' last row identificator
Dim Ifor As Integer ' common purpose variable
Dim J As Integer ' current counter - number of next going equal values
Dim tf As Boolean ' indicate whether previous cells value equal to current
Dim maxJ As Integer ' common counter - maximum number of next going equal values
I = ActiveCell.SpecialCells(xlLastCell).Row ' define last row
LastValue = Cells(I, 1).Value
J = 0 'initial values
tf = False ' ----
maxJ = 0 ' ----
For Ifor = 1 To I ' we are to path thru all rows in range
If Cells(Ifor, 1).Value = LastValue Then 'compare current value and the last one
If tf Then ' values are equal, here checked if previous value was also LastValue
J = J + 1 ' yes, add 1 to counter
Else
tf = True ' values equal but it's the first value to meet
maxJ = IIf(maxJ > J, maxJ, J) 'compare counters current and common,
' if number in current counter is more then in common one it
' become the value of common counter
J = 1 ' current counter is 1 again
End If
Else
tf = False ' values are not equal
End If
Next
maxJ = IIf(maxJ > J, maxJ, J)
Cells(I, 2).Value = CStr(LastValue) + "(" + Trim(Str(maxJ)) + ")" 'put result
'------------ end-------------
End Sub
Он делает такую хрень:
Например, есть часть столбца A1:A20,
в нем расположены числа сверху вниз от A1 до A7,
и выводиться на экран следующая запись:

"5 (3)", что значит 5-последнее значение, (3)-3 пятерки подряд
1
2
3
4
5
5
5
Но он работает только в столбце A, и считает только числовые значения, а диапзонов где его надо применить много.
Надо его переделать в функцию и чтоб считал также текстовые данные, и еще чтобы можно было указывать рабочий дипазон.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2007, 09:00
Ответы с готовыми решениями:

Доделать макрос
Здравствуйте! Я делала програмку в екселе. В работе 4 флажка: разность, сумма, произведение,...

Как доделать макрос?
Есть макрос Private Sub CommandButton1_Click() Dim bookName As String, dict As Object,...

Рабочий макрос не работает
Доброго времени суток. Имеется несложный прайс, на котором нужно применить макрос. Суть...

Заложить в макрос выделенный диапазон на листе
Подскажите пожалуйста, как можно сослаться в макросе на выделенный диапазон на листе есть такой...

14
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
27.04.2007, 13:42 2
<STRONG>[вопрос перенесен в форум по VBA]</STRONG>
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
27.04.2007, 17:55 3
Если только для цифр, то
=МОДА(E14:E20) & " (" & СЧЁТЕСЛИ(E14:E20;МОДА(E14:E20))&")"
где E14:E20 ваш диапазон
P.S.
=МОДА(Данные) - ищет часто встречаемое число
=СЧЁТЕСЛИ(Данные;МОДА(Данные)) - сколько раз оно повторялось
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
27.04.2007, 18:45 4
а так не пойдёт ? ))
Visual Basic
1
2
3
4
5
Function myCount(iRange As Range) As String
    Dim iItem As Variant
    iItem = Range(Right(iRange.Address, 5)).Value
    myCount = iItem & " (" & Application.CountIf(iRange, iItem) & ")"
End Function
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
27.04.2007, 22:40  [ТС] 5
Visual Basic
1
2
3
4
5
Function myCount(iRange As Range) As String 
 Dim iItem As Variant
 iItem = Range(Right(iRange.Address, 5)).Value
 myCount = iItem & " (" & Application.CountIf(iRange, iItem) & ")"
End Function
Выдает ошибку #ЗНАЧ, но вот такую штуку как раз и надо внедрить в вышеописанный макрос (и переделать в функцию)
А МОДА не подходит, делает не то ( должно определяться нижнее (текущее) значение, и так чтобы, считалось бы количество рядомстоящих одинаковых значений равных нижнему)
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
27.04.2007, 23:25 6
а так ? )
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Function myCount(iRange As Excel.Range) As String
    Dim LastValue As Variant
    Dim J As Integer
    Dim tf As Boolean
    Dim maxJ As Integer
    Dim iCell As Range
    LastValue = Split(iRange.Address(False, False), ":")
    LastValue = LastValue(1)
    LastValue = Range(LastValue).Value
    J = 0
    tf = False
    maxJ = 0
    For Each iCell In iRange
        If iCell.Value = LastValue Then
            If tf Then
                J = J + 1
            Else
                tf = True
                maxJ = IIf(maxJ > J, maxJ, J)
                J = 1
            End If
        Else
            tf = False
        End If
    Next
    maxJ = IIf(maxJ > J, maxJ, J)
    myCount = CStr(LastValue) + " (" + Trim(Str(maxJ)) + ")"
End Function
P.S. когда хотите выложить код на форуме, пожалуйста, берите его в тэги
[.code]
.... ВАШ КОД...
[./code]
только без точек, которые я написал внутри квадратных скобок (они для того, чтобы вы увидели эти скобки сейчас)
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
28.04.2007, 08:18  [ТС] 7
Теперь функция работает, но только если рабочий дипазон заполнен полностью.
Извиняюсь ,по ходу я нет так обьяснил что нужно сделать:
Эта функция должна работать по мере заполнения дипазона сверху вниз, с каждым новым введеным значением должно проверяться наличие сверху рядомстоящих одинаковых значений.
Если в рабочем дипазоне нет значений, то в результирующей ячейке должно быть пусто.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
28.04.2007, 15:27 8
А так ? )
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Function myCount(iRange As Excel.Range) As String
    Dim LastValue As Variant
    Dim J As Integer
    Dim tf As Boolean
    Dim maxJ As Integer
    Dim iCell As Range
    For Each iCell In iRange
        If iCell.Value = Empty Then Exit For
        LastValue = iCell.Value
    Next
    If LastValue = Empty Then
        myCount = "" 'или 0
        Exit Function
    End If
    J = 0
    tf = False
    maxJ = 0
    For Each iCell In iRange
        If iCell.Value = LastValue Then
            If tf Then
                J = J + 1
            Else
                tf = True
                maxJ = IIf(maxJ > J, maxJ, J)
                J = 1
            End If
        Else
            tf = False
        End If
    Next
    maxJ = IIf(maxJ > J, maxJ, J)
    myCount = CStr(LastValue) & " (" & Trim(Str(maxJ)) & ")"
End Function
P.S. если диапазон пуст - функция ничего не отобразит - т.е. будет пустая ячейка (но можно, чтобы она отобразила 0 - в коде есть комментарий)
P.P.S. у мя закончился интернет на работе, если что, смогу ответить только из дома после 9 вечера )
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
29.04.2007, 21:32  [ТС] 9
Вообщем работает,но для некоторых дипазонов считает правильно, а для других неправильно.
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
30.04.2007, 02:31 10
Т.е в примере:

да
да
да
да
нет
да

ответ должен быть - да (1) ?

т.е. считаем кол-во последнего элемента снизу вверх до первого несовпадения (в данном случае слова - нет) ? А я думал в этом примере ответ должен быть да (4). Я ошибался? )
P.S. кстати ваш макрос в вашем первом посте на примере цифр

5
5
5
5
7
5

даёт результат 5(4), т.е. этот результат неверный?
Просто я не переделывал логику вашего макроса, я лишь переделал, чтобы он ещё обрабатывал нужный диапазон и текстовые значения. Логику я просто скопировал из вашего макроса. А теперь получается, что вы хотите другую логику посчёта. Я немного запутался )
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
30.04.2007, 02:49  [ТС] 11
Походу мне изначально сделали неправильную логику
да
да
да
да
нет
да
Должно быть да (1)
считаем кол-во последнего элемента снизу вверх до первого несовпадения (в данном случае слова - да)
а здесь
5
5
5
5
7
5
Должно быть 5(1)
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
30.04.2007, 05:59 12
а вот так ? )
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function myCount(iRange As Excel.Range) As String
    Dim LastValue As Variant, iCell As Range
    Dim iFirstRow&, iLastRow&, TotalRows&, n&, i&, iCellRow$
    iFirstRow = iRange.Areas(1).Row
    iLastRow = iRange.Areas(1).Row + iRange.Areas(1).Rows.Count - 1
    TotalRows = iRange.Areas(1).Rows.Count
    For Each iCell In iRange
        If Len(iCell.Value) = 0 Then Exit For
        LastValue = iCell.Value
        iCellRow = iCell.Row
    Next
    If LastValue = Empty Then
        myCount = "" 'или 0
        Exit Function
    End If
    n = 1
    For i = iCellRow - 1 To iFirstRow Step -1
        If Cells(i, Application.Caller.Column) <> LastValue Then Exit For
        If Cells(i, Application.Caller.Column) = LastValue Then n = n + 1
    Next i
    myCount = CStr(LastValue) & " (" & n & ")"
End Function
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
01.05.2007, 05:08  [ТС] 13
Сейчас вроде все работает, но только значения 0 не считает
0
996 / 355 / 135
Регистрация: 27.10.2006
Сообщений: 764
01.05.2007, 05:24 14
А вот так ? )
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function myCount(iRange As Excel.Range) As String
    Dim LastValue As Variant, iCell As Range
    Dim iFirstRow&, iLastRow&, TotalRows&, n&, i&, iCellRow$
    iFirstRow = iRange.Areas(1).Row
    iLastRow = iRange.Areas(1).Row + iRange.Areas(1).Rows.Count - 1
    TotalRows = iRange.Areas(1).Rows.Count
    For Each iCell In iRange
        If Len(iCell.Value) = 0 Then Exit For
        LastValue = iCell.Value
        iCellRow = iCell.Row
    Next
    If LastValue = "" Then
        myCount = "" 'или 0
        Exit Function
    End If
    n = 1
    For i = iCellRow - 1 To iFirstRow Step -1
        If Cells(i, Application.Caller.Column) <> LastValue Then Exit For
        If Cells(i, Application.Caller.Column) = LastValue Then n = n + 1
    Next i
    myCount = CStr(LastValue) & " (" & n & ")"
End Function
0
0 / 0 / 0
Регистрация: 27.04.2007
Сообщений: 7
05.05.2007, 09:39  [ТС] 15
Спасибо все работает)
0
05.05.2007, 09:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2007, 09:39
Помогаю со студенческими работами здесь

Доделать макрос поиска слов в фразах
Здравствуйте помогите пожалуйста доделать макрос. У меня есть макрос, который делает то что мне...

Удаление лишних строк - доделать макрос
Приветствую знатоков и прошу помочь доделать код. Есть текстовые данные, разбитые постранично. На...

Доделать макрос разбора htm файла
Добрый день уважаемые.Пишу к Вам ,стоя под дулом пистолета. Напрягли меня разобраться в макросе и...

Макрос сохраняющий определенный диапазон страниц в pdf файл
Необходим макрос сохраняющий определенный диапазон страниц в pdf файл.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru