MAcro: выберите файл для изменения, измените каждый лист, экспортируйте xlsx и pdf - PullRequest
0 голосов
/ 31 августа 2018

У меня есть файл, который экспортируется системой каждую неделю, и его необходимо слегка изменить на каждом листе, а все листы переименовать на основе одной ячейки в этой конкретной ячейке (E7). Я не могу заставить его зацикливаться, как бы я ни старался. Есть идеи, что мне не хватает? Я предполагаю, что это связано с этой переменной 'konstandst' и тем, как я называю листы, но могу исправить ..

Sub Formateraom()
    ' Format and change name of the sheet
    Dim ws As Worksheet
    Dim weekNR As Variant
    Dim konstnadst As Variant

    weekNR = InputBox("What week number is it?")
    For Each ws In Worksheets
        Set ws = ActiveSheet
        konstnadst = Range("E7")
        Range("A2:C2").Select
        Selection.ClearContents
        Range("A5:T5").Select
        Selection.ClearContents
        Columns("C:C").ColumnWidth = 75#
        Rows("5:7").Select
        With Selection
            .VerticalAlignment = xlBottom
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
        End With
        With Selection
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
        End With
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
        End With
        Columns("H:H").ColumnWidth = 13
        Range("H7,M7,G7").Select
        Range("G7").Activate
        Selection.NumberFormat = "m/d/yyyy"
        Columns("M:M").ColumnWidth = 13
        Columns("G:G").ColumnWidth = 13
        Range("C3").Select
        ActiveCell.FormulaR1C1 = weekNR
        Range("C4").Select
        With Selection
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlCenter
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        Range("C3").Select
        With Selection
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlCenter
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        ActiveSheet.Name = "Fakturaunderlag " & konstnadst & " " & weekNR
    Next
End Sub

Отправка гигантского шара кармы тому, кто сможет направить меня в правильном направлении!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Следующий вопрос на самом деле является случаем, когда вам нужно , чтобы использовать .Select. Почти во всех других случаях никогда не используйте его.

Вопрос о том, как экспортировать xlsx в формате pdf

Этот вопрос должен помочь вам узнать, как открыть файл Excel с помощью диалогового окна файла

Я не уверен, что вы хотите сделать с weekNR, учитывая, что вы делаете это позже:

ActiveCell.FormulaR1C1 = weekNR

Так что я буду игнорировать это, пока не получу больше информации об этом.

Поскольку konstnadst является Range объектом, как вы его назначили, я бы предложил объявить его как Range объект со ссылкой на рабочий лист, с которым вы работаете, например:

Dim konstandadst As Range
'you need to Set objects such as Ranges, Worksheets, Workbooks, ect.
Set konstandadst = whateverWsThisIs.Range("E7")

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

Использование:

Range1.Select
Range2.Select
Range3.Select

В результате вы выбираете Range3 только после завершения этого блока.

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

'these select cell A1
Set MyRange = ws.Range("A1")
Set MyRange = ws.Cells(1,1)

'this selects column B
Set MyRange = ws.Range("B:B")

'this selects the row from A1 to B1
Set MyRange = ws.Range(ws.Cells(1,1), ws.Cells(1,2))

'this selects a table defined from A1 to C2
Set MyRange = ws.Range(ws.Cells(1,1), ws.Cells(2,3))

Не делайте этого:

For Each ws In Worksheets

Сделайте это, потому что вы хотите явно указать VBA рабочую книгу, в которой вы ссылаетесь на коллекцию Worksheets:

For Each ws In ThisWorkbook.Worksheets

Или, если вы урод, как я:

For Each ws In Excel.Application.ThisWorkbook.Worksheets

Вот несколько важных операций, которые вы можете выполнить с Range объектами (подробнее здесь ):

'clears the values in the cells
MyRange.ClearContents
'clears the formatting and formulas in the cells
MyRange.Clear
'adjust column width
MyRange.ColumnWidth = someNumber
'adjust row height
MyRange.RowHeight = someOtherNumber
'eliminate indents (i think)
MyRange.IndentLevel = 0
'change the orientation
MyRange.Orientation = 0

После того, как вы установили ссылочные переменные для желаемых диапазонов, вы можете использовать их следующим образом:

With MyRange
    'do the stuff here
End With

Вместо:

With Selection
    'bad stuff here, don't do the stuff
End With
0 голосов
/ 31 августа 2018

Set ws = ActiveSheet всегда устанавливает текущий лист петли (то есть ws) на текущий Активный один.

таким образом вы всегда получите один и тот же лист, который будет активным до начала цикла

так что вам просто нужно изменить

Set ws = ActiveSheet

до

ws.Activate

, что делает текущий токовый шлейф активным one


но хотя вышеупомянутый патч может (кажется) работать, это также плохая привычка кодирования, и вам настоятельно рекомендуется избегать паттерна Activate/ActiveXXX/Select/Selection и переключиться на прямой и квалифицированный до рабочего листа (и рабочей книги, если во время выполнения макроса может быть более одного открытия) Range ссылка

чтобы ваш код мог выглядеть следующим образом:

Option Explicit

Sub Formateraom()
    ' Format and change name of the sheet
    Dim ws As Worksheet
    Dim weekNR As Variant
    Dim konstnadst As Variant

    weekNR = InputBox("What week number is it?")
    For Each ws In Worksheets
        With ws ' reference the current loop sheet. inside the 'With ... End With' block, all its members are accessed by means of a dot (.)
            konstnadst = .Range("E7") ' initialize 'konstnadst' to referenced sheet cell E7 value
            .Range("A2:C2").ClearContents
            .Range("A5:T5").ClearContents
            .Columns("C:C").ColumnWidth = 75#
            With .Rows("5:7") ' reference referenced sheet rows 5 to 7
                .VerticalAlignment = xlBottom
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext

                .VerticalAlignment = xlCenter
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext

                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
            End With

            .Columns("H:H").ColumnWidth = 13
            .Range("H7,M7,G7").NumberFormat = "m/d/yyyy"
            .Columns("M:M").ColumnWidth = 13
            .Columns("G:G").ColumnWidth = 13
            .Range("C3").FormulaR1C1 = weekNR

            With .Range("C4") ' reference referenced sheet cell C4
                .HorizontalAlignment = xlRight
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With

            With .Range("C3") ' reference referenced sheet cell C3
                .HorizontalAlignment = xlRight
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False

                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With

            .Name = "Fakturaunderlag " & konstnadst & " " & weekNR ' change the name of the referenced sheet
        End With
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...