Попытка очистить результаты сводки, переместив строку в соседний столбец - PullRequest
3 голосов
/ 09 мая 2019

Я выполняю макрос VBA, который принимает введенное вами значение, передает его в фильтр в сводной таблице, а затем использует результаты сводной таблицы для создания новой результирующей таблицы с размером (:, 2) со строкой разделителя (верхняя часть в поле выбора), расположенная справа от других значений (в виде индекса), чтобы затем перенести результаты на другой лист рабочей книги.

Некоторые важные примечания:

  1. Все данные представлены в формате str
  2. Все значения индекса являются полностью числами
  3. Некоторыезначения данных начинаются с цифр
  4. В некоторых разделах, где индекс указан в базе данных 2x, вместо этого имеется до 16 точек данных перед передачей нового индекса.Это причина, по которой мой оригинальный код только с каждым 8 не работал.
  5. Результаты могут быть любой длины от 8 точек данных до сотен, xlDown не работал для установки диапазона, поэтому я просто установил A1: A1000

Текущие результаты:

  1. Кажется, все работает, пока я не достиг индекса с несколькими наборами данных, и в этом случае моя функция (Row-2) mod 8 = 0 сбрасывается
  2. Индекс копируетсяправильно в этих случаях и удаление пустой строки
  3. Данные из финальной таблицы надежно перетаскиваются в другие таблицы

Некоторые вещи, которые я пробовал:

  1. IsNumeric, кажется, анализирует строки, начинающиеся с числа и отбрасывая его как True
  2. Поскольку не все значения содержат 8 точек данных, я попытался добавить значение корректировки, чтобы исправить индексирование, если оно не было числовым, но все ещес правильным индексом
  3. Попытка просто перетащить значение вниз на 16 строк, чтобы, если число было найдено, оно было перезаписано.Это не сработало.

    ActiveSheet.PivotTables("PivotTable1").PivotFields("searchcode").CurrentPage = Sheets("report").Range("B4").Value
        Range("A5:A1000").Select
        Selection.copy
        Sheets("scratch").Select
        Range("A1").Select
        ActiveSheet.Paste
        ActiveSheet.Range("A1", "A1000").Select
    
        Dim Myrange As Range
        Dim Myrow As Range
        Dim Adjust As Integer
        Adjust = 2
        Set Myrange = Selection
        For Each Myrow In Myrange.Rows
            If IsNumeric(Myrow.Row) And ((Myrow.Row = Adjust Or (Myrow.Row - Adjust) Mod 9 = 0)) Then
    
                Sheets("scratch").Range("B" & Myrow.Row + 1).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 2).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 3).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 4).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 5).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 6).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 7).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 8).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 9).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 10).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 11).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 12).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 13).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 14).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 15).Value() = Range("A" & Myrow.Row).Value()
                Sheets("scratch").Range("B" & Myrow.Row + 16).Value() = Range("A" & Myrow.Row).Value()
    
                Range("A" & Myrow.Row).Clear
    
            ElseIf (Not (IsNumeric(Myrow.Row))) And ((Myrow.Row = Adjust Or (Myrow.Row - Adjust) Mod 9 = 0)) Then
    
                Adjust = Adjust + 1
    
            End If
    
        Next Myrow
    
        Application.CutCopyMode = False
        ActiveSheet.Range("A1:A1000") = [index(lower(A1:A1000),)]
        ActiveSheet.Range("A1:A1000") = [index(trim(A1:A1000),)]
        ActiveSheet.Range("A1:A1000").Select
        Selection.Replace What:="(blank)", Replacement:="", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
        Selection.Replace What:="-", Replacement:=" ", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
        Selection.Replace What:="â€", Replacement:="", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
        Selection.Replace What:="~*", Replacement:="", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    

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

Filter 1 (All)  
Filter 2 (Code)  

Row Labels  
Index 1  
data1  
data2  
data3  
data4  
data5  
data6  
data7  
data8  
Index 2  
data1  
data2  
data3  
data4  
data5  
data6  
data7  
data8  
Index 3  
data1  
data2  
data3  
...  

Что я хочу:

Filter 1 (All)  
Filter 2 (Code)  

Row Labels  
data1 Index1  
data2 Index1  
data3 Index1  
data4 Index1  
data5 Index1  
data6 Index1  
data7 Index1  
data8 Index1  
data1 Index2  
data2 Index2  
data3 Index2  
data4 Index2  
data5 Index2  
data6 Index2  
data7 Index2  
data8 Index2  
data1 Index3  
data2 Index3  
data3 Index3  
...

1 Ответ

0 голосов
/ 13 мая 2019

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

    Dim Myrange As Range
    Dim Myrow As Range
    Dim Temp As Variant
    Dim NextTemp As Variant

    Set Myrange = Selection
    For Each Myrow In Myrange.Rows
        NextTemp = Range("A" & Myrow.Row).Value
        If IsEmpty(Range("A" & Myrow.Row)) Then
          Exit For
        ElseIf IsNumeric(NextTemp) Then
            Temp = NextTemp
            Range("A" & Myrow.Row).Value = ""
        Else
            Range("B" & Myrow.Row).Value = Temp
                End If
    Next Myrow

Не стесняйтесь обращаться, если вам нужна дополнительная информация (я не сделал кучу таких, поэтому я не уверен, как это сделать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...