Порядковый номер vba excel

 

lamer811

Пользователь

Сообщений: 17
Регистрация: 28.02.2014

Здравствуйте, ув.специалисты
Подскажите пожалуйста, как реализовать мою задачу средствами VBA
Имеется столбец «Название группы», где есть одинаковые значения в строках, таким группам мне необходимо присваивать порядковый номер
Пример на скриншоте:

 

Юрий М

Модератор

Сообщений: 60587
Регистрация: 14.09.2012

Контакты см. в профиле

Данные в первом столбце не вперемешку?

 

Юрий М

Модератор

Сообщений: 60587
Регистрация: 14.09.2012

Контакты см. в профиле

#3

15.10.2015 13:39:46

Наверное, я слишком сложный вопрос задал ))

Код
Sub Macro1()
Dim i As Long, LastRow As Long, iNum As Long
    iNum = 1
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 2 To LastRow
        Cells(i - 1, 2) = iNum
        If Cells(i - 1, 1) = Cells(i, 1) Then
            Cells(i, 2) = iNum
        Else
            iNum = iNum + 1
            Cells(i, 2) = iNum
        End If
    Next
End Sub

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#4

15.10.2015 13:41:56

Тупо вложенными ЕСЛИ, или таблица соответствий + ВПР

Код
=ЕСЛИ(A1="Слово";1;ЕСЛИ(A1="Буква";2;ЕСЛИ(A1="Точка";3;"Нет такой группы!")))

Изменено: Sanja15.10.2015 13:42:20

Согласие есть продукт при полном непротивлении сторон.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#5

15.10.2015 13:45:12

А можно такой формулой:

Код
=ЕСЛИ(СЧЁТЕСЛИ($A$2:A2;A2)=1;B1+1;B1)

данные для создания группы должны начинаться со второй строки. Или, если с первой, то в первую строку в ячейку В1 надо будет сначала руками записать 1. А в В2 уже формулу, приведенную выше.
Если данные смешанные, а не идут подряд:

Код
=ЕСЛИ(СЧЁТЕСЛИ($A$2:A2;A2)=1;B1+1;ВПР(A2;$A$1:$B1;2;0))

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

lamer811

Пользователь

Сообщений: 17
Регистрация: 28.02.2014

#6

15.10.2015 13:49:35

Цитата
Юрий М написал:
Наверное, я слишком сложный вопрос задал ))Код?1234567891011121314Sub Macro1()Dim i As Long, LastRow As Long, iNum As Long    iNum = 1    LastRow = Cells(Rows.Count, 1).End(xlUp).Row    For i = 2 To LastRow        Cells(i — 1, 2) = iNum        If Cells(i — 1, 1) = Cells(i, 1) Then            Cells(i, 2) = iNum        Else            iNum = iNum + 1            Cells(i, 2) = iNum        End If    NextEnd Sub

Я пока ответа ждал, тоже сделал нечто аналогичное

Код
k = 1 
Set Region = ActiveSheet.UsedRange
FirstRow = 12
LastRow = Region.Row - 1 + Region.Rows.Count
For i = FirstRow To LastRow
j = j + 1
'Если текущая строка = следующей строке
If Cells(i, 4) = Cells(j, 4) Then
'пишем текущий порядковый номер в столбец "Номер группы"
Cells(i, 5) = k
Else
'иначе, т.е. если следующая строка другая, то увеличиваем порядковый номер группы
'и пишем в столбец "Номер группы"
k = k + 1
Cells(i, 5) = k
End If
Next i

Но считает некоторые ячейки почему-то неправильно…
Везде одно и тоже содержимое, но сначала порядковый номер почему-то растёт, а потом всё правильно работает…

Прикрепленные файлы

  • группы2.png (7.27 КБ)

 

Юрий М

Модератор

Сообщений: 60587
Регистрация: 14.09.2012

Контакты см. в профиле

lamer811, можно было обойтись и без цитирования — зачем оно в данном случае?
Мой вариант Вам подходит?

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#8

15.10.2015 13:52:06

Код
If Cells(i, 4) = Cells(j-1, 4) Then

А почему именно макросами? Почему формулами не подходит?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

lamer811

Пользователь

Сообщений: 17
Регистрация: 28.02.2014

#9

15.10.2015 14:00:20

Цитата
The_Prist написал:
А почему именно макросами? Почему формулами не подходит?

Попробовал воспользоваться вашей формулой, везде единицы в итоге

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А Вы файл с реальной структурой данных выложите и увидите, что все работает.
Еще как вариант у Вас отключен автопересчет формул. Если вписать формулу и нажать F9 — что-то изменится?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

lamer811

Пользователь

Сообщений: 17
Регистрация: 28.02.2014

#11

15.10.2015 14:14:26

Цитата
The_Prist написал:
А Вы файл с реальной структурой данных выложите и увидите, что все работает.
Еще как вариант у Вас отключен автопересчет формул. Если вписать формулу и нажать F9 — что-то изменится?

Спасибо! Я сделал!

Изменено: lamer81115.10.2015 14:17:31

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#12

15.10.2015 14:20:43

В Е12 вписываете 1.
В Е13 формулу:

Код
=ЕСЛИ(СЧЁТЕСЛИ($D$12:D13;D13)=1;E11+1;ВПР(D13;$D$12:$E1001;2;0))

изменил только диапазоны — сама формула такой и осталась(в смысле принципа).

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Кстати, для смешанного содержимого формула неверная. Правильная будет выглядеть так:
=ЕСЛИ(СЧЁТЕСЛИ($A$2:A2;A2)=1;МАКС($B$1:B1)+1;ВПР(A2;$A$1:$B1;2;0))

=ЕСЛИ(СЧЁТЕСЛИ($D$12:D13;D13)=1;МАКС($E$1:E1)+1;ВПР(D13;$D$12:$E1001;2;0))

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Hugo

Пользователь

Сообщений: 23256
Регистрация: 22.12.2012

#14

15.10.2015 16:16:12

Если работаете под Виндой, то макрос луше писать на scripting.dictionary — заносите новое слово в словарь, присваиваете ему порядковый номер (можно последний или хранить в переменной, или ориентироваться на размер словаря).
Ну а если слово не новое (есть уже в словаре), то номер берёте из словаря.
Так нет нужды следить чтоб всё было осортировано.
Т.к. примера файла нет — нет и кода. А то скажете что не работает :)

Вот, держите, нумерация продолжается даже после закрытия и открытия экселя. Весь код добавляется в модуль рабочей книги документа. И еще, учтите, копия сохраняется при каждом сохранении документа, следите за их количеством. Надеюсь, что все это для благих целей.

Добавлено через 3 минуты

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim sTruncated As String, sBase As String
    Dim sShortFileName As String, sExtension As String
    Dim s As String
    Dim i As Long
    sShortFileName = ActiveWorkbook.Name
    i = InStrRev(sShortFileName, ".", , vbTextCompare)
    sExtension = Right(sShortFileName, Len(sShortFileName) - i)
    sTruncated = Left(sShortFileName, i - 1)
    i = InStrRev(sTruncated, "_", , vbTextCompare)
    If i Then
        sBase = Left(sTruncated, i - 1)
        i = FindLast(sBase, sExtension)
        If i Then
            sShortFileName = sBase & "_" & CStr(i + 1) & "." & sExtension
        Else
            GoTo AddNum
        End If
    Else
AddNum:
        sShortFileName = sTruncated & "_1." & sExtension
    End If
    With ActiveWorkbook
        s = MyPath(.FullName) & sShortFileName
        .SaveCopyAs s
    End With
End Sub
Private Function FindLast(sBase As String, sExtension As String) As Long
    Dim sFileName As String, s As String
    Dim i As Long, imax As Long, iLen As Long
    iLen = Len(sBase)
    sFileName = MyPath(ActiveWorkbook.FullName) & "*." & sExtension
    s = Dir(sFileName)
    Do Until s = ""
        i = InStr(1, s, sBase, vbTextCompare)
        If i = 1 Then
            s = Right(s, Len(s) - iLen)
            i = FindNumber(s)
            imax = IIf(imax < i, i, imax)
        End If
        s = Dir
    Loop
    FindLast = imax
End Function
Private Function MyPath(sFullName As String) As String
    Dim i As Long
    i = InStrRev(sFullName, "", , vbTextCompare)
    MyPath = Left(sFullName, i)
End Function
Private Function FindNumber(sSearched As String) As Long
    Dim i As Long
    Dim s As String
    i = InStrRev(sSearched, ".", , vbTextCompare)
    s = Left(sSearched, i - 1)
    i = InStrRev(s, "_", , vbTextCompare)
    If i Then
        s = Right(s, Len(s) - i)
        FindNumber = Val(s)
    End If
End Function

Добавлено через 4 часа 38 минут

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim sTruncated As String, sBase As String
    Dim sShortFileName As String, sExtension As String
    Dim s As String
    Dim i As Long, iNum As Long
    sShortFileName = ActiveWorkbook.Name
    i = InStrRev(sShortFileName, ".", , vbTextCompare)
    sExtension = Right(sShortFileName, Len(sShortFileName) - i)
    sTruncated = Left(sShortFileName, i - 1)
    i = InStrRev(sTruncated, "_", , vbTextCompare)
    sBase = sTruncated
    If i Then
        sBase = Left(sTruncated, i - 1)
        s = Right(sTruncated, Len(sTruncated) - i)
        i = Val(s)
        If i Then
            sTruncated = sBase
        Else
            sBase = sTruncated
        End If
    End If
    iNum = FindLast(sBase, sExtension)
    sShortFileName = sTruncated & "_" & CStr(iNum + 1) & "." & sExtension
    With ActiveWorkbook
        s = MyPath(.FullName) & sShortFileName
        .SaveCopyAs s
     End With
End Sub
 
Private Function FindLast(sBase As String, sExtension As String) As Long
    Dim sFileName As String, s As String
    Dim i As Long, imax As Long, iLen As Long
    iLen = Len(sBase)
    sFileName = MyPath(ActiveWorkbook.FullName) & "*." & sExtension
    s = Dir(sFileName)
    Do Until s = ""
        i = InStr(1, s, sBase, vbTextCompare)
        If i = 1 Then
            s = Right(s, Len(s) - iLen - 1)
            i = Val(s)
            imax = IIf(imax < i, i, imax)
        End If
        s = Dir
    Loop
    FindLast = imax
End Function
Private Function MyPath(sFullName As String) As String
    Dim i As Long
    i = InStrRev(sFullName, "", , vbTextCompare)
    MyPath = Left(sFullName, i)
End Function

Добавлено через 1 минуту
Исправлены обнаруженные баги.



1



Присвоить порядковый номер файла к тексту в ячейке

Yar4i

Дата: Вторник, 05.09.2017, 11:22 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

Итак, имеем папку «П» расположенную по пути «D:П»
В этой папке куча Excel файлов (возможны подпапки — их не считаем — если не возможно, то удалю подпапки).
Эти файлы отсортированы По имени По возрастанию.
В каждом файле ячейка B1 содержит «А-5-В-NNN 25 ЛМ» или «NNN 25 ЛМ» (NNN — она обязательно содержит)
Необходимо:
Я открываю первый файл и запускаю макрос, а в ячейке B1 должна произойти замена NNN на порядковый номер файла (1 в нашем первом файле)
На фото я привёл пример и там четвертый файл по порядку (имя ему 555555) и следовательно в нём NNN меняется на 4

П.С. И NNN я добавляю самостоятельно макросом прописываю — вместо NNN может быть любое значение, вплоть до пустоты — главное эту пустоту потом заменить на порядковый номер открытого для запуска файла. И чуть глубже (Лучше не читать) но, если вы захотите переименовать весь массив файлов в папке, то вместо B1 я нумерацию внесу в U1 — чтоб не произошло возможное удаление данных из возможно занятой ячейки B1

Сообщение отредактировал Yar4iВторник, 05.09.2017, 11:43

 

Ответить

nilem

Дата: Вторник, 05.09.2017, 12:18 |
Сообщение № 2

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

в ячейке B1 должна произойти замена NNN на порядковый номер файла

вместо NNN может быть любое значение, вплоть до пустоты

что же менять на порядковый номер?


Яндекс.Деньги 4100159601573

 

Ответить

Yar4i

Дата: Вторник, 05.09.2017, 12:53 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010


это к тому, что я сам назначаю ячейке символы NNN и это о том откуда они (NNN) взялись. Просто немного пояснил — надеюсь не запутал. Это продолжение ответа на вопрос из пятого поста этой темы.
Т.е. Я запускаю макрос где первым пунктом идёт присвоения ячейке B1 текста «А-5-В-NNN 25 ЛМ»
А далее нужно по коду изменить NNN на порядковый номер.

Сообщение отредактировал Yar4iВторник, 05.09.2017, 13:01

 

Ответить

RAN

Дата: Вторник, 05.09.2017, 14:28 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Сначала выкрасить, затем выбросить? И зачем красить? Что мешает сразу писать «А-5-В-порядковый номер 25 ЛМ»
[vba]

Код

Sub ww()
    For i = 1 To Workbooks.Count
        Range(«a» & i) = «À-5-Â-» & i & » 25 ËÌ»
    Next
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

nilem

Дата: Вторник, 05.09.2017, 14:34 |
Сообщение № 5

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

Yar4i, попробуйте


Яндекс.Деньги 4100159601573

 

Ответить

Yar4i

Дата: Вторник, 05.09.2017, 16:15 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 137


Репутация:

1

±

Замечаний:
0% ±


Excel 2010


Спасибо.
Сразу не переименовывал, т.к. хотел в случае неудобств вернуться к первоначальному варианту с проставлением нумерации вручную.
Да, и что-то я упёрся в эти NNN). Спасибо.

Спасибо.

 

Ответить

Sub Main()

    Dim shAct As Worksheet, shTemp As Worksheet
    Dim rngAct As Range, rngTemp As Range, arr(), dicRangs As Object
    Dim lng_rang As Long, lr As Long, i As Long

            ‘1. Отключение монитора.
    Application.ScreenUpdating = False

        ‘2. Vba-именование активного листа.
    Set shAct = ActiveSheet

        ‘3. Vba-именование фрагмента на активном листе, в котором находятся данные.
    lr = shAct.Columns(«B»).Find(What:=»*», LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    Set rngAct = shAct.Range(«A1:B» & lr)

        ‘4. Создание временного файла и vba-именование первого листа.
    Set shTemp = Workbooks.Add.Worksheets(1)

        ‘5. Vba-именование фрагмента на временном листе, где будут данные.
    Set rngTemp = shTemp.Range(«A1»).Resize(rngAct.Rows.Count, 2)

        ‘6. Копирование данных из активного листа на временный.
    rngAct.Columns(2).Copy
    rngTemp.Columns(2).PasteSpecial xlPasteValues
    Application.CutCopyMode = False

        ‘7. Сортировка.
    shTemp.Sort.SortFields.Add Key:=rngTemp.Columns(2), Order:=xlAscending
    With shTemp.Sort
        .SetRange rngTemp.Columns(2)
        .Header = xlNo
        .Orientation = xlTopToBottom
        .Apply
    End With

        ‘8. Копирование данных в vba-массив, чтобы ускорить.
    arr() = rngTemp.Value

        ‘9. Удаление временного файла.
    shTemp.Parent.Close SaveChanges:=False

        ’10. Вставка в массив в столбец слева рангов.
    For i = 1 To UBound(arr, 1) Step 1
        If arr(i, 2) <> 0 Then
            ‘ Если это первое число.
            If lng_rang = 0 Then
                lng_rang = lng_rang + 1
                arr(i, 1) = lng_rang
            Else
                ‘ Сравнение с вышестоящим.
                If arr(i, 2) = arr(i — 1, 2) Then
                    arr(i, 1) = lng_rang
                Else
                    lng_rang = lng_rang + 1
                    arr(i, 1) = lng_rang
                End If
            End If
        End If
    Next i

        ’11. Копирование данных из массива в словарь.
    Set dicRangs = CreateObject(Class:=»Scripting.Dictionary»)
    For i = 1 To UBound(arr, 1) Step 1
        If dicRangs.Exists(Key:=arr(i, 2)) = False Then
            dicRangs.Add Key:=arr(i, 2), Item:=arr(i, 1)
        End If
    Next i

        ’12. Копирование данных из эксель в массив для ускорения.
    arr() = rngAct.Value

        ’13. Вставка рангов.
    For i = 1 To UBound(arr, 1) Step 1
        If dicRangs.Exists(Key:=arr(i, 2)) = True Then
            rngAct.Cells(i, 1).Value = dicRangs.Item(Key:=arr(i, 2))
        End If
    Next i

        ’14. Включение монитора.
    Application.ScreenUpdating = True

        ’15. Сообщение.
    MsgBox «Готово.», vbInformation

    End Sub

[свернуть]

In excel, how can I create auto numbering in column A ? eg. If I key in cell value in D1 with «BILLY», column A will populate sequence numbers from 1,2,3…..

I have googled and found the closet is using below formula but unable to accomplish what i want because in column C i have multiple data need to select.

https://superuser.com/questions/645859/auto-sequential-numbering-based-on-cell-criteria/645903

A     B     C
     ABC    JAMES
     XYZ    BOB
1    OXY    BILLY
2    BNX    BILLY
     SDA    MIKE
3    WXK    BILLY
     SAK    JANE

Anyone have done this before with formula or vba? would appreciate your help, thanks.

asked Sep 20, 2017 at 15:30

robin's user avatar

2

Select the whole column A or just the cells that you want to fill in and enter the formula in the formula bar,

=IF(C1=D$1,COUNTIF(C$1:C1,D$1),"")

Press ctrl+enter to fill the formula for the range of selected cells.

You could then change the value in cell D1 and see the output.

enter image description here

enter image description here

answered Sep 20, 2017 at 15:41

Gowtham Shiva's user avatar

Gowtham ShivaGowtham Shiva

3,8022 gold badges11 silver badges27 bronze badges

6

Put the formula =IF(C1=$D$1,COUNTIF($C$1:C1,$D$1),"") in A1 and copied down.

answered Sep 20, 2017 at 15:36

Vincent G's user avatar

Vincent GVincent G

3,1531 gold badge13 silver badges30 bronze badges

0

Понравилась статья? Поделить с друзьями:
  • Поручение экспедитору скачать бланк word
  • Портфолио школьника шаблон word скачать бесплатно
  • Портфолио ученика скачать шаблоны в формате word для заполнения
  • Портфолио ученика скачать бесплатно в формате word
  • Портфолио образец в word скачать бесплатно