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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 292 След.
Копирование значения с фиксацией из динамической ячейки
 
В модуль листа "Перечень".
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("C2").Resize(ActiveSheet.UsedRange.Rows.Count - 1)) Is Nothing Then Exit Sub
    
    Dim shP As Worksheet
    Set shP = Sheets("Поставка")
    
    Dim rp As Range, rf As Range, prr As Variant, frr As Variant, yp As Long, flag As Boolean
    Set rp = shP.Cells(1, 3).Resize(shP.UsedRange.Row + shP.UsedRange.Rows.Count - 1)
    Set rf = shP.Cells(1, 5).Resize(rp.Rows.Count)
    prr = rp.Value
    frr = rf.Formula
    
    Dim cs As Range, sName As String, dValue As Variant
    For Each cs In Intersect(Target, Range("C2").Resize(ActiveSheet.UsedRange.Rows.Count - 1)).Cells
        If IsNumeric(cs.Value) Then
            dValue = cs.Value
            sName = cs.EntireRow.Cells(1, 1).Value
            If sName <> "" Then
                For yp = 2 To UBound(prr, 1)
                    If prr(yp, 1) = sName Then
                        If frr(yp, 1) <> dValue Then
                            frr(yp, 1) = dValue
                            flag = True
                        End If
                    End If
                Next
            End If
        End If
    Next
    
    If flag Then
        rf.Formula = frr
    End If
End Sub
Заполнение таблицы по колонкам и строкам VBA
 
А так ищет соответствие и признака, и сорта.
Код
'v3
Sub ZapRozdav2()
    Dim shTarget As Worksheet
    Set shTarget = Sheets("Таблица")

    Dim tbSource As ListObject
    Set tbSource = Sheets("Движение").ListObjects("tb_RozdZdavVid")
    
    Dim aSource As Variant
    ReDim aSource(1 To 4)
    aSource(1) = tbSource.ListColumns("Наименование").DataBodyRange.Value
    aSource(2) = tbSource.ListColumns("Признак").DataBodyRange.Value
    aSource(3) = tbSource.ListColumns("Цена").DataBodyRange.Value
    aSource(4) = tbSource.ListColumns("Кол-во").DataBodyRange.Value
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    Dim ys As Long, yt As Long, xt As Long
    For ys = 1 To UBound(aSource(1), 1)
        yt = GetYTarget(shTarget, aSource(1)(ys, 1))
        xt = GetXTarget(shTarget, aSource(2)(ys, 1), aSource(4)(ys, 1), 10)
        shTarget.Cells(yt, xt).Value = aSource(3)(ys, 1)
        'shTarget.Cells(10, xt).Value = aSource(4)(ys, 1)
    Next
    
    Application.Calculation = Application_Calculation
End Sub

Private Function GetYTarget(sh As Worksheet, ByVal sName As String) As Long
    Const xx = 2
    
    Dim yt As Long
    On Error Resume Next
    yt = WorksheetFunction.Match(sName, sh.Columns(xx), 0)
    On Error GoTo 0
    If yt > 0 Then
        GetYTarget = yt
        Exit Function
    End If
    
    Dim blockRowsCount As Long
    
    yt = 12
    blockRowsCount = 0
    Do
        If IsEmpty(sh.Cells(yt, xx).Value) Then
            sh.Cells(yt, xx).Value = sName
            GetYTarget = yt
            Exit Function
        End If
        blockRowsCount = blockRowsCount + 1
        If blockRowsCount = 7 Then
            yt = yt + 31 - 12 - blockRowsCount + 1
            blockRowsCount = 0
        Else
            yt = yt + 1
        End If
        DoEvents
    Loop
End Function

Private Function GetXTarget(sh As Worksheet, ByVal sName As String, ByVal sSort As String, ySort As Long) As Long
    Const xx = 8
    
    Dim yt As Long
    yt = 5
    Do
        If sh.Cells(xx, yt).Value = sName Then
            If sh.Cells(ySort, yt).Value = sSort Then
                GetXTarget = yt
                Exit Function
            End If
        End If
        
        yt = yt + 1
        If yt > sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1 Then Exit Do
        DoEvents
    Loop
    
    Dim blockRowsCount As Long
    
    yt = 5
    Do
        If IsEmpty(sh.Cells(xx, yt).Value) Then
            sh.Cells(xx, yt).Value = sName
            sh.Cells(ySort, yt).Value = sSort
            GetXTarget = yt
            Exit Function
        End If
        
        yt = yt + 1
        DoEvents
    Loop
End Function
Заполнение таблицы по колонкам и строкам VBA
 
Так просто отображается.
Код
Option Explicit
'v2
Sub ZapRozdav2()
    Dim shTarget As Worksheet
    Set shTarget = Sheets("Таблица")

    Dim tbSource As ListObject
    Set tbSource = Sheets("Движение").ListObjects("tb_RozdZdavVid")
    
    Dim aSource As Variant
    ReDim aSource(1 To 4)
    aSource(1) = tbSource.ListColumns("Наименование").DataBodyRange.Value
    aSource(2) = tbSource.ListColumns("Признак").DataBodyRange.Value
    aSource(3) = tbSource.ListColumns("Цена").DataBodyRange.Value
    aSource(4) = tbSource.ListColumns("Кол-во").DataBodyRange.Value
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    Dim ys As Long, yt As Long, xt As Long
    For ys = 1 To UBound(aSource(1), 1)
        yt = GetYTarget(shTarget, aSource(1)(ys, 1))
        xt = GetXTarget(shTarget, aSource(2)(ys, 1))
        shTarget.Cells(yt, xt).Value = aSource(3)(ys, 1)
        shTarget.Cells(10, xt).Value = aSource(4)(ys, 1)
    Next
    
    Application.Calculation = Application_Calculation
End Sub

Private Function GetYTarget(sh As Worksheet, ByVal sName As String) As Long
    Const xx = 2
    
    Dim yt As Long
    On Error Resume Next
    yt = WorksheetFunction.Match(sName, sh.Columns(xx), 0)
    On Error GoTo 0
    If yt > 0 Then
        GetYTarget = yt
        Exit Function
    End If
    
    Dim blockRowsCount As Long
    
    yt = 12
    blockRowsCount = 0
    Do
        If IsEmpty(sh.Cells(yt, xx).Value) Then
            sh.Cells(yt, xx).Value = sName
            GetYTarget = yt
            Exit Function
        End If
        blockRowsCount = blockRowsCount + 1
        If blockRowsCount = 7 Then
            yt = yt + 31 - 12 - blockRowsCount + 1
            blockRowsCount = 0
        Else
            yt = yt + 1
        End If
        DoEvents
    Loop
End Function

Private Function GetXTarget(sh As Worksheet, ByVal sName As String) As Long
    Const xx = 8
    
    Dim yt As Long
    On Error Resume Next
    yt = WorksheetFunction.Match(sName, sh.Rows(xx), 0)
    On Error GoTo 0
    If yt > 0 Then
        GetXTarget = yt
        Exit Function
    End If
    
    Dim blockRowsCount As Long
    
    yt = 5
    Do
        If IsEmpty(sh.Cells(xx, yt).Value) Then
            sh.Cells(xx, yt).Value = sName
            GetXTarget = yt
            Exit Function
        End If
        
        yt = yt + 1
        DoEvents
    Loop
End Function
Копирование значения с фиксацией из динамической ячейки
 
Ну ок. Изменилось значение Перечень!C2, например, было 388, стало 389. Что должно произойти? Во всех строках с наименованием "НК RSS-1" расход должен стать 389? Чем это отличается от существующей формулы?
Суммирование по условию при совпадении начала строк, Нужна помощь
 
Как вариант сделать таблицу-переводчик между названиями из верхней и нижней таблицей. В дополнительный столбец вывести общее название. С помощью СУММЕСЛИМН посчитать сумму. Или в условии перечислить все возможные варианты, для этого монтажа формула выглядит так:
Код
=СУММЕСЛИМН($S$11:$S$346;$K$11:$K$346;"Монтаж технологических трубопроводов (Ду 89мм)")
+СУММЕСЛИМН($S$11:$S$346;$K$11:$K$346;"Монтаж технологических трубопроводов (Ду 159мм)")
Поиск значения в столбце и протяжка диапазона в формуле СУММЕСЛИМН
 
Цитата
написал:
Порядка нет.  
Это же бардак. Зато ты главный  :D  
Суммирование по условию при совпадении начала строк, Нужна помощь
 
Тут принято давать более внятное название темы. Как вариант, "Суммирование по условию при совпадении начала строк"
Код
=СУММЕСЛИМН($S$11:$S$346;$K$11:$K$346;K357&"*")
Поиск значения в столбце и протяжка диапазона в формуле СУММЕСЛИМН
 
Код
=ИНДЕКС($C$15:$G$15;ПОИСКПОЗ(J4;$C$3:$G$3;0))
Поиск значения в столбце и протяжка диапазона в формуле СУММЕСЛИМН
 
Код
=ГПР(J:J;$3:$15;13;0)
Поиск значения в столбце и протяжка диапазона в формуле СУММЕСЛИМН
 
Код
=СУММЕСЛИМН(СМЕЩ($B$4:$B$13;0;ПОИСКПОЗ(J4;$C$3:$G$3;0));$A$4:$A$13;$K$3)
Копирование значения с фиксацией из динамической ячейки
 
Цитата
написал:
А как переназначить столбец A на столбец C на листе "Перечень"?
Что сие значит?
Искать не по столбцу А, а по столбцу С?
Столбец C на листе "Перечень" это "Среднемесячный расход, кг", тот который и используется для фиксированного значения.
Напишите проще, я вставляю в А2 на листе "Поставка" такое-то значение, хочу чтобы в С2 вставилось такое. Что-то в таком духе.
Заполнение таблицы по колонкам и строкам VBA
 
Код
Sub ZapRozdav2()
    Dim shTarget As Worksheet
    Set shTarget = Sheets("Таблица")

    Dim tbSource As ListObject
    Set tbSource = Sheets("Движение").ListObjects("tb_RozdZdavVid")
    
    Dim aSource As Variant
    ReDim aSource(1 To 3)
    aSource(1) = tbSource.ListColumns("Наименование").DataBodyRange.Value
    aSource(2) = tbSource.ListColumns("Признак").DataBodyRange.Value
    aSource(3) = tbSource.ListColumns("Цена").DataBodyRange.Value
    
    Dim Application_Calculation As XlCalculation: Application_Calculation = Application.Calculation: Application.Calculation = xlCalculationManual
    
    Dim ys As Long, yt As Long, xt As Long
    For ys = 1 To UBound(aSource(1), 1)
        yt = GetYTarget(shTarget, aSource(1)(ys, 1))
        xt = GetXTarget(shTarget, aSource(2)(ys, 1))
        shTarget.Cells(yt, xt).Value = aSource(3)(ys, 1)
    Next
    
    Application.Calculation = Application_Calculation
End Sub

Private Function GetYTarget(sh As Worksheet, ByVal sName As String) As Long
    Const xx = 2
    
    Dim yt As Long
    On Error Resume Next
    yt = WorksheetFunction.Match(sName, sh.Columns(xx), 0)
    On Error GoTo 0
    If yt > 0 Then
        GetYTarget = yt
        Exit Function
    End If
    
    Dim blockRowsCount As Long
    
    yt = 12
    blockRowsCount = 0
    Do
        If IsEmpty(sh.Cells(yt, xx).Value) Then
            sh.Cells(yt, xx).Value = sName
            GetYTarget = yt
            Exit Function
        End If
        blockRowsCount = blockRowsCount + 1
        If blockRowsCount = 7 Then
            yt = yt + 31 - 12 - blockRowsCount + 1
            blockRowsCount = 0
        Else
            yt = yt + 1
        End If
        DoEvents
    Loop
End Function

Private Function GetXTarget(sh As Worksheet, ByVal sName As String) As Long
    Const xx = 8
    
    Dim yt As Long
    On Error Resume Next
    yt = WorksheetFunction.Match(sName, sh.Rows(xx), 0)
    On Error GoTo 0
    If yt > 0 Then
        GetXTarget = yt
        Exit Function
    End If
    
    Dim blockRowsCount As Long
    
    yt = 5
    Do
        If IsEmpty(sh.Cells(xx, yt).Value) Then
            sh.Cells(xx, yt).Value = sName
            GetXTarget = yt
            Exit Function
        End If
        
        yt = yt + 1
        DoEvents
    Loop
End Function
Макрос для удаление лишних пробелов
 
Цитата
написал:
Не работает код
И правда.
Код
Sub triming()
   Dim trim_range  As Range
   Set trim_range = Range("B:B")
   Set trim_range = Intersect(trim_range, ActiveSheet.UsedRange)
   trim_range.Select
   With trim_range
    If .Cells.CountLarge = 1 Then
        .Value = Application.Trim(.Value)
    Else
        Dim arr As Variant, ya As Long, xa As Long
        arr = .Value
        For ya = 1 To UBound(arr, 1)
            For xa = 1 To UBound(arr, 2)
                arr(ya, xa) = Application.Trim(arr(ya, xa))
            Next
        Next
        .Value = arr
    End If
   End With
End Sub
Макрос для удаление лишних пробелов
 
Цитата
написал:
Каким образом отладить эту систему?
Код
Sub triming()
   Dim trim_range  As Range
   Set trim_range = Range("B:B")
   Set trim_range = Intersect(trim_range, ActiveSheet.UsedRange)
   trim_range.Select
   With trim_range
    If .Cells.CountLarge = 1 Then
        .Value = Application.Trim(.Value)
    Else
        Dim arr As Variant, ya As Long, xa As Long
        arr = .Value
        For ya = 1 To UBound(arr, 1)
            For xa = 1 To UBound(arr, 2)
                arr(ya, xa) = Application.Trim(arr(ya, xa))
            Next
        Next
        arr = .Value
    End If
   End With
End Sub
Копирование значения с фиксацией из динамической ячейки
 
Не совсем понятно, как связаны обработка нулей, описанная в сообщении #3, с фиксацией значения, описанной в сообщениях #1 и #5. Наверняка, для Вас связь очевидна, ну да ладно. Так зафиксируется значение в столбце E при изменении значения в столбце A:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A2").Resize(ActiveSheet.UsedRange.Rows.Count)) Is Nothing Then
        Dim cl As Range, ce As Range
        For Each cl In Intersect(Target, Range("A2").Resize(ActiveSheet.UsedRange.Rows.Count)).Cells
            Set ce = cl.Range("E1")
            If IsEmpty(cl.Value) Then
                ce.ClearContents
            Else
                ce.FormulaR1C1 = "=IF(IFERROR(VLOOKUP(RC[-2],Перечень!R2C1:R150C3,3,0),"""")=0,"""",IFERROR(VLOOKUP(RC[-2],Перечень!R2C1:R150C3,3,0),""""))"
                ce.Value = ce.Value
                If ce.Value = "" Then ce.ClearContents
            End If
        Next
    End If
End Sub
Копирование значения с фиксацией из динамической ячейки
 
Под "заполняемой", видимо, имеется в виду какая-то другая ячейка, не являющаяся ячейкой, в которую вносится формула. Верно?

В какую ячейку пишете эту формулу? На какой лист?
Что находится на листе "Перечень" в строке со значением из ячейки C3?

Лучше, конечно, приложите файл. Но это не обязательно.
Скопировать данные во все книги папки
 
Можно так
Код
c.FormulaLocal = Replace(c.FormulaLocal, "[" & ThisWorkbook.Name & "]", "")
c.Value = c.Value
Или так
Код
wb.Worksheets("Средства измерений").Range(ThisWorkbook.Worksheets("Средства измерений").UsedRange.Address(0, 0, xlA1)).Value = ThisWorkbook.Worksheets("Средства измерений").UsedRange.Value
Или так
Код
wb.Worksheets("Средства измерений").UsedRange.Value = wb.Worksheets("Средства измерений").UsedRange.Value
wb.Close (True)
Многоуровневый выпадающий список
 
Вариант макросом. Словарь наполняется рекурсивно, количество столбцов в Базе и Итоге можно менять. Обновление словаря происходит при активации листа.
Код
Option Explicit
Private dicValidation As Object

Private Sub Worksheet_Activate()
    Set dicValidation = GetValidationDic(sheetName:="База", tableName:="База")
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tb As ListObject
    Set tb = ActiveSheet.ListObjects(1)
    If Intersect(Target, tb.DataBodyRange) Is Nothing Then Exit Sub
    
    If dicValidation Is Nothing Then
        Set dicValidation = GetValidationDic(sheetName:="База", tableName:="База")
    End If
    
    Dim cl As Range
    For Each cl In Intersect(Target, tb.DataBodyRange).Cells
        FillCellValidation cl, tb.DataBodyRange, dicValidation
    Next
End Sub

Private Sub FillCellValidation(cl As Range, rTable As Range, dicValidation As Object)
    Dim aValid As Variant
    If cl.Column = rTable.Column + rTable.Columns.Count - 1 Then Exit Sub
    
    Dim dic As Object, xt As Long, ct As Range
    For xt = 1 To rTable.Columns.Count - 1
        Set ct = cl.EntireRow.Cells(1, rTable.Column - 1 + xt)
        
        If xt = rTable.Column Then
            Set dic = dicValidation
        Else
            If Not dic Is Nothing Then
                If dic.Exists(ct.Cells(1, 0).Value) Then
                    Set dic = dic(ct.Cells(1, 0).Value)
                Else
                    Set dic = Nothing
                End If
            End If
        End If
        With ct.Validation
            .Delete
            If Not dic Is Nothing Then
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(dic.Keys(), ",")
                .IgnoreBlank = True: .InCellDropdown = True: .InputTitle = "": .ErrorTitle = "": .InputMessage = "": .ErrorMessage = "": .ShowInput = True: .ShowError = True
            End If
        End With
    Next
End Sub

Private Function GetValidationDic(sheetName As String, tableName As String) As Object
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    Dim baza As Variant
    baza = Sheets("База").ListObjects("База").DataBodyRange
    Dim yb As Long
    For yb = 1 To UBound(baza, 1)
        DicAddRecu dic, 1, baza, yb
    Next
    Set GetValidationDic = dic
End Function

Private Sub DicAddRecu(dic As Object, level As Long, arr As Variant, ya As Long)
    If Not dic.Exists(arr(ya, level)) Then
        Set dic.Item(arr(ya, level)) = CreateObject("Scripting.Dictionary")
    End If
    If level < UBound(arr, 2) Then
        Dim bic As Object
        Set bic = dic.Item(arr(ya, level))
        DicAddRecu bic, level + 1, arr, ya
        
        Set dic.Item(arr(ya, level)) = bic
    End If
End Sub

Как макросом удалить строки из объединённых ячеек
 
Код
Sub DeleteMergedRows()
    Dim myRange As Range
    Set myRange = Range("A100:A124")
    Range("A100").Resize(ActiveSheet.UsedRange.Rows.Count).UnMerge
    'или так myRange.Resize(ActiveSheet.UsedRange.Rows.Count).UnMerge
    myRange.EntireRow.Hidden = False
    'myRange.UnMerge
    myRange.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Shift:=xlShiftUp
End Sub
Многоуровневый выпадающий список
 
Цитата
написал:
это так специально?
Нижняя часть не нужна.
Копирование значения с фиксацией из динамической ячейки
 
Цитата
написал:
Существует ли возможность
Да.
Событие Worksheet.Change (Excel) | Microsoft Learn
Многоуровневый выпадающий список
 
В Упр3 2 надо заменить на 1.
Как заменить, ускорить формулу =СЧЁТЕСЛИ
 
Цитата
написал:
файл в формате txt и сверять также с файлом в формате txt, а вот чтобы вывод условно 10 самых частых комбинаций уже был в excel? или я сильно многого хочу от excel?
Почему ж сразу от excel?  :D
Код
Option Explicit

Sub CountTXT()
    Dim fullKeys As String, fullData As String

    Dim aFiles As Variant
    aFiles = ShowFileDialog(True)
    If IsEmpty(aFiles) Then Exit Sub
    
    fullKeys = aFiles(1)
    If UBound(aFiles) = 1 Then
        aFiles = ShowFileDialog(False)
        If IsEmpty(aFiles) Then Exit Sub
        fullData = aFiles(1)
    Else
        fullData = aFiles(2)
    End If
    CloseEmptyWb
    
    Dim dic As Object
    Set dic = ReadTXT(fullKeys, fullData)
    
    Dim aMax As Variant
    aMax = GetMaxArray(dic, 10)
    
    PrintArray aMax, Workbooks.Add(1).Sheets(1).Cells(1, 1)
End Sub

Private Sub PrintArray(arr As Variant, rr As Range)
    Set rr = rr.Resize(UBound(arr, 1), UBound(arr, 2))
    rr.Value = arr
End Sub

Private Function GetMaxArray(dic As Object, nMax As Long) As Variant
    Dim krr As Variant, jrr As Variant, mm As Long
    krr = dic.Keys()
    jrr = dic.Items()
    
    Dim res As Variant, ya As Long, jj As Long
    ReDim res(1 To nMax, 1 To 2)
    
    For ya = 1 To nMax
        mm = WorksheetFunction.Max(jrr)
        If mm = 0 Then Exit For
        jj = WorksheetFunction.Match(mm, jrr, 0)
        jj = jj - 1
        res(ya, 1) = krr(jj)
        res(ya, 2) = jrr(jj)
        jrr(jj) = 0
    Next
    GetMaxArray = res
End Function
 
Private Function ReadTXT(fullKeys As String, fullData As String) As Object
    Const BUFFSIZE = 100000
    Dim fso As Object 'New FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim ss As String, arr As Variant, ya As Long
    
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
     
    Application.StatusBar = "Читаю файл " & fso.GetBaseName(fullKeys)
    With fso.OpenTextFile(fullKeys, 1)
        Do
            If .AtEndOfStream Then Exit Do
            ss = .Read(BUFFSIZE)
            If Not .AtEndOfStream Then ss = ss & .ReadLine
            arr = Split(ss, vbCrLf)
            For ya = LBound(arr) To UBound(arr)
                If arr(ya) <> "" Then
                    dic(arr(ya)) = 0
                End If
            Next
            DoEvents
        Loop
        .Close
    End With
    
    Application.StatusBar = "Читаю файл " & fso.GetBaseName(fullData)
    With fso.OpenTextFile(fullData, 1)
        Do
            If .AtEndOfStream Then Exit Do
            ss = .Read(BUFFSIZE)
            If Not .AtEndOfStream Then ss = ss & .ReadLine
            arr = Split(ss, vbCrLf)
            For ya = LBound(arr) To UBound(arr)
                If arr(ya) <> "" Then
                    If dic.Exists(arr(ya)) Then
                        dic(arr(ya)) = dic(arr(ya)) + 1
                    End If
                End If
            Next
            DoEvents
        Loop
        .Close
    End With
    Application.StatusBar = False
    Set ReadTXT = dic
End Function
 
Private Sub CountRange(condRange As Range, dataRange As Range, outputRange As Range)
    Dim arr As Variant
    arr = Intersect(condRange, condRange.Parent.UsedRange).Value
     
    Dim brr As Variant
    brr = Intersect(dataRange, dataRange.Parent.UsedRange).Value
     
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
     
    Dim ya As Long
    For ya = 1 To UBound(arr, 1)
        dic(arr(ya, 1)) = 0
    Next
 
    For ya = 1 To UBound(brr, 1)
        If dic.Exists(brr(ya, 1)) Then
            dic(brr(ya, 1)) = dic(brr(ya, 1)) + 1
        End If
    Next
 
    ReDim brr(1 To UBound(arr, 1), 1 To 1)
    For ya = 1 To UBound(arr, 1)
        brr(ya, 1) = dic(arr(ya, 1))
    Next
     
    outputRange.Resize(UBound(brr, 1), UBound(brr, 2)).Value = brr
End Sub

Private Function ShowFileDialog(bAllowMultiSelect As Boolean) As Variant
    'ShowFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
         
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
         
    Static sInitialFileName As String
    If sInitialFileName = "" Then sInitialFileName = ThisWorkbook.Path & "\"
         
    Dim oFD As FileDialog
    Dim lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = bAllowMultiSelect
        .Title = IIf(bAllowMultiSelect, "Выбрать файлы", "Выбрать файл") 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        '.Filters.Add "Excel files", "*.xls*", 1 'устанавливаем возможность выбора только файлов Excel
        .Filters.Add "Text files", "*.txt", 1 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 1 'устанавливаем тип файлов по умолчанию - Text files(Текстовые файлы)
        .InitialFileName = sInitialFileName
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Function 'показывает диалог
        Dim arr As Variant, sName As String
        'цикл по коллекции выбранных в диалоге файлов
        For lf = 1 To .SelectedItems.Count
            sName = fso.GetFileName(.SelectedItems(lf))
            If Left(sName, 2) <> "~$" Then
                If sName <> ThisWorkbook.Name Then
                    If IsEmpty(arr) Then
                        ReDim arr(1 To 1)
                    Else
                        ReDim Preserve arr(1 To UBound(arr) + 1)
                    End If
                    arr(UBound(arr)) = .SelectedItems(lf)  'считываем полный путь к файлу
                    sInitialFileName = arr(UBound(arr))
                End If
            End If
        Next
        ShowFileDialog = arr
    End With
End Function

Private Sub CloseEmptyWb()
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        If wb.Path = "" Then wb.Close False
    Next
End Sub
Скопировать данные(лист) из выбранной книги
 
Цитата
написал:
даже в диспетчере имён была создана формула
Замена формул на листе не решает задачу изменения в диспетчере имён. Лучше менять связи:
Код
wbTarget.ChangeLink Name:=shSource.Name, NewName:=wbTarget.Name, Type:=xlExcelLinks

Скрытый текст
Формула массива: Суммы по строкам
 
Код
=СУММ(E4:E1048576)
И это не формула массива.
Скопировать данные(лист) из выбранной книги
 
Скрытый текст
Скопировать данные(лист) из выбранной книги
 
Код
Option Explicit

Private Const sInitialFileName = "E:\Сервер\Сервер 1\Сервер 2\Сервер 3\Сервер 4\РАБОЧИЕ\Журнал выездов\"
Private Const sheetNames = "Фрукты;Овощи"
  
Sub Копировать_по_журналам()
    Dim wbSource As Workbook, wbTarget As Workbook, c As Range, arrWB(), w As Variant, sheetName As Variant
    arrWB = ShowFileDialog()
    
    Set wbTarget = ActiveWorkbook
    With Application
       .EnableEvents = False
       .Calculation = xlCalculationManual
       .ScreenUpdating = False
       .Visible = False
            
        For Each w In arrWB
            Set wbSource = Workbooks.Open(w)  ' Этот метод копирует данные в книги находящиеся по пути с главной
            For Each sheetName In Split(sheetNames, ";")
                wbSource.Worksheets(sheetName).Cells.Copy wbTarget.Worksheets(sheetName).Cells 'копируем все данные с активного листа
                For Each c In wbTarget.Worksheets(sheetName).Cells.SpecialCells(xlCellTypeFormulas, 23)
                    c.FormulaLocal = Replace(c.FormulaLocal, "[" & ThisWorkbook.Name & "]", "")
                Next c
            Next
            wbSource.Close False
        Next w
            
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
        .Visible = True
    End With
    MsgBox "Готово"
End Sub
  
Private Function ShowFileDialog() As Variant
    'ShowFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
      
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
      
    Dim oFD As FileDialog
    Dim lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Title = "Выбрать файлы" 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .Filters.Add "Excel files", "*.xls*", 1 'устанавливаем возможность выбора только файлов Excel
        '.Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 1 'устанавливаем тип файлов по умолчанию - Text files(Текстовые файлы)
        .InitialFileName = sInitialFileName
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Function 'показывает диалог
        Dim arr As Variant, sName As String
        'цикл по коллекции выбранных в диалоге файлов
        For lf = 1 To .SelectedItems.Count
            sName = fso.GetFileName(.SelectedItems(lf))
            If Left(sName, 2) <> "~$" Then
                If sName <> ThisWorkbook.Name Then
                    If IsEmpty(arr) Then
                        ReDim arr(1 To 1)
                    Else
                        ReDim Preserve arr(1 To UBound(arr) + 1)
                    End If
                    arr(UBound(arr)) = .SelectedItems(lf)  'считываем полный путь к файлу
                End If
            End If
        Next
        ShowFileDialog = arr
    End With
End Function
Поиск позиции отвечающую нескольким условиям
 
Если дело только в количестве строк, то так:
Код
=ИНДЕКС(C:C;10000-МАКС((МК[Каркас]=Таблица6[@Каркас])*(МК[Дата]<=Таблица6[@Дата]-1)*(МК[Шт]>=Таблица6[@Шт])*(10000-СТРОКА(МК[Каркас]))))
Многоуровневый выпадающий список
 
Тогда так.
Формирование сводной спецификации из нескольких адресных
 
Пишу в личку.
Request timed out
Изменено: МатросНаЗебре - 18.11.2025 13:29:24
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 292 След.
Наверх