Запуск макроса Excel для нескольких файлов Excel - PullRequest
0 голосов
/ 11 января 2019

Я новичок в VBA, и мне действительно нужна помощь с этой проблемой.

У меня есть 100 файлов Excel, которые содержат 5 листов в каждом. Я хочу изменить ячейку C-24 3-го листа (из всех файлов Excel, имеющих такой же шаблон) с Red Font на отрицательные числа.

Значения красного шрифта ячейки C24 равны отрицательным значениям, а остальные - положительным значениям. (логика цветового кодирования согласована, когда красный шрифт отрицательный, а зеленый шрифт положительный)

Ниже приведен код, который дает мне ошибку;

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook
    Pathname = "C:\CY 2018\12-Dec\"
    Filename = Dir(Pathname & "*.xls*")
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        DoWork wb
        wb.Close SaveChanges:=True
        Doevents
        Filename = Dir()
    Loop
End Sub
Sub DoWork(wb As Workbook)
    With wb.Sheets(3).Select   
    Value = Replace(objXLWs.Cells(24, "C").Text, vbLf, "<br>")
    If Value.Fore.Color.RGB = RGB(255, 0, 0) Then
    'nt.Color = vbRed Then  
    'If Value.Font.Color = vbRed Then
    Value = -(Value)         
    End With
End Sub   

Пример файла Excel Прилагается шаблон для справки

Где я здесь не так делаю. Любые предложения с благодарностью?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Не зная, где происходит ваша ошибка, с первого взгляда могу сказать, что

Value = Replace(objXLWs.Cells(24, "C").Text, vbLf, "<br>")
If Value.Fore.Color.RGB = RGB(255, 0, 0) Then
'nt.Color = vbRed Then  
'If Value.Font.Color = vbRed Then
Value = -(Value)         
End With

Отсутствует End If прямо перед вашим End With (это действительно помогает сделать отступ).

Кроме этого, я не вижу нигде, где инициализируется переменная objXLws или Value, для чего я бы порекомендовал поместить Option Explicit в верхней части вашего модуля кода. Объявление переменных важно.

Кроме того, я сомневаюсь, что вам вообще нужны Value или objXLWs в качестве переменных, поскольку все, что вы делаете, это поменяйте знак и измените цвет. Кроме того, синтаксис для изменения цвета шрифта ячейки Cell.Font.Color = RGB()

Что-то, что могло бы работать лучше для вас, было бы

Sub DoWork(wb As Workbook)
    With wb.Sheets(3)   
        If .Cells(24, "C").Font.Color = RGB(255, 0, 0) Then
            .Cells(24, "C") = .Cells(24, "C") * -1
        End if
    End With
End Sub 
0 голосов
/ 11 января 2019

Может быть связано с существующим форматированием ячеек. Попробуйте следующий код


    Sub DoWork(wb As Workbook)
        With wb.Sheets(3).Range("C24") 'there is no need to select the sheet
            'include your other code here
            'Add this to address the format
            .NumberFormat = "0.00" 'this will show negative numbers with a minus, make it just 0 if you dont want decimal points
            '.NumberFormat = "0.00;[Red]0.00" 'this will show negative numbers in red font
        End With
    End Sub

EDIT Код обновлен с учетом всех возможностей (надеюсь) проверяет формат числа, условный формат или только красный шрифт.

Sub DoWork(wb As Workbook)
    Dim bolMakeNeg As Boolean
    Dim V As Variant
    Dim rng As Range
    bolMakeNeg = False
    'if the cell are merged this will extract the value
    If wb.Sheets("3. NCC's").Range("C24").MergeCells Then
        Set rng = wb.Sheets("3. NCC's").Range("C24").MergeArea
        V = rng.Cells(1, 1).Value
    Else
        Set rng = wb.Sheets("3. NCC's").Range("C24")
        V = rng.Value
    End If

    With rng 'obtain reference to the cell
            'check if the value of the cell is negative
            If V < 0 Then 'if this is a negative value, this will sort out problem if number formatting is making it red
                bolMakeNeg = True
            ElseIf .Font.Color = RGB(255, 0, 0) Or .DisplayFormat.Font.Color = RGB(255, 0, 0) Then 'if there is a conditional formatting the display format should point to the color displayed
                bolMakeNeg = True
            End If
            If bolMakeNeg Then
               'set number format
               .NumberFormat = "#,##0;-#,##0"  'change decimals as required
               If V > 0 Then   'set negative value
                .Value = -1 * V
               End If
               '*************
               'Add other code to set font face etc.
               rng.Font.Name = "Arial"
               rng.Font.Size = 9
               rng.Font.Bold = True
               '*************
            End If
    End With
End Sub
0 голосов
/ 11 января 2019

Замените сабвуфер DoWork на этот

Sub DoWork(wb As Workbook)
    Sheets(3).Range("C24").NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 "
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...