Макрос VBA для динамического вставления значений поля сводной таблицы "n" - PullRequest
0 голосов
/ 22 ноября 2018

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

В базе данных есть категории в верхней строке и в первый денькаждый месяц в течение года на левой стороне.Цель здесь - взять мои данные о расходах за месяц (сгруппированные в сводную таблицу) и динамически вставить их в мою базу данных на основе даты и категории.

В настоящее время эта программа будет работать для большинства категорий.Необъяснимо, что он хочет работать только с моей сводной таблицей.Другие таблицы или сводные таблицы не нужны, даже если ссылки изменены.Он также по какой-то причине ненавидит категорию «другие» в столбце AJ и не будет публиковать в ней сообщения, даже если я поменяю имя.Иногда он решает, что что-то нехорошо, и просто ломается.

Если запись в сводной таблице не соответствует категории, которую она ломает, что также является проблемой.

Как только программа ломается,Я должен выйти из редактора VBA и снова открыть его, чтобы программа перестала работать с ошибками.

Вещи обычно ломаются в строке ColNum = Sheet5.Cells(2, 1).EntireRow..., поле TypeName иногда будет иметь имя категории, которое недаже в сводной таблице, но это был последний тест, который я провел.

Sub PivPasteNameData()
    'loop variables
    Dim I As Long
    Dim j As Long

    'pivot table variables
    Dim TypeName As String
    Dim TypeValue As Double

    'match variables
    Dim TodayDate As Range
    Dim DateRange As Range
    Dim CategoryRange As Range

    'paste variables
    Dim RowNum As Integer
    Dim ColNum As Integer

    'Setting match variables
    'this points to a cell on dashboard with today's date
    Set TodayDate = Sheet2.Range("C1")
    'this points to the left hand column of the database, it is the first of each month in ascending order
    Set DateRange = Sheet5.Range("A1:A100")
    'This points to all the categories across the top of the database
    Set CategoryRange = Sheet5.Range("A1:AZ2")

    'the index # will need to be variable
    Set PvTable = Sheet7.PivotTables(1)

    'first loop
    For I = 1 To PvTable.RowFields.Count
        'second loop
        For j = 1 To PvTable.RowFields(I).PivotItems.Count

            'setting the pivot tables field name (the type of the cost)
            TypeName = PvTable.RowFields(I).PivotItems(j)

            'getting the value of the cost
            TypeValue = Sheet7.PivotTables(1).GetPivotData("cost", "type", TypeName)

            'debugging
            'MsgBox TypeName
            'MsgBox TypeValue

            'find the corresponding date row numbner to the current date in the database
            RowNum = Application.WorksheetFunction.Match(TodayDate, DateRange, 1)
            'find the cost category column number in the database. For some reason I could NOT get Match working horizontally, my next attempt is going to use INDEX MATCH MATCH
            ColNum = Sheet5.Cells(2, 1).EntireRow.Find(What:=TypeName, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column

            'paste cost value in correct date/category
            Sheet5.Cells(RowNum, ColNum).Value = TypeValue
        Next j
    Next I
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...