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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 300 След.
Расчет годового дохода по депозиту., Расчет годового дохода по депозиту с ежемесячным пополнением, без возможностия снятия и ежемесячно меняющейся ставкой доходности
 
У вас процент в месяц считается как 1/12 от годового процента.
Вообще-то это неправильно, но почему-то многие так делают, в приложенном файле я сделал два варианта: линейный и степенной.
Извлечь дополнительные данные из функции пользователя
 
Вариант 1 и 3 потребует переделки в других местах, где упоминается функция.
Вариант 2 и 4 - не потребует.
Обнулять переменные - хорошая практика.
Изменено: МатросНаЗебре - 16.02.2026 13:08:41
Формула, выводящая текст, только если в соседней ячейке внесены значения, формула не работает как хотелось бы
 
Код
=ЕСЛИ(G2="";"";ЕСЛИ(СЧЁТЕСЛИ($F$2:$F$137;H2)<>0;"маркировка есть";"маркировки нет"))
Вариант названия темы
Формула, выводящая текст, только если в соседней ячейке внесены значения.
Извлечь дополнительные данные из функции пользователя
 
Вариант 4. Рефакторинг исходной функции.
Код
Private Sub CommandButton1_Click()
    x = Range("A1:J" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    For i = 1 To UBound(x) 'расчет номера 1 строки реестра
        If x(i, 1) = "ГНН-0001" And CDate(x(i, 3)) = #1/1/2023# Then Exit For
    Next i
                    
    With Cells(i, 1).Resize(UBound(ArrAutofilterNew(x, "1=" & "ГНН-0001", "3=" & #1/1/2023#)), 10).Interior
    'раскраска ячеек
    End With
    
    Debug.Print ArrAutofilterNew_GetRfirst(x, "1=" & "ГНН-0001", "3=" & #1/1/2023#)
End Sub

Function ArrAutofilterNew_GetRfirst(ByRef arr, ParamArray args() As Variant) As Variant   ' Новая версия функции ArrAutofilter, от января 2021 года.  © ExcelVBA.ru

    Dim RowsCount&, i As Long, j As Long, arrCheck As Variant

    arrCheck = GetArrCheck(arr, RowsCount, args)

    For i = LBound(arr, 1) To UBound(arr, 1)    ' снова перебираем все строки массива
        If arrCheck(i) Then ' если строка ранее помечена как подходящая
            ArrAutofilterNew_GetRfirst = i
            Exit Function
        End If
    Next i
End Function

Function ArrAutofilterNew(ByRef arr, ParamArray args() As Variant) As Variant   ' Новая версия функции ArrAutofilter, от января 2021 года.  © ExcelVBA.ru

    Dim RowsCount&, i As Long, j As Long, arrCheck As Variant, ro&

    arrCheck = GetArrCheck(arr, RowsCount, args)

    ReDim newarr(1 To RowsCount&, LBound(arr, 2) To UBound(arr, 2)) ' формируем новый массив
    For i = LBound(arr, 1) To UBound(arr, 1)    ' снова перебираем все строки массива
        If arrCheck(i) Then ' если строка ранее помечена как подходящая
            ro& = ro& + 1 ' вычисляем номер строки в новом массиве
            For j = LBound(arr, 2) To UBound(arr, 2)
                newarr(ro&, j) = arr(i, j) ' заполняем массив значениями из исходного
            Next j
        End If
    Next i
    ArrAutofilterNew = newarr ' возвращаем результат
End Function

Function GetArrCheck(ByRef arr, RowsCount&, ParamArray args() As Variant) As Variant
    On Error Resume Next
    GetArrCheck = False ' возвращаемое значение в случае ошибки
    If UBound(args) = -1 Then Debug.Print "Array filtering error: filters required": Exit Function
    ReDim Filters(1 To UBound(args(0)) + 1, 1 To 2)

    Dim i&, ColumnToCheck&, FiltersCount&, j&:  Err.Clear: i& = UBound(arr, 2)
    If Err.Number > 0 Then Debug.Print "Array filtering error: two dimensional array required": Exit Function

    For i& = LBound(args(0)) To UBound(args(0))    ' перебираем все параметры фильтрации
        If Not IsMissing(args(0)(i&)) Then
            If args(0)(i&) Like "#*=*" Then ' распознаем параметры фильтрации
                FiltersCount& = FiltersCount& + 1
                Filters(FiltersCount&, 1) = Val(Split(args(0)(i&), "=")(0)) ' столбец массива
                Filters(FiltersCount&, 2) = Split(args(0)(i&), "=", 2)(1) ' маска для значения
            Else ' неверно заданный фильтр
                Debug.Print "ArrAutofilterNew error: invalid filter «" & args(0)(i&) & "»"
            End If
        End If
    Next i&
    If FiltersCount& = 0 Then Debug.Print "Array filtering error: all filters are empty": Exit Function

    ReDim arrCheck(LBound(arr, 1) To UBound(arr, 1)) As Boolean ' для результатов проверки
    For i = LBound(arr, 1) To UBound(arr, 1)    ' перебираем все строки массива, и проверяем их
        arrCheck(i) = True
        For j& = 1 To FiltersCount&    ' перебираем все параметры фильтрации
            If Not (arr(i, Filters(j&, 1)) Like Filters(j&, 2)) Then arrCheck(i) = False: Exit For
        Next j&
        RowsCount& = RowsCount& - arrCheck(i) ' увеличиваем счётчик подходящих строк на 1
    Next i
    If RowsCount& = 0 Then Exit Function ' выход, если нет ни одной подходящей строки в массиве
    GetArrCheck = arrCheck
End Function
Извлечь дополнительные данные из функции пользователя
 
Вариант 3. Вернуть массив из двух элементов.
Код
Private Sub CommandButton1_Click()
    x = Range("A1:J" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    For i = 1 To UBound(x) 'расчет номера 1 строки реестра
        If x(i, 1) = "ГНН-0001" And CDate(x(i, 3)) = #1/1/2023# Then Exit For
    Next i
                    
    Dim arr As Variant
    arr = ArrAutofilterNew(x, "1=" & "ГНН-0001", "3=" & #1/1/2023#)
                    
    With Cells(i, 1).Resize(UBound(arr(0)), 10).Interior
    'раскраска ячеек
    End With
    Debug.Print arr(1)
    
End Sub

'---------------------------------------------
Function ArrAutofilterNew(ByRef arr, ParamArray args() As Variant) As Variant   ' Новая версия функции ArrAutofilter, от января 2021 года.  © ExcelVBA.ru
    ' Получает по ссылке массив ARR для фильтрации
    ' и список критериев фильтрации в формате "3=маска текста" (номер столбца, "=", искомое значение)
    ' Возвращает двумерный массив с подходящими строками
     
    On Error Resume Next
    ArrAutofilterNew = False ' возвращаемое значение в случае ошибки
    If UBound(args) = -1 Then Debug.Print "Array filtering error: filters required": Exit Function
    ReDim Filters(1 To UBound(args) + 1, 1 To 2)
  
    Dim i&, ColumnToCheck&, FiltersCount&, j&, ro&, RowsCount&:  Err.Clear: i& = UBound(arr, 2)
    If Err.Number > 0 Then Debug.Print "Array filtering error: two dimensional array required": Exit Function
  
    For i& = LBound(args) To UBound(args)    ' перебираем все параметры фильтрации
        If Not IsMissing(args(i&)) Then
            If args(i&) Like "#*=*" Then ' распознаем параметры фильтрации
                FiltersCount& = FiltersCount& + 1
                Filters(FiltersCount&, 1) = Val(Split(args(i&), "=")(0)) ' столбец массива
                Filters(FiltersCount&, 2) = Split(args(i&), "=", 2)(1) ' маска для значения
            Else ' неверно заданный фильтр
                Debug.Print "ArrAutofilterNew error: invalid filter «" & args(i&) & "»"
            End If
        End If
    Next i&
    If FiltersCount& = 0 Then Debug.Print "Array filtering error: all filters are empty": Exit Function
  
    ReDim arrCheck(LBound(arr, 1) To UBound(arr, 1)) As Boolean ' для результатов проверки
    For i = LBound(arr, 1) To UBound(arr, 1)    ' перебираем все строки массива, и проверяем их
        arrCheck(i) = True
        For j& = 1 To FiltersCount&    ' перебираем все параметры фильтрации
            If Not (arr(i, Filters(j&, 1)) Like Filters(j&, 2)) Then arrCheck(i) = False: Exit For
        Next j&
        RowsCount& = RowsCount& - arrCheck(i) ' увеличиваем счётчик подходящих строк на 1
    Next i
    If RowsCount& = 0 Then Exit Function ' выход, если нет ни одной подходящей строки в массиве
     
    Dim rFirst As Long
     
    ReDim newarr(1 To RowsCount&, LBound(arr, 2) To UBound(arr, 2)) ' формируем новый массив
    For i = LBound(arr, 1) To UBound(arr, 1)    ' снова перебираем все строки массива
        If arrCheck(i) Then ' если строка ранее помечена как подходящая
            ro& = ro& + 1 ' вычисляем номер строки в новом массиве
            If rFirst = 0 Then rFirst = i
            For j = LBound(arr, 2) To UBound(arr, 2)
                newarr(ro&, j) = arr(i, j) ' заполняем массив значениями из исходного
            Next j
        End If
    Next i
    ArrAutofilterNew = Array(newarr, rFirst) ' возвращаем результат
    Erase arrCheck
End Function
Извлечь дополнительные данные из функции пользователя
 
Вариант 2. Передать через глобальную переменную.
Код
Private Sub CommandButton1_Click()
    x = Range("A1:J" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    For i = 1 To UBound(x) 'расчет номера 1 строки реестра
        If x(i, 1) = "ГНН-0001" And CDate(x(i, 3)) = #1/1/2023# Then Exit For
    Next i
                    
    With Cells(i, 1).Resize(UBound(ArrAutofilterNew(x, "1=" & "ГНН-0001", "3=" & #1/1/2023#)), 10).Interior
    'раскраска ячеек
    End With
    Debug.Print rFirst
    
End Sub

'---------------------------------------------
Public rFirst As Long
Function ArrAutofilterNew(ByRef arr, ParamArray args() As Variant) As Variant   ' Новая версия функции ArrAutofilter, от января 2021 года.  © ExcelVBA.ru
    ' Получает по ссылке массив ARR для фильтрации
    ' и список критериев фильтрации в формате "3=маска текста" (номер столбца, "=", искомое значение)
    ' Возвращает двумерный массив с подходящими строками
     
    On Error Resume Next
    ArrAutofilterNew = False ' возвращаемое значение в случае ошибки
    If UBound(args) = -1 Then Debug.Print "Array filtering error: filters required": Exit Function
    ReDim Filters(1 To UBound(args) + 1, 1 To 2)
  
    Dim i&, ColumnToCheck&, FiltersCount&, j&, ro&, RowsCount&:  Err.Clear: i& = UBound(arr, 2)
    If Err.Number > 0 Then Debug.Print "Array filtering error: two dimensional array required": Exit Function
  
    For i& = LBound(args) To UBound(args)    ' перебираем все параметры фильтрации
        If Not IsMissing(args(i&)) Then
            If args(i&) Like "#*=*" Then ' распознаем параметры фильтрации
                FiltersCount& = FiltersCount& + 1
                Filters(FiltersCount&, 1) = Val(Split(args(i&), "=")(0)) ' столбец массива
                Filters(FiltersCount&, 2) = Split(args(i&), "=", 2)(1) ' маска для значения
            Else ' неверно заданный фильтр
                Debug.Print "ArrAutofilterNew error: invalid filter «" & args(i&) & "»"
            End If
        End If
    Next i&
    If FiltersCount& = 0 Then Debug.Print "Array filtering error: all filters are empty": Exit Function
  
    ReDim arrCheck(LBound(arr, 1) To UBound(arr, 1)) As Boolean ' для результатов проверки
    For i = LBound(arr, 1) To UBound(arr, 1)    ' перебираем все строки массива, и проверяем их
        arrCheck(i) = True
        For j& = 1 To FiltersCount&    ' перебираем все параметры фильтрации
            If Not (arr(i, Filters(j&, 1)) Like Filters(j&, 2)) Then arrCheck(i) = False: Exit For
        Next j&
        RowsCount& = RowsCount& - arrCheck(i) ' увеличиваем счётчик подходящих строк на 1
    Next i
    If RowsCount& = 0 Then Exit Function ' выход, если нет ни одной подходящей строки в массиве
     
    ReDim newarr(1 To RowsCount&, LBound(arr, 2) To UBound(arr, 2)) ' формируем новый массив
    For i = LBound(arr, 1) To UBound(arr, 1)    ' снова перебираем все строки массива
        If arrCheck(i) Then ' если строка ранее помечена как подходящая
            ro& = ro& + 1 ' вычисляем номер строки в новом массиве
            If rFirst = 0 Then rFirst = i
            For j = LBound(arr, 2) To UBound(arr, 2)
                newarr(ro&, j) = arr(i, j) ' заполняем массив значениями из исходного
            Next j
        End If
    Next i
    ArrAutofilterNew = newarr ' возвращаем результат
    Erase arrCheck
End Function
Извлечь дополнительные данные из функции пользователя
 
Вариант 1. Передать через аргумент функции.
Код
Private Sub CommandButton1_Click()
    x = Range("A1:J" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    For i = 1 To UBound(x) 'расчет номера 1 строки реестра
        If x(i, 1) = "ГНН-0001" And CDate(x(i, 3)) = #1/1/2023# Then Exit For
    Next i
                    
    Dim rFirst As Long
                    
    With Cells(i, 1).Resize(UBound(ArrAutofilterNew(x, rFirst, "1=" & "ГНН-0001", "3=" & #1/1/2023#)), 10).Interior
    'раскраска ячеек
    End With
    Debug.Print rFirst
    
End Sub

Function ArrAutofilterNew(ByRef arr, rFirst As Long, ParamArray args() As Variant) As Variant   ' Новая версия функции ArrAutofilter, от января 2021 года.  © ExcelVBA.ru
    ' Получает по ссылке массив ARR для фильтрации
    ' и список критериев фильтрации в формате "3=маска текста" (номер столбца, "=", искомое значение)
    ' Возвращает двумерный массив с подходящими строками
     
    On Error Resume Next
    ArrAutofilterNew = False ' возвращаемое значение в случае ошибки
    If UBound(args) = -1 Then Debug.Print "Array filtering error: filters required": Exit Function
    ReDim Filters(1 To UBound(args) + 1, 1 To 2)
  
    Dim i&, ColumnToCheck&, FiltersCount&, j&, ro&, RowsCount&:  Err.Clear: i& = UBound(arr, 2)
    If Err.Number > 0 Then Debug.Print "Array filtering error: two dimensional array required": Exit Function
  
    For i& = LBound(args) To UBound(args)    ' перебираем все параметры фильтрации
        If Not IsMissing(args(i&)) Then
            If args(i&) Like "#*=*" Then ' распознаем параметры фильтрации
                FiltersCount& = FiltersCount& + 1
                Filters(FiltersCount&, 1) = Val(Split(args(i&), "=")(0)) ' столбец массива
                Filters(FiltersCount&, 2) = Split(args(i&), "=", 2)(1) ' маска для значения
            Else ' неверно заданный фильтр
                Debug.Print "ArrAutofilterNew error: invalid filter «" & args(i&) & "»"
            End If
        End If
    Next i&
    If FiltersCount& = 0 Then Debug.Print "Array filtering error: all filters are empty": Exit Function
  
    ReDim arrCheck(LBound(arr, 1) To UBound(arr, 1)) As Boolean ' для результатов проверки
    For i = LBound(arr, 1) To UBound(arr, 1)    ' перебираем все строки массива, и проверяем их
        arrCheck(i) = True
        For j& = 1 To FiltersCount&    ' перебираем все параметры фильтрации
            If Not (arr(i, Filters(j&, 1)) Like Filters(j&, 2)) Then arrCheck(i) = False: Exit For
        Next j&
        RowsCount& = RowsCount& - arrCheck(i) ' увеличиваем счётчик подходящих строк на 1
    Next i
    If RowsCount& = 0 Then Exit Function ' выход, если нет ни одной подходящей строки в массиве
     
    ReDim newarr(1 To RowsCount&, LBound(arr, 2) To UBound(arr, 2)) ' формируем новый массив
    For i = LBound(arr, 1) To UBound(arr, 1)    ' снова перебираем все строки массива
        If arrCheck(i) Then ' если строка ранее помечена как подходящая
            ro& = ro& + 1 ' вычисляем номер строки в новом массиве
            If rFirst = 0 Then rFirst = i
            For j = LBound(arr, 2) To UBound(arr, 2)
                newarr(ro&, j) = arr(i, j) ' заполняем массив значениями из исходного
            Next j
        End If
    Next i
    ArrAutofilterNew = newarr ' возвращаем результат
    Erase arrCheck
End Function
Удаление значения при вводе числа в другую ячейку, Ввод данных в таблицу
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Target.Row = 1 Then Exit Sub
    If Target.Column <> 3 Then Exit Sub
    If Not IsNumeric(Target.Value) Then Exit Sub
    Target.EntireRow.Cells(1, 4).Value = Date
    Target.EntireRow.Cells(1, 7).ClearContents
End Sub
Удаление значения при вводе числа в другую ячейку, Ввод данных в таблицу
 
Начните отсюда: Создание макросов и пользовательских функций на VBA
Удаление значения при вводе числа в другую ячейку, Ввод данных в таблицу
 
Правый клик на ярлычке листа - Исходный текст
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If IsNumeric(Target.Value) Then Target.Cells(1, 2).ClearContents
End Sub
Вариант названия темы:
Удаление значения при вводе числа в другую ячейку.
Изменено: МатросНаЗебре - 13.02.2026 16:26:22
функция или макрос обратный консолидации, функция или макрос обратный консолидации
 
Код
Sub Расконсолидировать()
'Выделить ячейки с количеством.
    Dim rr As Range
    Set rr = Intersect(Selection, ActiveSheet.UsedRange)
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    Dim cl As Range, nn As Long
    For Each cl In Intersect(Selection, ActiveSheet.UsedRange).Cells
        If IsNumeric(cl.Value) Then
            If cl.Value > 1 Then
                nn = WorksheetFunction.RoundUp(cl.Value, 0)
                cl.EntireRow.Copy
                cl.EntireRow.Rows(2).Resize(nn - 1).Insert Shift:=xlDown
                Application.CutCopyMode = False
                cl.Cells(nn, 1).Value = cl.Value - (nn - 1)
                cl.Resize(nn - 1).Value = 1
            End If
        End If
    Next
    Application.Calculation = Application_Calculation
End Sub

Планировщик выгрузки ванн.
 
Цитата
написал:
Можно ли организовать расчет и расстановку букв в график одним нажатием кнопки?
Запросто. Макросы для этого и созданы)
Код
Option Explicit
Private rPlan As Range
Private rVann As Range
Private rDays As Range
Private dtStart As Date

Sub План_А()
    InitRange
    Dim yPlan As Long, yVann As Long, xVann As Long
    
    For yPlan = 1 To rPlan.Rows.Count
        Do
            'If yPlan > rPlan.Rows.Count Then yPlan = 1
            If rPlan.Cells(yPlan, 4).Value > rPlan.Cells(yPlan, 5).Value Then
                yVann = FindVann(xVann)
    '            If yVann > 0 Then
                    FillRow yVann, xVann, rPlan.Cells(yPlan, 3).Value, rPlan.Cells(yPlan, 1).Value
    '            End If
            Else
                Exit Do
            End If
            
            If CheckExit Then Exit Do
            DoEvents
        Loop
    Next
End Sub

Sub План_Б()
    InitRange
    
    Dim yPlan As Long, yVann As Long, xVann As Long
    
    Do
        yPlan = yPlan + 1
        If yPlan > rPlan.Rows.Count Then yPlan = 1
        If rPlan.Cells(yPlan, 4).Value > rPlan.Cells(yPlan, 5).Value Then
            yVann = FindVann(xVann)
'            If yVann > 0 Then
                FillRow yVann, xVann, rPlan.Cells(yPlan, 3).Value, rPlan.Cells(yPlan, 1).Value
'            End If
        End If
        
        If CheckExit Then Exit Do
        DoEvents
    Loop
End Sub

Private Sub InitRange()
    Dim sh As Worksheet
    Set sh = ActiveSheet
    Set rPlan = sh.Range("планы")
    Set rVann = sh.Range("ванны")
    Set rDays = sh.Range("дни")
    dtStart = Now
End Sub

Private Function CheckExit() As Boolean
    If dtStart < Now - TimeSerial(0, 1, 0) Then
        CheckExit = True
        Exit Function
    End If
    
    rPlan.Calculate
    
    Dim yPlan As Long
    For yPlan = 1 To rPlan.Rows.Count
        If rPlan.Cells(yPlan, 4).Value > rPlan.Cells(yPlan, 5).Value Then Exit Function
    Next
    CheckExit = True
End Function

Private Sub FillRow(yVann As Long, xVann As Long, nDays As Long, marka As String)
    Dim aOut As Variant
    ReDim aOut(1 To 1, 1 To nDays)
    Dim xa As Long
    For xa = 1 To nDays - 1
        aOut(1, xa) = xa
    Next
    aOut(1, xa) = marka
    
    Dim rOut As Range
    Set rOut = Intersect(rVann.Cells(yVann, 1).EntireRow, rDays.Cells(1, xVann).EntireColumn).Resize(1, nDays)
    'Application.Goto rOut
    rOut.Value = aOut
    rOut.Interior.Pattern = xlNone
    rOut.Cells(1, nDays).Interior.Color = RGB(255, 255, 0)
    
End Sub

Private Function FindVann(xVann As Long) As Long
    Dim yVann As Long
    For yVann = 1 To rVann.Parent.Rows.Count
        For xVann = rDays.Columns.Count - 1 To 1 Step -1
            If Not IsEmpty(rVann.Cells(yVann, xVann + 1)) Then
                If IsEmpty(rVann.Cells(yVann, xVann + 2)) Then
                    xVann = xVann + 1
                    FindVann = yVann
                    Exit Function
                End If
            End If
        Next
        If IsEmpty(rVann.Cells(yVann, 2)) Then
            xVann = 1
            FindVann = yVann
            Exit Function
        End If
    Next
End Function

Sub Очистить()
    InitRange
    
    Dim rr As Range
    Set rr = Intersect(rVann.EntireRow, rDays.EntireColumn)
    Set rr = rr.Resize(, rr.Columns.Count + 20)
    
    rr.ClearContents
    rr.Interior.Pattern = xlNone
End Sub
подсчет пустых ячеек между занятами в произвольном диаппазоне длины строки, подсчет пустых ячеек между занятами в произвольном диаппазоне длины строки с условием не суммирования результата
 
Если требование сделать макросом не критичное, то вот вариант формулами.
В ячейку B16 вставьте формулу и протяните до ячейки AD24:
Код
=A16&ЕСЛИ(И(A3="x";НЕ(ЕНД(ПОИСКПОЗ("x";B3:$AE3;0))));ЕСЛИ(ПОИСКПОЗ("x";B3:$AE3;0)=3;", "&ИНДЕКС(A$1:$AD$1;ПОИСКПОЗ("x";B3:$AE3;0));ЕСЛИ(ПОИСКПОЗ("x";B3:$AE3;0)>3;", "&ИНДЕКС(A$1:$AD$1;ПОИСКПОЗ("x";B3:$AE3;0)-1);""));"")

В ячейку AE16 вставьте формулу и протяните до ячейки AE24:
Код
=ЕСЛИОШИБКА(ПСТР(AD16;3;ДЛСТР(AD16)-2);"")
В файле написано "икс только икс, другое не воспринимать". В таблице есть "ха", согласно заданию не воспринимаемые как "икс".
Подстановка значений из другой таблицы по нескольким условиям, Прошу помочь с формулой, выдающей значения из другой таблицы при совпадении условий
 
Код
=(((ВПР(A:A;S:X;2;0)=1)*(B2=1)+(ВПР(A:A;S:X;3;0)=1)*(C2=1)+(ВПР(A:A;S:X;4;0)=1)*(D2=1)+(ВПР(A:A;S:X;5;0)=1)*(E2=1))>0)*ВПР(A:A;S:X;6;0)
А точно серая собака 800?
Вывод в ячейку листа количества ячеек с жирным шрифтом из диапазона другого листа (VBA)
 
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Range("A1").Formula = "=Func(B2:C3)"
End Sub
Вывод в ячейку листа количества ячеек с жирным шрифтом из диапазона другого листа (VBA)
 
Цитата
написал:
Нашел функцию
...но Вам я её не покажу, потому что у Вас документов нет!
Судя по всему, предполагалась получить ответ под абстрактную функцию с последующей самостоятельной адаптацией. Почему бы и нет? :D  
Вывод в ячейку листа количества ячеек с жирным шрифтом из диапазона другого листа (VBA)
 
События на изменение жирности шрифта нет, но можно повесить на какое-нибудь другое событие, например на смену выделенных ячеек.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Range("A1").Formula = "=СЧЁТЖИРНЫХ(B2:C3)"
End Sub
Расчет числа деталей по спецификациям
 
Оптимизированный вариант. Изменён алгоритм наполнения словаря спецификаций. Работать будет быстрее.
Код
'v3
'На изменения в диапазоне спецификаций реагирует с лагом в одну минуту. Сделано для уменьшения частоты обращения к диапазону.
Function КОЛИЧЕСТВОДЕТАЛЕЙ(изделия As Range, количество_изделий As Range, деталь As String, спецификации As Range) As Double
    Static dicSpec As Object
    Static prevTime As Date
    If dicSpec Is Nothing Or Now > prevTime + TimeSerial(0, 1, 0) Then
        Dim aSpec As Variant
        aSpec = спецификации.Resize(, 3).Value
        Set dicSpec = GetDicSpec(aSpec)
        Set dicSpec = FlatSpec(dicSpec)
        prevTime = Now
    End If
    
    Dim izd As Variant
    izd = GetArrayFromRange(изделия)
    
    Dim kol As Variant
    kol = GetArrayFromRange(количество_изделий)
    
    Dim yi As Long, res As Double
    For yi = 1 To UBound(izd)
        If dicSpec.Exists(izd(yi)) Then
            If dicSpec(izd(yi)).Exists(деталь) Then
                res = res + kol(yi) * dicSpec(izd(yi))(деталь)
            End If
        End If
    Next
    КОЛИЧЕСТВОДЕТАЛЕЙ = res
End Function

Private Function FlatSpec(dicSpec As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    Dim izdelie As Variant, izdSpec As Object
    For Each izdelie In dicSpec.Keys
        Set izdSpec = GetOneIzdSpec(izdelie, dicSpec)
        Set dic(izdelie) = izdSpec
    Next
    Set FlatSpec = dic
End Function

Private Function GetOneIzdSpec(ByVal izdelie As String, dicSpec As Object) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    dic(izdelie) = 1
    
    Dim detal As Variant
    For Each detal In dicSpec(izdelie)
        FillTempDic dic, detal, dicSpec(izdelie)(detal), dicSpec
    Next
    Set GetOneIzdSpec = dic
End Function

Private Sub FillTempDic(dic As Object, ByVal detal As String, ByVal nDetal As Double, dicSpec As Object)
    dic(detal) = dic(detal) + nDetal
    If dicSpec.Exists(detal) Then
        Dim subdetal As Variant
        For Each subdetal In dicSpec(detal)
            FillTempDic dic, subdetal, nDetal * dicSpec(detal)(subdetal), dicSpec
        Next
    End If
End Sub

Private Function GetDicSpec(aSpec As Variant) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")

    Dim ya As Long
    For ya = 1 To UBound(aSpec, 1)
        If Not IsEmpty(aSpec(ya, 1)) Then
            If IsNumeric(aSpec(ya, 3)) Then
                If aSpec(ya, 3) > 0 Then
                    If Not dic.Exists(aSpec(ya, 1)) Then
                        Set dic(aSpec(ya, 1)) = CreateObject("Scripting.Dictionary")
                    End If
                    dic(aSpec(ya, 1))(aSpec(ya, 2)) = aSpec(ya, 3)
                End If
            End If
        End If
    Next

    Set GetDicSpec = dic
End Function

Private Function GetArrayFromRange(rr As Range) As Variant
    Dim brr As Variant
    If rr.Cells.CountLarge = 1 Then
        ReDim brr(1 To 1)
        brr(1) = rr.Value
    Else
        Dim arr As Variant, ya As Long
        arr = rr.Value
        ReDim brr(1 To UBound(arr, 1))
        For ya = 1 To UBound(brr)
            brr(ya) = arr(ya, 1)
        Next
    End If
    GetArrayFromRange = brr
End Function
Расчет числа деталей по спецификациям
 
Ещё такой вариант.
Код
Option Explicit
'v2
Function КОЛИЧЕСТВОДЕТАЛЕЙ(изделия As Range, количество_изделий As Range, деталь As String, спецификации As Range) As Double
    Static dicSpec As Object
    If dicSpec Is Nothing Then
        Dim aSpec As Variant
        aSpec = спецификации.Resize(, 3).Value
        Set dicSpec = GetDicSpec(aSpec)
    End If
    Dim yi As Long, res As Double
    For yi = 1 To изделия.Rows.Count
        mySum res, деталь, изделия.Cells(yi, 1).Value, количество_изделий.Cells(yi, 1).Value, dicSpec
    Next
    КОЛИЧЕСТВОДЕТАЛЕЙ = res
End Function

Private Sub mySum(res As Double, ByVal resizd As String, ByVal изделие As String, количество As Double, dicSpec As Object)
    If resizd = изделие Then
        res = res + количество
    Else
        If dicSpec.Exists(изделие) Then
            Dim vv As Variant
            For Each vv In dicSpec(изделие).Keys
                mySum res, resizd, vv, количество * dicSpec(изделие)(vv), dicSpec
            Next
        End If
    End If
End Sub

Private Function GetDicSpec(aSpec As Variant) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim ya As Long
    For ya = 1 To UBound(aSpec, 1)
        If Not dic.Exists(aSpec(ya, 1)) Then
            Set dic(aSpec(ya, 1)) = CreateObject("Scripting.Dictionary")
        End If
        dic(aSpec(ya, 1))(aSpec(ya, 2)) = aSpec(ya, 3)
    Next
    
    Set GetDicSpec = dic
End Function

Расчет числа деталей по спецификациям
 
Там ещё и индексация столбцов своеобразная.
Цитата
написал:
В первом столбце обозначение элемента (детали, сборки). Во втором столбце – обозначение его «родителя».
Во вложенном файле родитель находится в левом столбце. Получается левый столбец это второй, соответственно правый - это первый.
Не запрещено, конечно :)))
Расчет числа деталей по спецификациям
 
Цитата
написал:
а с макросами сильно сложно будет?
Нет.
Код
Option Explicit

Function КОЛИЧЕСТВОДЕТАЛЕЙ(изделия As Range, количество_изделий As Range, деталь As String, спецификации As Range) As Double
    Static dicSpec As Object
    If dicSpec Is Nothing Then
        Dim aSpec As Variant
        aSpec = спецификации.Resize(, 3).Value
        Set dicSpec = GetDicSpec(aSpec)
    End If
    Dim yi As Long, изделие As String
    For yi = 1 To изделия.Rows.Count
        изделие = изделия.Cells(yi, 1).Value
        If dicSpec.Exists(изделие) Then
            If dicSpec(изделие).Exists(деталь) Then
                КОЛИЧЕСТВОДЕТАЛЕЙ = КОЛИЧЕСТВОДЕТАЛЕЙ + dicSpec(изделие)(деталь) * количество_изделий.Cells(yi, 1).Value
            End If
        End If
    Next
End Function

Private Function GetDicSpec(aSpec As Variant) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim ya As Long
    For ya = 1 To UBound(aSpec, 1)
        If Not dic.Exists(aSpec(ya, 1)) Then
            Set dic(aSpec(ya, 1)) = CreateObject("Scripting.Dictionary")
        End If
        dic(aSpec(ya, 1))(aSpec(ya, 2)) = aSpec(ya, 3)
    Next
    
    Dim bb As Variant, cc As Variant, ff As Variant, bic As Object, fic As Object
    For Each bb In dic.Keys
        Set bic = dic(bb)
        For Each cc In bic.Keys
            If dic.Exists(cc) Then
                Set fic = dic(cc)
                For Each ff In fic.Keys
                    dic(bb)(ff) = dic(bb)(ff) + fic(ff) * dic(bb)(cc)
                Next
            End If
        Next
        dic(bb)(bb) = 1
    Next
    
    Set GetDicSpec = dic
End Function

Изменено: МатросНаЗебре - 11.02.2026 11:42:38 (If dicSpec Is Nothing Then)
Не работают формулы в файле эксель (пустые ячейки), На одном компьютере работает, а на другом нет.
 
В ячейку C2 вставьте формулу:
Код
=ЕСЛИОШИБКА(ЕСЛИ(ЕПУСТО(A2);0;ЕСЛИ(A2="СИГМА PRO Угловой элемент 1,2 м. б/у";320;ЕСЛИ(A2="Щит ST угловой элемент 1,2м б/у";320;ЕСЛИ(A2="СИГМА PRO Угловой элемент 1,5 м б/у";400;ЕСЛИ(A2="Щит ST угловой элемент 1,5м б/у";400;ЕСЛИ(A2="Щит ST угловой элемент 3,3м б/у";800;ЕСЛИ(A2="Щит ST угловой элемент 3,0м б/у";800;ЕСЛИ(A2="Щит AL угловой элемент 0,60м б/у";160;ЕСЛИ(A2="Щит AL угловой элемент 1,2м б/у";320;ЕСЛИ(A2="Щит AL угловой элемент 3,0м б/у";800;ЕСЛИ(A2="Щит AL угловой элемент 3,3м б/у";800;ЕСЛИ(A2="Щит AL угловой элемент 1,5м б/у";400;ЕСЛИ(D2>0,1;ЕСЛИ(J2<$V$2;$V$2*D2;D2*J2))))))))))))));"")
Не работают формулы в файле эксель (пустые ячейки), На одном компьютере работает, а на другом нет.
 
Цитата
написал:
В Чём может быть проблемма?
Разные версии Excel.
Большой выпадающий список с поиском и добавлением новых значений, Большой выпадающий список с поиском и добавлением новых значений
 
Вариант с пользовательской формой.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Target.Row <= 5 Then Exit Sub
    If Target.Column = 2 Then
        UserForm1.ListBox1.RowSource = "=вид_авто"
    ElseIf Target.Column = 3 Then
        UserForm1.ListBox1.RowSource = "=запчасть"
    Else
        UserForm1.Hide
        Exit Sub
    End If
    UserForm1.Show
    UserForm1.Caption = Cells(4, Target.Column).Value
    UserForm1.Top = ActiveCell.Cells(3, 2).Top
    UserForm1.Left = ActiveCell.Cells(1, 2).Left + 20
End Sub

Автоматизированное заполнение ячеек в типовой межотраслевой форме №3 от 28.11.97г из готового шаблона с данными, На ежедневной основе сталкиваюсь с проблемой массированного заполнения данных которой по идее не должно быть
 
Код
Option Explicit
Private Const OPTION_STRING = "1 стр1 BZ6; 2 стр1 M17; 3 стр1 W15; 4 стр2 EQ9"
Private wbTemp As Workbook

Sub Заполнить_шаблон()
    Set wbTemp = Workbooks("шаблон.xls")
    
    CloseEmptyWb
    
    Dim rSource As Range
    On Error Resume Next
    Set rSource = Selection.EntireRow
    Set rSource = Intersect(rSource, rSource.Parent.UsedRange)
    On Error GoTo 0
    If rSource Is Nothing Then Exit Sub
    
    Dim rowSource As Range
    For Each rowSource In rSource.Rows
        If Not rowSource.Hidden Then
            FillOneFile rowSource
        End If
    Next
End Sub

Private Sub FillOneFile(rowSource As Range)
    wbTemp.Sheets.Copy
    Dim wbTarg As Workbook
    Set wbTarg = ActiveWorkbook
    
    Dim vOption As Variant, rSource As Range, rTarget As Range, wasChanged As Boolean
    For Each vOption In Split(OPTION_STRING, ";")
        vOption = Trim(vOption)
        vOption = Split(vOption, " ")
        On Error Resume Next
        Set rSource = rowSource.Cells(1, CLng(vOption(0)))
        Set rTarget = wbTarg.Sheets(vOption(1)).Range(vOption(2))
        On Error GoTo 0
        If Not rSource Is Nothing Then
            If Not rTarget Is Nothing Then
                rTarget.Value = rSource.Value
                wasChanged = True
            End If
        End If
        Set rSource = Nothing
        Set rTarget = Nothing
    Next
    If wasChanged Then
        SaveTargetWorkbook wbTarg
    Else
        wbTarg.Close False
    End If
End Sub

Private Sub SaveTargetWorkbook(wbTarg As Workbook)

    Dim sName As String
    sName = wbTarg.Sheets(1).Range("BZ6").Value
    sName = sName & "." & CreateObject("Scripting.FileSystemObject").GetTempName
    ReplaceSymbols sName
    sName = sName & ".xlsx"
    
    Dim sFull As String
    sFull = ThisWorkbook.Path & "\" & sName
    On Error Resume Next
    Workbooks(sName).Close False
    Kill sFull
    Err.Clear
    wbTarg.SaveAs Filename:=sFull, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Debug.Print sFull
    If Err = 0 Then wbTarg.Close False
    On Error GoTo 0

End Sub

Sub ReplaceSymbols(ss As String)
    Dim vv As Variant
    For Each vv In Array("\", "/", ":", "*", "?", """", "<", ">", "|", "[", "]") '[] недопустимые только в имени листа
        ss = Replace(ss, vv, " ")
    Next
    ss = Trim(ss) 'Пробел в конце строки не распознаётся файловой системой.
End Sub


Private Sub CloseEmptyWb()
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        If wb.Path = "" Then wb.Close False
    Next
End Sub
Допустим в файле-источнике в первом столбце приведён номер, во втором - ФИО водителя, в третьем - марка автомобиля, в четвёртом - название заказчика. Эти данные можно менять, дополнять в строке OPTION_STRING = "1 стр1 BZ6; 2 стр1 M17; 3 стр1 W15; 4 стр2 EQ9".
- Открываете файл "шаблон.xls".
- Выделяете в файле-источнике нужные строки.
- Запускаете макрос Заполнить_шаблон.
В папке рядом с файлом макроса будут сформированы файлы из шаблона.
Автоматизированное заполнение ячеек в типовой межотраслевой форме №3 от 28.11.97г из готового шаблона с данными, На ежедневной основе сталкиваюсь с проблемой массированного заполнения данных которой по идее не должно быть
 
Смешно :D  
Автоматизированное заполнение ячеек в типовой межотраслевой форме №3 от 28.11.97г из готового шаблона с данными, На ежедневной основе сталкиваюсь с проблемой массированного заполнения данных которой по идее не должно быть
 
Должен быть какой-то файл-источник.
Проверка наличия заголовка в умной таблице
 
Цитата
написал:
Цитата написал: sfs , добрый день. Для проверки можете использовать метод Find объект Range   https://learn.microsoft.com/ru-ru/office/vba/api/excel.range.find  Не пойму, можно прям откорректировать мою строку до правильной?
Вариант через Find
Код
If Not ThisWorkbook.Sheets(sheetNew).ListObjects(1).HeaderRowRange.Find("verifyFull") Is Nothing Then
Проверка наличия заголовка в умной таблице
 
Код
If WorksheetFunction.CountIf(ThisWorkbook.Sheets(sheetNew).ListObjects(1).HeaderRowRange, "verifyFull") Then
Перенос строки в файле Excel
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ro As Range, rSource As Range, rTarget As Range
    On Error Resume Next
    Set ro = Intersect(Target, Target.ListObject.ListColumns("операция").DataBodyRange)
    On Error GoTo 0
     
    Dim cl As Range
    For Each cl In ro.Cells
        With cl.Offset(0, 1) 'вводим в соседнюю справа ячейку дату
           Application.EnableEvents = False
           .Value = Now
           Application.EnableEvents = True
           .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
        End With
        If cl.Value = "Готово" Then
            Set rSource = Intersect(cl.EntireRow, Target.ListObject.DataBodyRange)
            With Sheets("Готовые заказы")
                Set rTarget = .Cells(.Rows.Count, 1).End(xlUp).Cells(2, 1).Resize(1, rSource.Columns.Count)
            End With
            rTarget.Value = rSource.Value
            Application.EnableEvents = False
            rSource.EntireRow.Delete
            Application.EnableEvents = True
        End If
    Next cl
End Sub
Цитата
написал:
где необходимо внести этот код
Правый клик на ярлычке листа Производство - Исходный текст.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 300 След.
Наверх