Дмитрий(The_Prist) Щербаков написал: Можете в приложенном примере показать на паре строк(вбив руками): вот это исходные данные, а вот это надо получить? Там, думаю, всем будет понятнее.
Иванов Иван, для того что бы вы получили совет или готовое решение Вам необходимо предложить новое название темы (предложить тут в сообщении), а модераторы изменят (вы не сможете) в котором будет понятно что делаете (например Произвести расчет площади круга) и пример приложить с исходными данными и желаемым результатом. сейчас тема не соответствует правилам и помощь скроют или тему удалят.
Максим Колесников, сделал с макросом - он отбирает уникальные компании и договоры. Выводим на вспомогательный лист. ДАлее обычными формулами в проверку данных: для компании
Sub mrshkei()
Dim arr, i As Long, arr2, arr3, n As Long, col As New Collection, col2 As New Collection
LR = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A3:D" & LR)
For i = LBound(arr) + 1 To UBound(arr)
On Error Resume Next
col.Add arr(i, 1) & ":" & arr(i, 2), CStr(arr(i, 1) & ":" & arr(i, 2))
Next i
ReDim arr2(1 To col.Count, 1 To LR)
For i = 1 To col.Count
arr3 = Split(col(i), ":")
arr2(i, 1) = arr3(0)
arr2(i, 2) = arr3(1)
k = 3
For n = LBound(arr) + 1 To UBound(arr)
If CStr(arr(n, 1)) = arr3(0) And arr(n, 2) = CDate(arr3(1)) Then
arr2(i, k) = arr(n, 3)
arr2(i, k + 1) = arr(n, 4)
k = k + 2
End If
Next n
Next i
Range("F4").Resize(UBound(arr2), UBound(arr2, 2) - LBound(arr) + 1) = arr2
End Sub
Function myaddress(rng As Range) As String
Dim cell As Range
For Each cell In rng
If cell = "Адрес организации" Then
x1 = 1: GoTo XXX
End If
If x1 = 1 And cell <> 8 Then
myaddress = myaddress & cell & vbLf
ElseIf x1 = 1 And cell = 8 Then
myaddress = Left(myaddress, Len(myaddress) - 1)
Exit For
End If
XXX:
Next cell
End Function
Jake, почему сразу не писать что нужно из выписки сделать то и то ..и сразу понятнее становится всем
Код
Sub mrshkei()
Dim arr, i As Long, n as long lr As Long
With Worksheets("База")
lr = .Cells(Rows.Count, 1).End(xlUp).Row
arr = .Range("A1:A" & lr)
For i = LBound(arr) To UBound(arr)
If arr(i, 1) = 7 Then
For n = 1 To lr
If arr(i + n, 1) <> 8 Then
If arr(i + n, 1) <> "" Then
x = x & arr(i + n, 1) & vbLf
End If
Else
Worksheets("Лист1").Range("B2") = x
Exit Sub
End If
Next n
End If
Next i
End With
End Sub
Изменено: Mershik - 2 мар 2021 16:55:59(lдобавил проверку на пустую строку)
Jake, рекомендую файл-пример показать несколько вариантов и ЖЕЛАЕМЫЙ результат так же показать, я же не думаю что у вас одна организация, хотя судя по этому это выписка из ЕГРЮЛ
Марто, вот ЗДЕСЬ есть макрос в #7, его чуть исправить и добавить открытие файла, копирование новых данных в ваш отчет и все.
Код
Sub get_first_created()
Dim myPath$, mask$, f$, i%, t As Date
Dim myFolder As Object, myFile As Object
myPath = "C:\Users\123\Desktop\123\" ' директория для поиска
mask = "*.xlsx" ' маска поиска с * и ?
With CreateObject("Scripting.FileSystemObject")
Set myFolder = .GetFolder(myPath)
t = DateAdd("h", 9, Date) ' если ищем самый поздний - убрать эту строку
For Each myFile In myFolder.Files
If myFile.Name Like mask Then
If CDate(myFile.DateCreated) > t Then ' если ищем самый ранний, то <, самый поздний - >
t = CDate(myFile.DateCreated)
f = myFile.Name
End If
End If
Next
End With
Workbooks.Open myPath & f
With ActiveWorkbook
'часть кода которая берет нужные данные для отчета или что-то делает
.Close SaveChanges:=False 'закрываем открытую книгу
End With
End Sub
т.е. в том коде заменить путь на свой и строку
Код
t = Now ' если ищем самый поздний - убрать эту строку
OlegO, а точно - мой косяк) проще сделать загнать в массив и сделать цикл и все так например
Код
Sub mrshkei()
Dim arr, i As Long, lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:C" & lr)
x1 = Range("F1"): x2 = Range("F2")
For i = LBound(arr) To UBound(arr)
If arr(i, 1) = x1 And arr(i, 2) = x2 Then Range("H1") = arr(i, 3): Exit Sub
Next i
End Sub