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

Вход

Регистрация

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

 

= Мир MS Excel/Как связать формулу и макрос? - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как связать формулу и макрос? (Макросы/Sub)
Как связать формулу и макрос?
AdwordsDirect Дата: Вторник, 07.03.2017, 19:33 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Добрый день :)
Чтоб я делал без форума..

Есть формула массива
Код
=ЕСЛИОШИБКА(ИНДЕКС($A$1:$A$660;НАИМЕНЬШИЙ(ЕСЛИ(ЕОШ(ПОИСК("биксенон";$A$1:$A$660));"";СТРОКА($A$1:$A$660));СТРОКА(A1)));"-")


И макрос
[vba]
Код

Sub WordsRating()
Dim data As Range, i&, temp, cell, dic As Object, res As Worksheet
Dim dKeys, dItems
If Not Intersect(ActiveSheet.UsedRange, Selection) Is Nothing Then
If Selection.Count > 1 Then
Set data = Intersect(ActiveSheet.UsedRange, Selection)
Else
Set data = Selection
End If
Set dic = CreateObject("scripting.dictionary")
For Each cell In data
temp = Split(cell, " ")
If UBound(temp) > 0 Then
For i = 0 To UBound(temp)
If Trim(temp(i)) <> "" Then dic(Trim(temp(i))) = dic(Trim(temp(i))) + 1
Next i
End If
Next cell
Set res = ActiveWorkbook.Sheets.Add
With res
dKeys = dic.keys
dItems = dic.items
For i = 0 To UBound(dKeys)
.Cells(i + 1, 1).Value = dKeys(i)
.Cells(i + 1, 2) = dItems(i)
Next i
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("b1:b" & i) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:B" & i)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
If UBound(dKeys) >= 300 Then .Range("a301:b" & i).ClearContents
End With
End If
End Sub
[/vba]

Есть куча ячеек в столбце.
1. Макрос находит часто повторяющиеся слова (ТОП300)
2. Формула массива вытягивает все ячейки в которых встречается какое-то слово.

Внимание вопрос, как их объединить?
Чтобы автоматически слова из само-провозглашенного списка ТОП300, поочередно в разных столбцах проставлялись в формулу массива.


Сообщение отредактировал AdwordsDirect - Среда, 08.03.2017, 10:49
 
Ответить
СообщениеДобрый день :)
Чтоб я делал без форума..

Есть формула массива
Код
=ЕСЛИОШИБКА(ИНДЕКС($A$1:$A$660;НАИМЕНЬШИЙ(ЕСЛИ(ЕОШ(ПОИСК("биксенон";$A$1:$A$660));"";СТРОКА($A$1:$A$660));СТРОКА(A1)));"-")


И макрос
[vba]
Код

Sub WordsRating()
Dim data As Range, i&, temp, cell, dic As Object, res As Worksheet
Dim dKeys, dItems
If Not Intersect(ActiveSheet.UsedRange, Selection) Is Nothing Then
If Selection.Count > 1 Then
Set data = Intersect(ActiveSheet.UsedRange, Selection)
Else
Set data = Selection
End If
Set dic = CreateObject("scripting.dictionary")
For Each cell In data
temp = Split(cell, " ")
If UBound(temp) > 0 Then
For i = 0 To UBound(temp)
If Trim(temp(i)) <> "" Then dic(Trim(temp(i))) = dic(Trim(temp(i))) + 1
Next i
End If
Next cell
Set res = ActiveWorkbook.Sheets.Add
With res
dKeys = dic.keys
dItems = dic.items
For i = 0 To UBound(dKeys)
.Cells(i + 1, 1).Value = dKeys(i)
.Cells(i + 1, 2) = dItems(i)
Next i
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("b1:b" & i) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:B" & i)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
If UBound(dKeys) >= 300 Then .Range("a301:b" & i).ClearContents
End With
End If
End Sub
[/vba]

Есть куча ячеек в столбце.
1. Макрос находит часто повторяющиеся слова (ТОП300)
2. Формула массива вытягивает все ячейки в которых встречается какое-то слово.

Внимание вопрос, как их объединить?
Чтобы автоматически слова из само-провозглашенного списка ТОП300, поочередно в разных столбцах проставлялись в формулу массива.

Автор - AdwordsDirect
Дата добавления - 07.03.2017 в 19:33
Manyasha Дата: Вторник, 07.03.2017, 22:42 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
AdwordsDirect, почему тема не в разделе по VBA? Перенесла.
Поправьте теги в посте, для кода нужно использовать кнопку #.
Покажите файл-пример, что есть, что хотите.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеAdwordsDirect, почему тема не в разделе по VBA? Перенесла.
Поправьте теги в посте, для кода нужно использовать кнопку #.
Покажите файл-пример, что есть, что хотите.

Автор - Manyasha
Дата добавления - 07.03.2017 в 22:42
AdwordsDirect Дата: Среда, 08.03.2017, 10:51 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Оригинальный файл не могу прикрепить т.к. он весит более 1МБ.
Покажите пожалуйста принцип, как находить самые повторяющиеся слова из текста.
И вытаскивать все ячейки с этими словами автоматически каждое слово в новый столбец.
К сообщению приложен файл: 1604669.xlsx (31.6 Kb)


Сообщение отредактировал AdwordsDirect - Среда, 08.03.2017, 11:06
 
Ответить
СообщениеОригинальный файл не могу прикрепить т.к. он весит более 1МБ.
Покажите пожалуйста принцип, как находить самые повторяющиеся слова из текста.
И вытаскивать все ячейки с этими словами автоматически каждое слово в новый столбец.

Автор - AdwordsDirect
Дата добавления - 08.03.2017 в 10:51
AdwordsDirect Дата: Среда, 08.03.2017, 11:06 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Этот файл
К сообщению приложен файл: 9442819.xlsx (25.0 Kb)
 
Ответить
СообщениеЭтот файл

Автор - AdwordsDirect
Дата добавления - 08.03.2017 в 11:06
Perfect2You Дата: Четверг, 09.03.2017, 01:03 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Отработав, макрос создаст новый лист (допустим, Лист2).
В старом листе в ячейку B1 вводите:
Код
=ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1)

Это чтобы было видно само слово.
В ячейку B2 формула массива:
Код
=ЕСЛИОШИБКА(ИНДЕКС($A$1:$A$660;НАИМЕНЬШИЙ(ЕСЛИ(ЕОШ(ПОИСК(ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1);$A$1:$A$660));"";СТРОКА($A$1:$A$660));СТРОКА(A1)));"-")

т.е., Ваша, только с заменой "биксенон" на
Код
ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1)

после этого можно протягивать на нужное количество позиций вниз и тиражировать по столбцам копированием.


Сообщение отредактировал Perfect2You - Четверг, 09.03.2017, 01:04
 
Ответить
СообщениеОтработав, макрос создаст новый лист (допустим, Лист2).
В старом листе в ячейку B1 вводите:
Код
=ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1)

Это чтобы было видно само слово.
В ячейку B2 формула массива:
Код
=ЕСЛИОШИБКА(ИНДЕКС($A$1:$A$660;НАИМЕНЬШИЙ(ЕСЛИ(ЕОШ(ПОИСК(ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1);$A$1:$A$660));"";СТРОКА($A$1:$A$660));СТРОКА(A1)));"-")

т.е., Ваша, только с заменой "биксенон" на
Код
ИНДЕКС(Лист2!$A:$A;СТОЛБЕЦ()-1)

после этого можно протягивать на нужное количество позиций вниз и тиражировать по столбцам копированием.

Автор - Perfect2You
Дата добавления - 09.03.2017 в 01:03
AdwordsDirect Дата: Четверг, 09.03.2017, 09:31 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Это конечно всё хорошо, но нужно это как-то в одно действие формулу связать..
То есть, чтобы на выходе получилось например 300 столбцов (как и самых встречаемых слов).

Это я мог делать и с помощью других формул. Все формулы у меня есть и макросы.
Задача связать это в одно действие.


Сообщение отредактировал AdwordsDirect - Четверг, 09.03.2017, 17:27
 
Ответить
СообщениеЭто конечно всё хорошо, но нужно это как-то в одно действие формулу связать..
То есть, чтобы на выходе получилось например 300 столбцов (как и самых встречаемых слов).

Это я мог делать и с помощью других формул. Все формулы у меня есть и макросы.
Задача связать это в одно действие.

Автор - AdwordsDirect
Дата добавления - 09.03.2017 в 09:31
Perfect2You Дата: Четверг, 09.03.2017, 21:24 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Макрос написан при допущении, что 300 слов размещены на листе "Лист2"
[vba]
Код
Sub VodnoDeystviye()
Dim strOk As Long, strEnd As Long, i As Long
    
    strEnd = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To 30
        Cells(1, i + 1).FormulaR1C1 = "=INDEX(Лист2!C1," & i & ")"
        strOk = Evaluate("SUMPRODUCT(--NOT(ISERR(SEARCH("" ""&""" & Cells(1, i + 1).Value & """&"" "","" ""&A1:A" & strEnd & "&"" ""))))")
        Cells(2, i + 1).FormulaArray = _
            "=IFERROR(INDEX(R1C1:R" & strEnd & "C1,SMALL(IF(ISERR(SEARCH("" ""&R1C&"" "","" ""&R1C1:R" & strEnd & "C1&"" "")),"""",ROW(R1C1:R" & strEnd & "C1)),ROW(R[-1]C[-1]))),""-"")"
        If strOk > 1 Then
            Cells(2, i + 1).Copy
            Range(Cells(3, i + 1), Cells(strOk + 1, i + 1)).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
                SkipBlanks:=False, Transpose:=False
        End If
    Next i
End Sub
[/vba]


Сообщение отредактировал Perfect2You - Четверг, 09.03.2017, 21:26
 
Ответить
СообщениеМакрос написан при допущении, что 300 слов размещены на листе "Лист2"
[vba]
Код
Sub VodnoDeystviye()
Dim strOk As Long, strEnd As Long, i As Long
    
    strEnd = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To 30
        Cells(1, i + 1).FormulaR1C1 = "=INDEX(Лист2!C1," & i & ")"
        strOk = Evaluate("SUMPRODUCT(--NOT(ISERR(SEARCH("" ""&""" & Cells(1, i + 1).Value & """&"" "","" ""&A1:A" & strEnd & "&"" ""))))")
        Cells(2, i + 1).FormulaArray = _
            "=IFERROR(INDEX(R1C1:R" & strEnd & "C1,SMALL(IF(ISERR(SEARCH("" ""&R1C&"" "","" ""&R1C1:R" & strEnd & "C1&"" "")),"""",ROW(R1C1:R" & strEnd & "C1)),ROW(R[-1]C[-1]))),""-"")"
        If strOk > 1 Then
            Cells(2, i + 1).Copy
            Range(Cells(3, i + 1), Cells(strOk + 1, i + 1)).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
                SkipBlanks:=False, Transpose:=False
        End If
    Next i
End Sub
[/vba]

Автор - Perfect2You
Дата добавления - 09.03.2017 в 21:24
AdwordsDirect Дата: Пятница, 10.03.2017, 11:41 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Почти так, но не так..
Не получается потом вытянуть все ячейки с этими словами, да и почему-то оно берет не все 300 слов этих.

Кому не лень, подскажите. Задача всё та же.
Как из столбика достать все ячейки, в которых встречаются самые популярные слова?


Сообщение отредактировал AdwordsDirect - Пятница, 10.03.2017, 15:31
 
Ответить
СообщениеПочти так, но не так..
Не получается потом вытянуть все ячейки с этими словами, да и почему-то оно берет не все 300 слов этих.

Кому не лень, подскажите. Задача всё та же.
Как из столбика достать все ячейки, в которых встречаются самые популярные слова?

Автор - AdwordsDirect
Дата добавления - 10.03.2017 в 11:41
AdwordsDirect Дата: Пятница, 10.03.2017, 15:32 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Manyasha, каким способом прикрепить файл, который превышает 100Кб?
 
Ответить
СообщениеManyasha, каким способом прикрепить файл, который превышает 100Кб?

Автор - AdwordsDirect
Дата добавления - 10.03.2017 в 15:32
Manyasha Дата: Пятница, 10.03.2017, 20:27 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
AdwordsDirect, весь файл не нужен, главное структура. Надеюсь, что она такая, как в файле в 3-м посте.
Посмотрите такой вариант:
[vba]
Код
Option Explicit
Sub WordsRating()
    With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual: End With
    Dim t: t = Timer
    Dim data, lr&, i&, j&, r&, temp, cell, dic As Object
    lr = Cells(Rows.Count, 1).End(xlUp).Row
    data = Cells(3, 1).Resize(lr - 2).Value
    Set dic = CreateObject("scripting.dictionary")
    For Each cell In data
        temp = Split(LCase(cell), " ")
        If UBound(temp) >= 0 Then
            For i = 0 To UBound(temp)
                If Trim(temp(i)) <> "" And Len(Trim(temp(i))) > 2 Then dic(Trim(temp(i))) = dic(Trim(temp(i))) + 1
            Next i
        End If
    Next cell
    [b1].CurrentRegion.Offset(, 1).ClearContents
    [b1].Resize(, dic.Count) = dic.keys
    [b2].Resize(, dic.Count) = dic.items
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Cells(2, 2).Resize(, dic.Count), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Cells(1, 2).Resize(2, dic.Count)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
    
    If dic.Count > 300 Then Cells(1, 2).Offset(, 300).Resize(, dic.Count - 300).ClearContents
    For j = 2 To Application.Min(300, dic.Count) + 1
        dic.RemoveAll
        For i = 1 To UBound(data)
            If LCase(data(i, 1)) Like "*" & LCase(Cells(1, j)) & "*" Then
                dic(LCase(Trim(data(i, 1)))) = i
            End If
        Next i
        Cells(3, j).Resize(dic.Count) = Application.Transpose(dic.keys)
    Next j
    Debug.Print Timer - t
    With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlCalculationAutomatic: End With
    MsgBox "Done!"
End Sub
[/vba]
Макрос обрабатывает строки 1-го столбца, начиная с 3-й.
К сообщению приложен файл: 1604669-1.xlsm (44.5 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеAdwordsDirect, весь файл не нужен, главное структура. Надеюсь, что она такая, как в файле в 3-м посте.
Посмотрите такой вариант:
[vba]
Код
Option Explicit
Sub WordsRating()
    With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual: End With
    Dim t: t = Timer
    Dim data, lr&, i&, j&, r&, temp, cell, dic As Object
    lr = Cells(Rows.Count, 1).End(xlUp).Row
    data = Cells(3, 1).Resize(lr - 2).Value
    Set dic = CreateObject("scripting.dictionary")
    For Each cell In data
        temp = Split(LCase(cell), " ")
        If UBound(temp) >= 0 Then
            For i = 0 To UBound(temp)
                If Trim(temp(i)) <> "" And Len(Trim(temp(i))) > 2 Then dic(Trim(temp(i))) = dic(Trim(temp(i))) + 1
            Next i
        End If
    Next cell
    [b1].CurrentRegion.Offset(, 1).ClearContents
    [b1].Resize(, dic.Count) = dic.keys
    [b2].Resize(, dic.Count) = dic.items
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Cells(2, 2).Resize(, dic.Count), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Cells(1, 2).Resize(2, dic.Count)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
    
    If dic.Count > 300 Then Cells(1, 2).Offset(, 300).Resize(, dic.Count - 300).ClearContents
    For j = 2 To Application.Min(300, dic.Count) + 1
        dic.RemoveAll
        For i = 1 To UBound(data)
            If LCase(data(i, 1)) Like "*" & LCase(Cells(1, j)) & "*" Then
                dic(LCase(Trim(data(i, 1)))) = i
            End If
        Next i
        Cells(3, j).Resize(dic.Count) = Application.Transpose(dic.keys)
    Next j
    Debug.Print Timer - t
    With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlCalculationAutomatic: End With
    MsgBox "Done!"
End Sub
[/vba]
Макрос обрабатывает строки 1-го столбца, начиная с 3-й.

Автор - Manyasha
Дата добавления - 10.03.2017 в 20:27
AdwordsDirect Дата: Понедельник, 13.03.2017, 14:43 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Вы космос!!!
Спасибо большое.
Куда задонатить?
 
Ответить
СообщениеВы космос!!!
Спасибо большое.
Куда задонатить?

Автор - AdwordsDirect
Дата добавления - 13.03.2017 в 14:43
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как связать формулу и макрос? (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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