Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос для анализа совпадений - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для анализа совпадений (Макросы Sub)
Макрос для анализа совпадений
Evgen2350 Дата: Воскресенье, 29.12.2013, 23:30 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброй ночи, друзья!
Прошу помощи в создании макроса для решения задачи по анализу совпадений.
Дано: массив с различным количеством столбцов (от 2 до 10 и более) с числовыми значениями.
Необходимо объединить их в 1 столбец, а в следующих столбцах указать количество повторений значений в каждом столбце данного массива.
Возможно ли создать макрос для решения такой задачи?
Заранее благодарен за помощь.
К сообщению приложен файл: 2171966.xlsx (10.4 Kb)


Сообщение отредактировал Evgen2350 - Воскресенье, 29.12.2013, 23:30
 
Ответить
СообщениеДоброй ночи, друзья!
Прошу помощи в создании макроса для решения задачи по анализу совпадений.
Дано: массив с различным количеством столбцов (от 2 до 10 и более) с числовыми значениями.
Необходимо объединить их в 1 столбец, а в следующих столбцах указать количество повторений значений в каждом столбце данного массива.
Возможно ли создать макрос для решения такой задачи?
Заранее благодарен за помощь.

Автор - Evgen2350
Дата добавления - 29.12.2013 в 23:30
SergeyKorotun Дата: Понедельник, 30.12.2013, 02:11 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 301
Репутация: 15 ±
Замечаний: 0% ±

Excel 2007
[vba]
Код
Option Base 1
Sub qwerty()
    Dim a() As Variant
    Dim b() As Variant
    Dim c() As Variant
    Dim abc() As Variant
     
    Application.ScreenUpdating = False
    ra = Cells(65000, 1).End(xlUp).Row
    rb = Cells(65000, 2).End(xlUp).Row
    rc = Cells(65000, 3).End(xlUp).Row
    a() = Range("A1:A" & ra).Value
    b() = Range("B1:B" & rb).Value
    c() = Range("C1:C" & rc).Value
     
    n = 0
    For i = 1 To ra
        flg = False
        For j = 1 To n
           If abc(j) = a(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = a(i, 1)
        End If
    Next i
     
    For i = 1 To rb
        flg = False
        For j = 1 To n
           If abc(j) = b(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = b(i, 1)
        End If
    Next i
     
    For i = 1 To rc
        flg = False
        For j = 1 To n
           If abc(j) = c(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = c(i, 1)
        End If
    Next i
     
    ' сортировка ip адресов, если не нужна, удалите
    For i = 1 To n - 1
       For j = i + 1 To n
          If abc(i) > abc(j) Then
             tmp = abc(i)
             abc(i) = abc(j)
             abc(j) = tmp
          End If
       Next j
    Next i
    ' конец сортировки
     
    Columns("F:I").ClearContents
    For i = 1 To n
       Cells(i, 6).Value = abc(i)
       cnt = 0
       For j = 1 To ra
           If abc(i) = a(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 7).Value = cnt
       cnt = 0
       For j = 1 To rb
           If abc(i) = b(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 8).Value = cnt
       cnt = 0
       For j = 1 To rc
           If abc(i) = c(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 9).Value = cnt
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]
 
Ответить
Сообщение[vba]
Код
Option Base 1
Sub qwerty()
    Dim a() As Variant
    Dim b() As Variant
    Dim c() As Variant
    Dim abc() As Variant
     
    Application.ScreenUpdating = False
    ra = Cells(65000, 1).End(xlUp).Row
    rb = Cells(65000, 2).End(xlUp).Row
    rc = Cells(65000, 3).End(xlUp).Row
    a() = Range("A1:A" & ra).Value
    b() = Range("B1:B" & rb).Value
    c() = Range("C1:C" & rc).Value
     
    n = 0
    For i = 1 To ra
        flg = False
        For j = 1 To n
           If abc(j) = a(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = a(i, 1)
        End If
    Next i
     
    For i = 1 To rb
        flg = False
        For j = 1 To n
           If abc(j) = b(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = b(i, 1)
        End If
    Next i
     
    For i = 1 To rc
        flg = False
        For j = 1 To n
           If abc(j) = c(i, 1) Then
              flg = True
           End If
        Next j
        If Not flg Then
           n = n + 1
           ReDim Preserve abc(n)
           abc(n) = c(i, 1)
        End If
    Next i
     
    ' сортировка ip адресов, если не нужна, удалите
    For i = 1 To n - 1
       For j = i + 1 To n
          If abc(i) > abc(j) Then
             tmp = abc(i)
             abc(i) = abc(j)
             abc(j) = tmp
          End If
       Next j
    Next i
    ' конец сортировки
     
    Columns("F:I").ClearContents
    For i = 1 To n
       Cells(i, 6).Value = abc(i)
       cnt = 0
       For j = 1 To ra
           If abc(i) = a(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 7).Value = cnt
       cnt = 0
       For j = 1 To rb
           If abc(i) = b(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 8).Value = cnt
       cnt = 0
       For j = 1 To rc
           If abc(i) = c(j, 1) Then
              cnt = cnt + 1
           End If
       Next j
       Cells(i, 9).Value = cnt
    Next i
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - SergeyKorotun
Дата добавления - 30.12.2013 в 02:11
anvg Дата: Понедельник, 30.12.2013, 03:44 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе утро.
Ещё вариант :)
[vba]
Код

Public Sub CreateReport()
      Dim pDict As Object, pSheet As Worksheet
      Dim vData As Variant, arrOut() As Variant
      Dim iRow As Long, iCol As Long, idRow As Long
      Dim LRow As Long, LCol As Long, curVal As Variant
      Set pSheet = ActiveSheet
      Set pDict = CreateObject("Scripting.Dictionary")
      vData = pSheet.UsedRange.Value: idRow = 0
      LRow = UBound(vData): LCol = UBound(vData, 2)
      ReDim arrOut(1 To LRow * LCol, 1 To LCol + 1)
      For iCol = 1 To LCol
          For iRow = 1 To LRow
              curVal = Trim$(CStr(vData(iRow, iCol)))
              If curVal <> "" Then
                  If pDict.Exists(curVal) Then
                      idRow = pDict(curVal)
                      arrOut(idRow, iCol + 1) = arrOut(idRow, iCol + 1) + 1
                  Else
                      idRow = idRow + 1
                      pDict.Add curVal, idRow
                      arrOut(idRow, 1) = curVal
                      arrOut(idRow, iCol + 1) = 1&
                  End If
              End If
          Next
      Next
      Set pSheet = Worksheets.Add
      pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow * LCol, LCol + 1)).Value = arrOut
      pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow * LCol, LCol + 1)).EntireColumn.AutoFit
End Sub
[/vba]
С наступающим!


Сообщение отредактировал anvg - Понедельник, 30.12.2013, 03:47
 
Ответить
СообщениеДоброе утро.
Ещё вариант :)
[vba]
Код

Public Sub CreateReport()
      Dim pDict As Object, pSheet As Worksheet
      Dim vData As Variant, arrOut() As Variant
      Dim iRow As Long, iCol As Long, idRow As Long
      Dim LRow As Long, LCol As Long, curVal As Variant
      Set pSheet = ActiveSheet
      Set pDict = CreateObject("Scripting.Dictionary")
      vData = pSheet.UsedRange.Value: idRow = 0
      LRow = UBound(vData): LCol = UBound(vData, 2)
      ReDim arrOut(1 To LRow * LCol, 1 To LCol + 1)
      For iCol = 1 To LCol
          For iRow = 1 To LRow
              curVal = Trim$(CStr(vData(iRow, iCol)))
              If curVal <> "" Then
                  If pDict.Exists(curVal) Then
                      idRow = pDict(curVal)
                      arrOut(idRow, iCol + 1) = arrOut(idRow, iCol + 1) + 1
                  Else
                      idRow = idRow + 1
                      pDict.Add curVal, idRow
                      arrOut(idRow, 1) = curVal
                      arrOut(idRow, iCol + 1) = 1&
                  End If
              End If
          Next
      Next
      Set pSheet = Worksheets.Add
      pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow * LCol, LCol + 1)).Value = arrOut
      pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow * LCol, LCol + 1)).EntireColumn.AutoFit
End Sub
[/vba]
С наступающим!

Автор - anvg
Дата добавления - 30.12.2013 в 03:44
Evgen2350 Дата: Понедельник, 30.12.2013, 07:05 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Спасибо огромное за помощь и оперативность! Очень выручили! Всех с наступающим!!!
 
Ответить
СообщениеСпасибо огромное за помощь и оперативность! Очень выручили! Всех с наступающим!!!

Автор - Evgen2350
Дата добавления - 30.12.2013 в 07:05
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для анализа совпадений (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!