Ситуация:

У меня около 2600 таблиц в одной книге .xlsx, по одной таблице на вкладку. Они должны быть опубликованы онлайн в формате PDF, но, во-первых, мне нужно подавить частоты и проценты в строках с частотами меньше 10. Форматирование маски не работает с параметром перекрестного списка в SAS 9.3. Поэтому я думаю, что самый эффективный способ - изменить цвет шрифта в соответствующих ячейках на белый. К сожалению, условное форматирование не работает при выборе нескольких вкладок. Использование VBA кажется лучшим вариантом, но я очень мало знаю об этом.

Вот пример таблиц (для краткости я спрятал строки для 4-7 классов):

Пример: Оригинальная таблица

Цель:

Измените цвет шрифта в ячейках с вычисленными значениями на белый, чтобы имитировать подавление. Например:

Пример: «Подавленная» таблица

Может кто-нибудь, пожалуйста, укажите мне в правильном направлении? Я чувствую, что это должно быть довольно просто, но каждый раз, когда я так думаю, все наоборот. Я видел несколько похожих вопросов, но ни один из них не содержал ответов, относящихся к моей проблеме.

Большое спасибо!!!!

-1
doctorjay 2 Май 2019 в 02:18

3 ответа

Лучший ответ

Ответ на дополнительный вопрос о создании временной копии для экспорта:

Sub CreateExportCopy()

    Dim wb As Workbook, wbExport As Workbook, newPath As String

    Set wb = Workbooks("DataTables.xlsx") '<< your (open) data file

    newPath = wb.Path & "\ForPDF_" & wb.Name

    'this will create a copy of the workbook in the same location,
    '  with the name prepended by "ForPFDF_"
    wb.SaveCopyAs newPath

    'open the copy
    Set wbExport = Workbooks.Open(newPath)

    'follow one of the other answers here to process the
    '  tables in wbExport, but use (eg)
    '     c.ClearContents
    '  instead of
    '     c.Font.Color = vbWhite

End Sub
0
Tim Williams 3 Май 2019 в 23:06

Они всегда в колонке "C"? Если нет, то вы должны проверить и такие вещи.
Это всегда начинается в строке 10?
Что касается простого циклического перебора листов и значений, если вы хотите простое, это примерно так просто:

Sub whiteout()
Dim c As Range, ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    For Each c In Range(ws.Range("C10"), ws.Range("C65000").End(xlUp))
        If c.Value < 10 Then c.Font.Color = vbWhite
    Next c
Next ws
End Sub

Циклы For each довольно интуитивны, но имейте в виду, что доступ к таким вещам и их изменение в цикле могут быть довольно медленными в широком масштабе.

0
Christofer Weber 1 Май 2019 в 23:54

Doctorjay .

Я работал над своим собственным фиктивным столом, свободно основываясь на вашем наборе данных.

Я бы использовал такой макрос:

Sub clean_lower_than_10()
Dim Sheet As Worksheet


For Each Sheet In ActiveWorkbook.Sheets
    For Each Row In Sheet.UsedRange.Rows
            'Columns where the frequency and percentage are: C,D -> 3,4
            For Each Cell In Row.Cells
                'Inside this condition, you should change the numbers for the column number that corresponds to the ones on your tables.
                If Cell.Column = 3 Or Cell.Column = 4 Then
                    If Cell.Value < 10 Then
                        Cell.Font.ColorIndex = 2
                    End If
                End If
            Next
        Next
Next


End Sub

ColorIndex = 2 означает белый цвет для шрифта ячейки.

Это решение предполагает, что ваши значения процента и частоты всегда находятся в одних и тех же столбцах на каждом листе.

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

Моя таблица перед выполнением макроса:

Before executing macro

Моя таблица после выполнения макроса:

After executing macro

Обратите внимание, что значение остается неизменным, но цвет шрифта изменился на белый.

Надеюсь, это поможет

0
francovici 2 Май 2019 в 00:00