Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 289 След.
перенос в другую ячейку полностью с содержимым
 
Вариация макроса из #6
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Rw As Long
    Rw = Cells(Rows.Count, 5).End(xlUp).Row
    If Not Intersect(Target, Range("D2:E" & Rw)) Is Nothing Then
        Dim cl As Range, arr As Variant, brr As Variant, rr As Range, ys As Long, a As Variant
        For Each cl In Intersect(Target.EntireRow, Range("E2:E" & Rw)).Cells
            If cl.Formula Like "=VLOOKUP(*)" Then
                On Error Resume Next
                arr = Mid(cl.Formula, Len("=VLOOKUP(#"))
                arr = Left(arr, Len(arr) - 1)
                arr = Split(arr, ",")
                brr = Split(arr(1), "!")
                Set rr = Sheets(brr(0)).Range(brr(1))
                ys = WorksheetFunction.Match(Range(arr(0)), rr.Columns(1), CLng(arr(3)))
                On Error GoTo 0
                If ys > 0 Then
                    a = rr.Cells(ys, CLng(arr(2))).Formula
                    
                    With cl.Validation
                        .Delete
                        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween
                        .InputTitle = "Из чего состоит:"
                        .InputMessage = a
                    End With
                    
                    ys = 0
                End If
            End If
        Next
    End If
End Sub
перенос в другую ячейку полностью с содержимым
 
Выделите столбец на листе справочник.
Ctrl+H заменить = на пустую строку.
=1,06*1,05 превратится в 1,06*1,05
ВПР на этот столбец.

Скорее всего, Вам понадобятся и численные значения и подобная расшифровка. В этом случае лучше расшифровку сделать в отдельном столбце.
Очистка ячеек на листе, Очистка ячеек на листе, цикл со смещением.
 
Код
Sub Clear_All()
    Dim i As Long
    Dim StartRow As Range
    Dim DelRow As Range, cl As Range
    'B12:B21, E12:S21, AE12:AE21, C4, Q5, G5:K5
    For i = 0 To 9
        Set StartRow = ActiveSheet.Range("C4").Offset(i * 25, 0)
        Set DelRow = Union(StartRow.Offset(8, -1), StartRow.Offset(8, 2), StartRow.Offset(8, 28), StartRow, StartRow.Offset(1, 14), StartRow.Offset(1, 4))
        Set DelRow = Union(DelRow, StartRow.Offset(8, -1).Resize(10, 1), StartRow.Offset(8, 2).Resize(10, 15), StartRow.Offset(8, 28).Resize(10, 1), StartRow.Offset(1, 4).Resize(1, 5))
        DelRow.Value = Empty
        
'        DelRow.Value = 1
    Next i
             
End Sub
А так?
Составление предложений по заданным "ключам", В соответствии с парой "ключ" - слово нужно собрать предложение
 
Цитата
написал:
А если строк с парами "ключ"-слово более сотни, можно формулу более универсальной сделать?
Код
=C10&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР($D8;2*СТОЛБЕЦ(A:A)-1;1));$A$2:$A$7))&" ";"")
Тяните вправо на сотню столбцов.
доработка макроса для сбора данных с листов и книг
 
Код
Option Explicit

Sub FileList()
    Dim V As String
    Dim BrowseFolder As String
    Static sInitialFileName As String
      
    'открываем диалоговое окно выбора папки
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите папку или диск"
        .InitialFileName = sInitialFileName
        .Show
        On Error Resume Next
        Err.Clear
        V = .SelectedItems(1)
        If Err.Number <> 0 Then
            MsgBox "Вы ничего не выбрали!"
            Exit Sub
        End If
        sInitialFileName = V & "\"
    End With
    BrowseFolder = CStr(V)
      
    'добавляем лист и выводим на него шапку таблицы
    ActiveWorkbook.Sheets.Add
    With Range("A1:E1")
        .Font.Bold = True
        .Font.Size = 12
    End With
    Range("A1").Value = "Имя файла"
    Range("B1").Value = "Путь"
    Range("C1").Value = "Размер"
    Range("D1").Value = "Дата создания"
    Range("E1").Value = "Дата изменения"
      
    'вызываем процедуру вывода списка файлов
    'измените True на False, если не нужно выводить файлы из вложенных папок
    ListFilesInFolder BrowseFolder, True
End Sub
  
  
Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)
  
    Dim FSO As Object
    Dim SourceFolder As Object
    Dim SubFolder As Object
    Dim FileItem As Object
    Dim r As Long
  
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.getfolder(SourceFolderName)
  
    r = Range("A65536").End(xlUp).Row + 1   'находим первую пустую строку
    'выводим данные по файлу
    For Each FileItem In SourceFolder.Files
        If FileItem.Name Like "~$*" Then
        ElseIf FileItem.Name Like "*отчет*.xls*" Then
            Cells(r, 1).Formula = FileItem.Name
            Cells(r, 2).Formula = FileItem.Path
            Cells(r, 3).Formula = FileItem.Size
            Cells(r, 4).Formula = FileItem.DateCreated
            Cells(r, 5).Formula = FileItem.DateLastModified
            r = r + 1
'            X = SourceFolder.Path
        End If
    Next FileItem
      
    'вызываем процедуру повторно для каждой вложенной папки
    If IncludeSubfolders Then
        For Each SubFolder In SourceFolder.SubFolders
            ListFilesInFolder SubFolder.Path, True
        Next SubFolder
    End If
  
    Columns("A:E").AutoFit
  
    Set FileItem = Nothing
    Set SourceFolder = Nothing
    Set FSO = Nothing
  
End Sub
Суммирование ячеек по универсальной формуле
 
Код
Option Explicit
'v2
Sub Написать_формулы()
    FillFormulas ActiveSheet, "M"
End Sub

Private Sub FillFormulas(sh As Worksheet, MM As String)
    Dim rr As Range
    Set rr = sh.UsedRange
    
    Dim orr As Variant
    ReDim orr(1 To rr.Rows.Count) As Byte
    
    Dim yr As Long
    For yr = 1 To rr.Rows.Count
        orr(yr) = rr.Cells(yr, 1).EntireRow.OutlineLevel
    Next
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    Application.Calculation = Application_Calculation

    Dim ss As String
    For yr = 1 To rr.Rows.Count
        If orr(yr) > 1 Then
            ss = GetFormula(orr, yr, 1, MM)
        ElseIf orr(yr) = 1 And yr <= UBound(orr) - 1 Then
            If orr(yr + 1) = 2 Then
                ss = GetFormula(orr, yr, 1, MM)
            End If
        End If
        If orr(yr) = 1 And yr <= UBound(orr) - 2 Then
            If orr(yr + 2) = 2 Then
                ss = GetFormula(orr, yr, 0, MM)
            End If
        End If
        If ss <> "" Then
            rr.Range(MM & yr).Formula = ss
            ss = ""
        Else
            If orr(yr) > 1 Then
                rr.Range(MM & yr).FormulaR1C1 = "=RC[-1]*RC[-2]"
            End If
        End If
    Next
    
    Application.Calculation = Application_Calculation
End Sub

Private Function GetFormula(orr As Variant, yr As Long, delt As Byte, MM As String) As String
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim yb As Long, ss As String
    For yb = yr + 1 To UBound(orr)
        If orr(yb) < orr(yr) + delt Then Exit For
        If orr(yb) = orr(yr) + delt Then dic(yb) = Empty
    Next
    If dic.Count > 0 Then
        ss = Join(dic.Keys(), "+" & MM)
        ss = "=" & MM & ss
        GetFormula = ss
    End If
End Function
Суммирование ячеек по универсальной формуле
 
Код
Option Explicit

Sub Написать_формулы()
    FillFormulas ActiveSheet, "M"
End Sub

Private Sub FillFormulas(sh As Worksheet, MM As String)
    Dim rr As Range
    Set rr = sh.UsedRange
    
    Dim orr As Variant
    ReDim orr(1 To rr.Rows.Count + 1) As Byte
    
    Dim yr As Long
    For yr = 1 To rr.Rows.Count
        orr(yr) = rr.Cells(yr, 1).EntireRow.OutlineLevel
    Next
    
    Dim dic As Object, ss As String
    Dim yb As Long
    For yr = 1 To rr.Rows.Count
        If orr(yr) > 1 Or (orr(yr) = 1 And orr(yr + 1) = 2) Then
            Set dic = CreateObject("Scripting.Dictionary")
            For yb = yr + 1 To rr.Rows.Count
                If orr(yb) = orr(yr) Then Exit For
                If orr(yb) = orr(yr) + 1 Then dic(yb) = Empty
            Next
            If dic.Count = 0 Then
'                rr.Range(MM & yr).ClearContents
            Else
                ss = Join(dic.Keys(), "+" & MM)
                ss = "=" & MM & ss
                rr.Range(MM & yr).Formula = ss
            End If
        End If
    Next
End Sub
Суммирование ячеек по универсальной формуле
 
Код
=СУММЕСЛИМН(M7:$M$1048576;E7:$E$1048576;E6;F7:$F$1048576;F6;B7:$B$1048576;"<>""")
Составление предложений по заданным "ключам", В соответствии с парой "ключ" - слово нужно собрать предложение
 
Код
=ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*1-1;1));$A$2:$A$7))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*2-1;1));$A$2:$A$7))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*3-1;1));$A$2:$A$7))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*4-1;1));$A$2:$A$7))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*5-1;1));$A$2:$A$7))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$2:$B$7;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D8;2*6-1;1));$A$2:$A$7))&" ";"")
Составление предложений по заданным "ключам", В соответствии с парой "ключ" - слово нужно собрать предложение
 
Код
=ЕСЛИОШИБКА(ИНДЕКС($B$11:$B$13;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D14;2*1-1;1));$A$11:$A$13))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$11:$B$13;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D14;2*2-1;1));$A$11:$A$13))&" ";"")
&ЕСЛИОШИБКА(ИНДЕКС($B$11:$B$13;ПОИСКПОЗ(ЗНАЧЕН(ПСТР(D14;2*3-1;1));$A$11:$A$13))&" ";"")
Распределения данных по таблице с условиями
 
Как вариант, вывести цвет шрифта в отдельный столбец с помощью пользовательской функции, приведённой ниже, и используя в том числе СУММЕСЛИМН распределить сумму.
Код
Function ЦВЕТШРИФТА(ячейка As Range) As Long
    ЦВЕТШРИФТА = ячейка.Font.Color
End Function
Лото 6 из 49. Известны 4 числа из 6 чисел. Нужно догенерировать ещё 2 числа к этим 4 чисел, Лото 6 из 49
 
Цитата
написал:
и пробал протаскивать ячейку от E к  F
"е" пропустили?  :D

Столбец D не закреплён. При протягивании должен сместиться на E. Сделайте ещё раз. Вставьте формулу в столбец E и протяните до F.
Лото 6 из 49. Известны 4 числа из 6 чисел. Нужно догенерировать ещё 2 числа к этим 4 чисел, Лото 6 из 49
 
Снимок, так снимок)
Предположу, что формула в столбце F неправильная.
Теперь нужен снимок, в котором будет видна формула в столбце F.
Лото 6 из 49. Известны 4 числа из 6 чисел. Нужно догенерировать ещё 2 числа к этим 4 чисел, Лото 6 из 49
 
Код
Sub Генератор()
    Const ROOF = 49

    Dim rSource As Range, rTarget As Range
    Set rSource = Range("A5:D5")
    Set rSource = rSource.Resize(rSource.Parent.UsedRange.Rows.Count)
    Set rTarget = rSource.Columns(rSource.Columns.Count + 1).Resize(, 2)
    
    Dim ars As Variant, art As Variant
    ars = rSource.Value
    ReDim art(1 To rTarget.Rows.Count, 1 To rTarget.Columns.Count)
    
    Dim dic As Object, sKey As String, dtTry As Date
    Set dic = CreateObject("Scripting.Dictionary")
    
    Randomize
    Dim ys As Long, xs As Long, xt As Long, iMin As Long, iMax As Long, iRnd As Long
    For ys = 1 To UBound(ars, 1)
        dtTry = Now
find_rnd:
        If Now - TimeSerial(0, 0, 10) > dtTry Then GoTo next_ys
        
        iMin = 0
        For xs = 1 To UBound(ars, 2)
            If Not IsNumeric(ars(ys, xs)) Then
                GoTo next_ys
            End If
            If iMin < ars(ys, xs) Then iMin = ars(ys, xs)
        Next
        If iMin = 0 Then GoTo next_ys
        iMin = iMin + 2
        If iMin > ROOF - (UBound(art, 2) - 1) Then GoTo next_ys
        

        For xt = 1 To UBound(art, 2)
            iMax = ROOF - (UBound(art, 2) - xt)
            iRnd = WorksheetFunction.RandBetween(iMin, iMax)
            art(ys, xt) = iRnd
            iMin = iRnd + 1
        Next

        sKey = ""
        For xs = 1 To UBound(ars, 2)
            sKey = sKey & " " & ars(ys, xs)
        Next
        For xt = 1 To UBound(art, 2)
            sKey = sKey & " " & art(ys, xt)
        Next
        If dic.Exists(sKey) Then
            DoEvents
            GoTo find_rnd
        Else
            dic(sKey) = Empty
        End If

next_ys:
    Next
    
    rTarget.Value = art
End Sub
Лото 6 из 49. Известны 4 числа из 6 чисел. Нужно догенерировать ещё 2 числа к этим 4 чисел, Лото 6 из 49
 
Код
=СЛУЧМЕЖДУ(МАКС($A5:D5)+2;49+СТОЛБЕЦ(A:A)-2)
Без проверки на повторы. Без сортировки.
Как в эксель вывести все возможные комбинации 8 цифр
 
А убрать повторы можно так.
В ячейку R1 вставьте формулу и протяните до ячейки AG1:
Код
=Q1048576+(ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;1;11;2);2;22;2);3;33;2);4;44;2);5;55;2);6;66;2);7;77;2);8;88;2))=8)

В ячейку R2 вставьте формулу и протяните до ячейки AG1048576:
Код
=R1+(ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;1;11;2);2;22;2);3;33;2);4;44;2);5;55;2);6;66;2);7;77;2);8;88;2))=8)

В ячейку AI1 вставьте формулу и протяните до ячейки AI40320:
Код
=ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ИНДЕКС(A:A;ПОИСКПОЗ(СТРОКА();R:R;0));ИНДЕКС(B:B;ПОИСКПОЗ(СТРОКА();S:S;0)));ИНДЕКС(C:C;ПОИСКПОЗ(СТРОКА();T:T;0)));ИНДЕКС(D:D;ПОИСКПОЗ(СТРОКА();U:U;0)));ИНДЕКС(E:E;ПОИСКПОЗ(СТРОКА();V:V;0)));ИНДЕКС(F:F;ПОИСКПОЗ(СТРОКА();W:W;0)));ИНДЕКС(G:G;ПОИСКПОЗ(СТРОКА();X:X;0)));ИНДЕКС(H:H;ПОИСКПОЗ(СТРОКА();Y:Y;0)));ИНДЕКС(I:I;ПОИСКПОЗ(СТРОКА();Z:Z;0)));ИНДЕКС(J:J;ПОИСКПОЗ(СТРОКА();AA:AA;0)));ИНДЕКС(K:K;ПОИСКПОЗ(СТРОКА();AB:AB;0)));ИНДЕКС(L:L;ПОИСКПОЗ(СТРОКА();AC:AC;0)));ИНДЕКС(M:M;ПОИСКПОЗ(СТРОКА();AD:AD;0)));ИНДЕКС(N:N;ПОИСКПОЗ(СТРОКА();AE:AE;0)));ИНДЕКС(O:O;ПОИСКПОЗ(СТРОКА();AF:AF;0)));ИНДЕКС(P:P;ПОИСКПОЗ(СТРОКА();AG:AG;0)))
Как в эксель вывести все возможные комбинации 8 цифр
 
В ячейку A1 вставьте формулу и протяните до ячейки P1048576:
Код
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ДЕС.В.ВОСЬМ((СТОЛБЕЦ()-1)*(2^20)+СТРОКА()-1;8);7;8);6;7);5;6);4;5);3;4);2;3);1;2);0;1)
Так можно получить все комбинации с повторами. Повторы можно убрать другими формулами.
Как вычленить числовые значения из ячейки в Excel?, .
 
Вставьте в A2 и тяните вправо.
Код
=ЕСЛИОШИБКА(ЗНАЧЕН(СЖПРОБЕЛЫ(ЛЕВСИМВ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ($A1;СИМВОЛ(10);ПОВТОР(" ";1000));1000*(СТОЛБЕЦ(A1)-1)+1;1000));" ";ПОВТОР(" ";10));10)));0)
Как вычленить числовые значения из ячейки в Excel?, .
 
Вариант через пользовательскую функцию.
Код
=СЛОЖИТЬ(A1)
Код
Function СЛОЖИТЬ(текст As String) As Double
    Dim arr As Variant, ya As Long, res As Double
    arr = Split(текст, Chr(10))
    
    For ya = LBound(arr) To UBound(arr)
        If InStr(arr(ya), " ") > 0 Then
            arr(ya) = Split(arr(ya), " ")(0)
        End If
        If IsNumeric(arr(ya)) Then res = res + CDbl(arr(ya))
    Next
    СЛОЖИТЬ = res
End Function
Открыть в Ecxel файл с расширением * .web, Автоматически ответить 'Да' на запрос при открытии файла
 
Как вариант:
Код
Sub Не_мой_код()

    Dim avFiles
    avFiles = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выбрать Excel файл", , False)
    If VarType(avFiles) = vbBoolean Then
        MsgBox "Файл не выбран", 0, "Выбор файла"
        Exit Sub
    End If
    
    CreateObject("Scripting.FileSystemObject").CopyFile avFiles, avFiles & ".html"
    
    Dim WB As Workbook
    Set WB = Workbooks.Open(avFiles & ".html")
End Sub
Как выполнить макрос с конкретной ячейки и листа не переходя на него
 
Если предположить, что процедура была написана для нескольких листов, которые по разному как-то обрабатывались, то код уже не выглядит так абсурдно :)
Код
Sub Создать()
    With Worksheets("Яблоко")
     
        Application.ScreenUpdating = False
        Dim lr As Long, cell As Range
        lr = .Cells(Rows.Count, 4).End(xlUp).Row
        For Each cell In .Range("D100:D" & lr)
            If cell = "Подразделение" Then
                МРК_Подразделение_Создать_Протокол cell.Offset(0, -3)
            End If
             
            If cell = "Показатель" Then
                МРК_Создать_Протокол cell.Offset(0, -3)
            End If
        Next
        Application.ScreenUpdating = True
     
    End With
End Sub

Sub МРК_Подразделение_Создать_Протокол(myActiveCell As Range)
    Sheets("Пробник_МРК").Range("54:57").Copy Sheets("Протокол_МРК").Range(myActiveCell.Address)
End Sub

Sub МРК_Создать_Протокол(myActiveCell As Range)

End Sub
Как выполнить макрос с конкретной ячейки и листа не переходя на него
 
Попробуем угадать.
У Вас в макросе МРК_Подразделение_Создать_Протокол наверняка есть ActiveCell.
Замените ActiveCell на переменную, например myActiveCell, эту переменную вынесите в аргументы процедуры (абракадабра, правда? :))
А в вызов МРК_Подразделение_Создать_Протокол добавьте ячейку, которую хотели выбрать.
Код ниже. Но с вашим кодом было бы проще, конечно.
Код
Sub МРК_Подразделение_Создать_Протокол()
    ActiveCell 'Найдите это
End Sub

'Сделайте так
Sub МРК_Подразделение_Создать_Протокол(myActiveCell As Range)
    myActiveCell
End Sub


Sub Создать()
With Worksheets("Яблоко")
 
Application.ScreenUpdating = False
lr = .Cells(Rows.Count, 4).End(xlUp).Row 'тут добавилась точка перед .Cells
For Each cell In .Range("D100:D" & lr)
If cell = "Подразделение" Then
    МРК_Подразделение_Создать_Протокол cell.Offset(0, -3)
End If
 

Next
Application.ScreenUpdating = True
 
      End With
End Sub
Формула с текстом в одной ячейке через макрос, Синтаксис VBA для записи формулы с текстом в одной ячейке
 
Неа, не поделит.
Код
ActiveCell.Formula = "=RC[-1]&""/25"""
Так поделит.
Код
ActiveCell.Formula = "=RC[-1]" & "/25"
Сформировать таблицу из имеющейся по определенным критериям
 
В этом варианте будет заполнять породу.
Код
Option Explicit

Sub Poroda()
    Dim shTarg As Worksheet
    Set shTarg = Sheets("итоговая таблица")
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    Dim dicP As Object
    FillTargetSheetPorodaCell shTarg, Sheets("исходные данные"), shTarg.Range("Z7").Value, shTarg.Range("AA7").Value, dicP
    
    Dim dicR As Object
    Set dicR = GetPorodaCells(shTarg, dicP)
    
    FillTargetSheet shTarg, Sheets("исходные данные"), shTarg.Range("Z7").Value, shTarg.Range("AA7").Value, dicR
    
    Application.Calculation = Application_Calculation
End Sub

Private Sub FillTargetSheetPorodaCell(shTarg As Worksheet, shSource As Worksheet, leshoz As String, uchastok As String, dicP As Object)
    Dim rs As Range, ars As Variant, ys As Long
    Set rs = shSource.UsedRange
    ars = rs.Value
    
    Set dicP = CreateObject("Scripting.Dictionary")
    
    Dim prefix As String
    prefix = "='" & shSource.Name & "'!E"
    
    For ys = 1 To UBound(ars, 1)
        If ars(ys, 1) = uchastok Then
        If ars(ys, 2) = leshoz Then
        If ars(ys, 5) <> "" Then
            If Not dicP.Exists(ars(ys, 5)) Then dicP(ars(ys, 5)) = prefix & ys
        End If
        End If
        End If
    Next
End Sub

Private Sub FillTargetSheet(shTarg As Worksheet, shSource As Worksheet, leshoz As String, uchastok As String, dicR As Object)
'    ClearTables shTarg, dicR
    
    Dim dic As Object
    Set dic = GetDic(dicR)
    
    Dim rs As Range, ars As Variant, ys As Long
    Set rs = shSource.UsedRange
    ars = rs.Value
    
    Dim dy As Long, ct As Range
    For ys = 1 To UBound(ars, 1)
        If ars(ys, 1) = uchastok Then
        If ars(ys, 2) = leshoz Then
            If dicR.Exists(ars(ys, 5)) Then
                dy = dic(ars(ys, 5))
                If dy < 25 Then
                    Set ct = shTarg.Range(dicR(ars(ys, 5))).Cells(dy, 0)
                    ct.Formula = "='" & shSource.Name & "'!F" & ys
                    ct.Resize(1, 10).FormulaR1C1 = ct.FormulaR1C1
                    
                    shTarg.Range("H1") = "='" & shSource.Name & "'!C" & ys
                    shTarg.Range("H2") = "='" & shSource.Name & "'!D" & ys
                    
                    dic(ars(ys, 5)) = dic(ars(ys, 5)) + 1
                End If
            End If
        End If
        End If
    Next
    shTarg.UsedRange.Calculate
End Sub

'Private Sub ClearTables(shTarg As Worksheet, dicR As Object)
'    Dim vv As Variant, rr As Range
'    For Each vv In dicR.Items
'        Set rr = shTarg.Range(vv)
'        Set rr = rr.Cells(5, 0)
'        Set rr = rr.Resize(20, 10)
'        rr.ClearContents
'    Next
'End Sub

Private Function GetDic(dicR As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim vv As Variant
    For Each vv In dicR.Keys
        dic(vv) = 5
    Next
    
    Set GetDic = dic
End Function

Private Function GetPorodaCells(sh As Worksheet, dicP As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim rr As Range, rp As Range
    Set rr = sh.UsedRange
    
    Dim aur As Variant
    aur = rr.Value
    
    Dim ya As Long, xa As Long
    For ya = 1 To UBound(aur, 1)
        For xa = 1 To UBound(aur, 2)
            If Not IsError(aur(ya, xa)) Then
                If aur(ya, xa) = "Порода" Then
                    If rr.Cells(ya, xa).MergeArea.Columns.Count = 2 Then
                        If dicP.Count > 0 Then
                            rr.Cells(ya, xa + 2).Value = dicP.Items()(0)
                            dic(dicP.Keys()(0)) = rr.Cells(ya, xa).Address(0, 0, xlA1)
                            dicP.Remove dicP.Keys()(0)
                        Else
                            rr.Cells(ya, xa + 2).ClearContents
                        End If
                        
                        Set rp = rr.Cells(ya, xa)
                        Set rp = rp.Cells(5, 0)
                        Set rp = rp.Resize(20, 10)
                        rp.ClearContents
                    End If
                End If
            End If
        Next
    Next
    
    Set GetPorodaCells = dic
End Function
Это в модуль листа.
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("Z7:AA7")) Is Nothing Then
        FillValidation Range("Z7"), Range("AA7")
        Poroda
    End If
End Sub

Private Sub FillValidation(ra As Range, rb As Range)
    Dim arr As Variant
    arr = Sheets("исходные данные").UsedRange.Columns("A:B").Value
    
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim ya As Long
    For ya = 4 To UBound(arr, 1)
        If Not IsError(arr(ya, 2)) Then
            If arr(ya, 2) <> "" Then
                If Not dic.Exists(arr(ya, 2)) Then Set dic(arr(ya, 2)) = CreateObject("Scripting.Dictionary")
                If arr(ya, 1) <> "" Then dic(arr(ya, 2))(arr(ya, 1)) = Empty
            End If
        End If
    Next
    
    ra.Validation.Delete
    If dic.Count = 0 Then
        ClearRange ra
    Else
        If Not dic.Exists(ra.Value) Then
            Application.EnableEvents = False
            ra.Value = dic.Keys()(0)
            Application.EnableEvents = True
        End If
        
        If dic.Count > 1 Then
            With ra.Validation
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(dic.Keys(), ",")
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = False
            End With
        End If
    End If
    
    rb.Validation.Delete
    If Not dic.Exists(ra.Value) Then
        ClearRange rb
    Else
        Set dic = dic(ra.Value)
                        
        If dic.Count = 0 Then
            ClearRange rb
        Else
            If Not dic.Exists(rb.Value) Then
                Application.EnableEvents = False
                rb.Value = dic.Keys()(0)
                Application.EnableEvents = True
            End If
            
            If dic.Count > 1 Then
                With rb.Validation
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(dic.Keys(), ",")
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = False
                End With
            End If
        End If
    End If
    
    
End Sub

Private Sub ClearRange(rr As Range)
    If Not IsEmpty(rr.Value) Then
        Application.EnableEvents = False
        rr.ClearContents
        Application.EnableEvents = True
    End If
End Sub
Изменено: МатросНаЗебре - 16.10.2025 09:13:13
Формула с текстом в одной ячейке через макрос, Синтаксис VBA для записи формулы с текстом в одной ячейке
 
Код
=RC[-1]&"/25"
Сформировать таблицу из имеющейся по определенным критериям
 
А лучше так.
Это в модуль листа  "итоговая таблица".
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("Z7:AA7")) Is Nothing Then
        FillValidation Range("Z7"), Range("AA7")
        Poroda
    End If
End Sub

Private Sub FillValidation(ra As Range, rb As Range)
    Dim arr As Variant
    arr = Sheets("исходные данные").UsedRange.Columns("A:B").Value
    
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim ya As Long
    For ya = 4 To UBound(arr, 1)
        If Not IsError(arr(ya, 2)) Then
            If arr(ya, 2) <> "" Then
                If Not dic.Exists(arr(ya, 2)) Then Set dic(arr(ya, 2)) = CreateObject("Scripting.Dictionary")
                If arr(ya, 1) <> "" Then dic(arr(ya, 2))(arr(ya, 1)) = Empty
            End If
        End If
    Next
    
    With ra.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(dic.Keys(), ",")
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = False
    End With
    
    rb.Validation.Delete
    If dic.Exists(ra.Value) Then
        Set dic = dic(ra.Value)
        
        If dic.Count = 1 Then
            Application.EnableEvents = False
            rb.Value = dic.Keys()(0)
            Application.EnableEvents = True
        Else
            With rb.Validation
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(dic.Keys(), ",")
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = False
            End With
        End If
    End If
End Sub


А это в стандартный модуль.
Код
Option Explicit

Sub Poroda()
    Dim shTarg As Worksheet
    Set shTarg = Sheets("итоговая таблица")

    Dim dicR As Object
    Set dicR = GetPorodaCells(shTarg)
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    FillTargetSheet shTarg, Sheets("исходные данные"), shTarg.Range("Z7").Value, shTarg.Range("AA7").Value, dicR
    
    Application.Calculation = Application_Calculation
End Sub

Private Sub FillTargetSheet(shTarg As Worksheet, shSource As Worksheet, leshoz As String, uchastok As String, dicR As Object)
    ClearTables shTarg, dicR
    
    Dim dic As Object
    Set dic = GetDic(dicR)
    
    Dim rs As Range, ars As Variant, ys As Long
    Set rs = shSource.UsedRange
    ars = rs.Value
    
    Dim dy As Long, ct As Range
    For ys = 1 To UBound(ars, 1)
        Debug.Print Now, uchastok, leshoz
        If ars(ys, 1) = uchastok Then
        If ars(ys, 2) = leshoz Then
            If dicR.Exists(ars(ys, 5)) Then
                dy = dic(ars(ys, 5))
                If dy < 25 Then
                    Set ct = shTarg.Range(dicR(ars(ys, 5))).Cells(dy, 0)
                    ct.Formula = "='" & shSource.Name & "'!F" & ys
                    ct.Resize(1, 10).FormulaR1C1 = ct.FormulaR1C1
                    
                    shTarg.Range("H1") = "='" & shSource.Name & "'!C" & ys
                    shTarg.Range("H2") = "='" & shSource.Name & "'!D" & ys
                    
                    dic(ars(ys, 5)) = dic(ars(ys, 5)) + 1
                End If
            End If
        End If
        End If
    Next
    shTarg.UsedRange.Calculate
End Sub

Private Sub ClearTables(shTarg As Worksheet, dicR As Object)
    Dim vv As Variant, rr As Range
    For Each vv In dicR.Items
        Set rr = shTarg.Range(vv)
        Set rr = rr.Cells(5, 0)
        Set rr = rr.Resize(20, 10)
        rr.ClearContents
    Next
End Sub

Private Function GetDic(dicR As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim vv As Variant
    For Each vv In dicR.Keys
        dic(vv) = 5
    Next
    
    Set GetDic = dic
End Function

Private Function GetPorodaCells(sh As Worksheet) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim rr As Range
    Set rr = sh.UsedRange
    
    Dim aur As Variant
    aur = rr.Value
    
    Dim ya As Long, xa As Long
    For ya = 1 To UBound(aur, 1)
        For xa = 1 To UBound(aur, 2)
            If Not IsError(aur(ya, xa)) Then
                If aur(ya, xa) = "Порода" Then
                    If rr.Cells(ya, xa).MergeArea.Columns.Count = 2 Then
                        dic(aur(ya, xa + 2)) = rr.Cells(ya, xa).Address(0, 0, xlA1)
                    End If
                End If
            End If
        Next
    Next
    
    Set GetPorodaCells = dic
End Function

Сформировать таблицу из имеющейся по определенным критериям
 
А это в модуль листа "итоговая таблица"
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("Z7:AA7")) Is Nothing Then Poroda
End Sub
Сформировать таблицу из имеющейся по определенным критериям
 
Вариант макросом. Вставьте в стандартный модуль.
Код
Option Explicit

Sub Poroda()
    Dim shTarg As Worksheet
    Set shTarg = Sheets("итоговая таблица")

    Dim dicR As Object
    Set dicR = GetPorodaCells(shTarg)
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    FillTargetSheet shTarg, Sheets("исходные данные"), shTarg.Range("Z7").Value, shTarg.Range("AA7").Value, dicR
    
    Application.Calculation = Application_Calculation
End Sub

Private Sub FillTargetSheet(shTarg As Worksheet, shSource As Worksheet, leshoz As String, uchastok As String, dicR As Object)
    ClearTables shTarg, dicR
    
    Dim dic As Object
    Set dic = GetDic(dicR)
    
    Dim rs As Range, ars As Variant, ys As Long
    Set rs = shSource.UsedRange
    ars = rs.Value
    
    Dim dy As Long, ct As Range
    For ys = 1 To UBound(ars, 1)
        If ars(ys, 1) = uchastok Then
        If ars(ys, 2) = leshoz Then
            If dicR.Exists(ars(ys, 5)) Then
                dy = dic(ars(ys, 5))
                If dy < 25 Then
                    Set ct = shTarg.Range(dicR(ars(ys, 5))).Cells(dy, 0)
                    ct.Formula = "='" & shSource.Name & "'!F" & ys
                    ct.Resize(1, 10).FormulaR1C1 = ct.FormulaR1C1
                    
                    dic(ars(ys, 5)) = dic(ars(ys, 5)) + 1
                End If
            End If
        End If
        End If
    Next
End Sub

Private Sub ClearTables(shTarg As Worksheet, dicR As Object)
    Dim vv As Variant, rr As Range
    For Each vv In dicR.Items
        Set rr = shTarg.Range(vv)
        Set rr = rr.Cells(5, 0)
        Set rr = rr.Resize(20, 10)
        rr.ClearContents
    Next
End Sub

Private Function GetDic(dicR As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim vv As Variant
    For Each vv In dicR.Keys
        dic(vv) = 5
    Next
    
    Set GetDic = dic
End Function

Private Function GetPorodaCells(sh As Worksheet) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim rr As Range
    Set rr = sh.UsedRange
    
    Dim aur As Variant
    aur = rr.Value
    
    Dim ya As Long, xa As Long
    For ya = 1 To UBound(aur, 1)
        For xa = 1 To UBound(aur, 2)
            If Not IsError(aur(ya, xa)) Then
                If aur(ya, xa) = "Порода" Then
                    If rr.Cells(ya, xa).MergeArea.Columns.Count = 2 Then
                        dic(aur(ya, xa + 2)) = rr.Cells(ya, xa).Address(0, 0, xlA1)
                    End If
                End If
            End If
        Next
    Next
    
    Set GetPorodaCells = dic
End Function
Сформировать таблицу из имеющейся по определенным критериям
 
В ячейку AA8 вставьте формулу:
Код
=ПОИСКПОЗ(Z7;'исходные данные'!B:B;0)+ПОИСКПОЗ(AA7;СМЕЩ('исходные данные'!A1:A10000;ПОИСКПОЗ(Z7;'исходные данные'!B:B;0);0);0)-1

В ячейку X8 вставьте формулу:
Код
=$AA$8+ПОИСКПОЗ($D$4;СМЕЩ('исходные данные'!E1:E10000;$AA$8-1;0);0)-1

В ячейку X9 вставьте формулу и протяните до ячейки X27:
Код
=X8+1

В ячейку A8 вставьте формулу и протяните до ячейки I27:
Код
=ЕСЛИ(ИНДЕКС('исходные данные'!$E:$E;$X8)=$D$4;ИНДЕКС('исходные данные'!F:F;$X8);"")

В ячейку H1 вставьте формулу:
Код
=ИНДЕКС('исходные данные'!C:C;$AA$8)

В ячейку H2 вставьте формулу:
Код
=ИНДЕКС('исходные данные'!D:D;$AA$8)
Открыть в Ecxel файл с расширением * .web, Автоматически ответить 'Да' на запрос при открытии файла
 
И да, название темы неудачное.
Application.GetOpenFilename не имеет отношения к проблеме.
Проблема-то в команде Workbooks.Open.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 289 След.
Наверх