Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Поиск числовых значений в ячейках,операции с ними


Автор: denfeel 22.5.2006, 08:26
Привет!
Помогите ,плиз,начинающему!
Нужен макрос для Excel,алгоритм примерно такой:
Есть много таблиц (книг) с 01 по 50. Формат ячеек таблиц – общий, просто некоторые пустые, а некоторые содержат числовые значения.В каждой книге, начиная с 01, в листе р2, в ячейках столбца С: 16,23,30,37,97,100,103,106,118,119,135,136,141,212 ищем числовые значения. При нахождении числовых значений в С16 и С23 - суммируем их и записываем в новую, созданную таблицу с одним листом (например  Выход"), в строку с номером = названию (номеру) таблицы (книги), в ячейку В. Если только одна ячейка из пары С16 и С23 имеет числовое значение, или если одна ячейка из пары = 0, то просто скопировать значение из ячейки в В табл.  Выход").
[1]Затем в листе р2 исходной таблицы ищем числовые значения в ячейках G16 и G23, а также в Н16 и Н23, вычисляем для пар G и для пар H среднее арифметическое, если обе ячейки пар имеют числовое значение и одна из них не равна 0, и пишем результаты в табл.  Выход",строку с номером = названию (номеру) таблицы (книги), в ячейки D и E соответственно. Если только одна ячейка из пары G или Н имеет числовое значение, или если одна ячейка из пары = 0, то ср.арифметическое не вычислять и просто скопировать значения из ячеек в D и Е соответственно.
Далее, если есть числовые значения С30 и С37, то повторяем шаг[1], т.е. суммируем их и пишем в табл.  Выход" , в лист 1, в строку =   исходной таблицы, но в ячейку С, затем, как в шаге [1], ищем числовые значения в парах G30 и G37, а также в Н30 и Н37 - далее по аналогии с [1], только пишем в F и G соответственно.
Далее, если есть числовые значения в столбце С: 97,100,103,106,118,119,135,136,141,212 - то пишем их в таблицу  Выход", в лист 1, в строку =   исх.табл., в ячейки K,L,M,N,O,P,Q,R,S,T (в общем, по порядку).
Потом переходим к книге 02 (следующей по номеру) и всё повторяем. (Результаты пишем в строку 02 табл.  Выход" и т.д.). Так проходим все таблицы, если таблицы с каким - то номером нет, то переходим к следующей после отсутствующей. Вроде всё.
Если можно,с комментариями.Заранее благодарю.
С уважением,Денис.
З.Ы.Алгоритм,конечно,кривой,но понять можно 

Автор: likhobory 22.5.2006, 09:56
гы, боец, и ведь не лень по форумам скакать, за эту неделю уж 10 раз бы написал  smile  

Автор: Akina 22.5.2006, 10:11
Проверка того, что содержимое ячейки может быть интерпретировано как число (независимо от формата) в рамках текущих установок локали, выполняется функцией IsNumeric. 

Автор: denfeel 23.5.2006, 14:45
Option Explicit
Dim i As Long, k As Long, l As Long
Dim strFileName As String
Dim WB As Workbook

Sub Cikl()
For i = 1 To 55
    strFileName = CStr(i) & ".xls"
    If i < 10 Then strFileName = "0" & strFileName
    Call AlgoritmBook(strFileName, i)
Next i
End Sub

Sub AlgoritmBook(str As String, jj As Long)
    str = ThisWorkbook.Path & "\" & str
    Set WB = Workbooks.Open(str)
    With WB.Worksheets("ð2")
    
    If IsNumeric(.Range("C16")) And IsNumeric(.Range("C23")) Then
        If Val(.Range("C16")) * Val(.Range("C23")) <> 0 Then
            ListWyhod.Cells(jj, 2) = Val(.Range("C16")) + Val(.Range("C23"))
        Else: ListWyhod.Cells(jj, 2) = .Range("C16") & .Range("C23")
        End If

    
    If IsNumeric(.Range("G16")) And IsNumeric(.Range("G23")) Then
        If Val(.Range("G16")) * Val(.Range("G23")) <> 0 Then
            ListWyhod.Cells(jj, 4) = (Val(.Range("G16")) + Val(.Range("G23"))) / 2
        Else: ListWyhod.Cells(jj, 4) = .Range("G16") & .Range("G23")

        End If
    End If
    
    If IsNumeric(.Range("H16")) And IsNumeric(.Range("H23")) Then
        If Val(.Range("H16")) * Val(.Range("H23")) <> 0 Then
            ListWyhod.Cells(jj, 5) = (Val(.Range("H16")) + Val(.Range("H23"))) / 2
        Else: ListWyhod.Cells(jj, 5) = .Range("H16") & .Range("H23")

        End If
    End If
    
    If IsNumeric(.Range("C30")) And IsNumeric(.Range("C37")) Then
        If Val(.Range("C30")) * Val(.Range("C37")) <> 0 Then
            ListWyhod.Cells(jj, 3) = Val(.Range("C30")) + Val(.Range("C37"))
        Else: ListWyhod.Cells(jj, 3) = .Range("C30") & .Range("C37")

         End If
    End If
    
    If IsNumeric(.Range("G30")) And IsNumeric(.Range("G37")) Then
        If Val(.Range("G30")) * Val(.Range("G37")) <> 0 Then
            ListWyhod.Cells(jj, 6) = Val(.Range("G30")) + Val(.Range("G37"))
        Else: ListWyhod.Cells(jj, 6) = .Range("G30") & .Range("G37")

        End If
    End If
'
    If IsNumeric(.Range("H30")) And IsNumeric(.Range("H37")) Then
        If Val(.Range("H30")) * Val(.Range("H37")) <> 0 Then
            ListWyhod.Cells(jj, 7) = Val(.Range("H30")) + Val(.Range("H37"))
        Else: ListWyhod.Cells(jj, 7) = .Range("H30") & .Range("H37")

         End If
    End If
    
    For k = 8 To 17    
        l = Application.WorksheetFunction.Choose(k - 7, 97, 100, 103, 106, 118, 119, 135, 136, 141, 212)

        If IsNumeric(.Cells(l, 3)) Then
        ListWyhod.Cells(jj, k) = .Cells(l, 3)
        End If
    Next
    
    End With
    WB.Close
End Sub

Вопрос: если отсутствуют какие-нибудь книги(например,после 43 сразу 50)как сделать,чтобы макрос не останавливался,а переходил к следующе,после отсутствующей,книге и продолжал цикл,а после 50 завершал?
З.Ы.Вопрос может и глупый,но я только начинаю разбираться с VBA smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)