powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / прошу помоши
6 сообщений из 31, страница 2 из 2
прошу помоши
    #34070479
betepon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
iRow = Sheets("Data1").UsedRange.Row + Sheets("Data1").UsedRange.Rows.Count -  1 
For i = j -  1  To  1  Step - 1 
    T1_date = Sheets("Data_F").Cells( 1 , i)
'    Находим требуемую дату на листе "Data1"
    L = "Data1"
    CLM_1 = FindColumn(L, CStr(T1_date))
        
        If CLM_1 <>  0  Then
                Set ws = ActiveWorkbook.Worksheets(L)
                A1 = " "
                A2 =  2 
                While A1 <> ""
'                   диапазон поиска в столбце
                    Set FC1 = ws.Range(Sheets(L).Cells(A2, CLM_1), Sheets(L).Cells(iRow, CLM_1))
'                    Нашли
                    A1 = FC1.End(xlDown).Value
'                        Если то, что нашли - пустое, тогда это конец
                        If A1 = "" Then GoTo metka_K2:
'                    а в какой строке нашли?
                    A2 = FC1.End(xlDown).Row

'                   диапазон поиска в строке
                    Set FR1 = ws.Range(Sheets(L).Cells(A2,  4 ), Sheets(L).Cells(A2, CLM_1 -  2 ))
metka_K1:
'                    Нашли
                    B1 = FR1.End(xlToRight).Value
'                        если встретился 0 - это ошибка - исправить
                        If B1 = "0" Then
                            FR1.End(xlToLeft).Value = ""
                            GoTo metka_K1:
                        End If
'                        Если то, что нашли - пустое,
'                        или колонка найденного не поменялась, тогда значит нашли 0
                        If B1 = "" Or FR1.End(xlToRight).Column = CLM_1 Then
                            B1 = "0"
                        End If
'                    читаем данные
                    B2 = CInt(Sheets("Data_F").Cells( 2 , i))
'                    вычисляем новые
                    B3 = B2 + CInt(A1) - CInt(B1)
'                    записываем новые
                    Sheets("Data_F").Cells( 2 , i) = CStr(B3)
                Wend
                    
        Else
'        Если даты нет - тогда запоминаем 0
            Sheets("Data_F").Cells( 2 , i) =  0 
        End If
metka_K2:

' ...................
' здесь такая - же обработка других листов с похожей структурой
' ...................

next i


С уважением BETEPON
---------------------------
Ну вот собственно и ВСЕ.
Подпись:Смерть
...
Рейтинг: 0 / 0
прошу помоши
    #34071099
betepon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем после проверки код пришлось признать неудачным.
поиск функцией End в случае непрерывной последовательности дает только конц последовательности данных - а средину пропускает

Буду все же делать циклами - надежнее.

С уважением BETEPON
---------------------------
Ну вот собственно и ВСЕ.
Подпись:Смерть
...
Рейтинг: 0 / 0
прошу помоши
    #34071145
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beteponВ общем после проверки код пришлось признать неудачным.
поиск функцией End в случае непрерывной последовательности дает только конц последовательности данных - а средину пропускает

Буду все же делать циклами - надежнее.

Ну и зря. Не End "дает только конц последовательности данных в случае непрерывной последовательности", а End(xlDown) . А вот выражение Cells(65536,Col).End(xlUp) делает как раз то, что тебе нужно ;-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
прошу помоши
    #34075918
betepon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение реализовано на 2-х функциях

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Function ColumnAnaliz_1(ByRef SheetsName As String, ByRef ColumnNumber As Long, _
                        ByRef StartDataRow As Integer, ByRef BlokColumnNumber As Integer) As Integer
                        
Dim A1 As String
Dim A2 As Integer

Dim B1 As String

Dim C1 As Integer

Dim iRow As Long

Dim i As Long

rem Определяем конец листа
iRow = Sheets(SheetsName).UsedRange.Row + Sheets(SheetsName).UsedRange.Rows.Count -  1 
rem стартовая строка
i = StartDataRow
rem накопленная сумма
C1 =  0 
Do
    rem смотрим на ячейку
    A1 = Sheets(SheetsName).Cells(i, ColumnNumber)
    rem если не пустая
    If A1 <> "" Then
        rem включаем строчный анализ
        B1 = RowAnaliz_1(SheetsName, i, ColumnNumber, BlokColumnNumber)
        rem и перескакиваем на следующую строку
        i = i +  1 
    Else
        rem Если пустая ищем первую полную
        A1 = Sheets(SheetsName).Cells(i, ColumnNumber).End(xlDown).Value
         rem если не нашли - конец листа достигнут
          If A1 = "" Then Exit Do
        rem запоминаем номер строки, где нашли
        A2 = Sheets(SheetsName).Cells(i, ColumnNumber).End(xlDown).Row
        rem включаем строчный анализ
        B1 = RowAnaliz_1(SheetsName, CLng(A2), ColumnNumber, BlokColumnNumber)
        rem и перескакиваем на следующую строку
        i = A2 +  1 
    End If
rem Производим накопление суммы
    C1 = C1 + CInt(A1) - CInt(B1)
Loop Until A1 = ""
     Rem выдаем результат
    ColumnAnaliz_1 = C1

End Function


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Function RowAnaliz_1(ByRef SheetName As String, ByRef NumberRow As Long, _
                    ByRef StartDataColumn As Long, _
                    ByRef ColumnBlockNumber As Integer) As Integer
    
Dim B1 As String
Dim B2 As Integer
rem значение левого данного
B1 = ""
Do
    rem смотрим на ячейку левее
    B1 = Sheets(SheetName).Cells(NumberRow, StartDataColumn -  1 )
      rem Если пустая ищем первую полную
    If B1 = "" Then
        rem Значение левой ячейки
        B1 = Sheets(SheetName).Cells(NumberRow, StartDataColumn).End(xlToLeft).Value
        rem колонка найденной ячейки
        B2 = Sheets(SheetName).Cells(NumberRow, StartDataColumn).End(xlToLeft).Column
rem        если ничего не найдено или колонка найденной ячейки принадлежит 
rem        диапзону от 1 до ColumnBlockNumber то данные равны 0
        If B1 = "" Or B2 < ColumnBlockNumber Then
            B1 =  0 
        End If
    End If
Loop Until B1 <> ""
rem присваиваем результат
RowAnaliz_1 = B1

End Function

Проверил. Работает.

С уважением BETEPON
---------------------------
Ну вот собственно и ВСЕ.
Подпись:Смерть
...
Рейтинг: 0 / 0
прошу помоши
    #34078237
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
betepon
Проверил. Работает.

1) Используй длинные и значимые имена переменных. Даже для временных переменных.
2) Проверять пустая ячейка или нет, лучше через IsEmpty(SomeCell). Это даст тебе настоящую пустую ячейку. А просто сравнение SomeCell="" вернет правду если видимый текст в ячейке совпадает с пустой строкой. Например в ячейке есть формула типа: =if(A1=0, "", 1/A1)
...
Рейтинг: 0 / 0
прошу помоши
    #34079084
betepon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во всех книгах ни одной формулы на листах нет.
Все вычисления выполняются через макросы.

Но ваш совет очень полезен. Я его учту.

С уважением BETEPON
---------------------------
Ну вот собственно и ВСЕ.
Подпись:Смерть
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / прошу помоши
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]