VBA для заполнения листа - PullRequest
0 голосов
/ 03 мая 2020

Исходные данные

enter image description here

Данные Заполняемый лист

enter image description here

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

Я хочу получить значение цифры 1023 * из исходного листа под соответствующим столбцом другого листа.

Я попробовал это

Я пытался добавить код, но где-то что-то пошло не так, можете проверить. Учитывая, что мои данные уже отформатированы с.

Sub pop_codes() '
    Dim wsdata, wsPop As Worksheet
    Dim lngLoop1 As Long
    Dim lngLoop2 As Long
    Dim aData() As String
    Dim strData As String
    Dim DataLastRow As Integer
    Dim DataLastCol As Integer
    Set wsdata = Sheets("SourceData")
    Set wsPop = Sheets("TempData")
    DataLastRow = wsdata.Cells(wsdata.Rows.Count, "A").End(xlUp).Row
    DataLastCol = wsdata.Cells(1, wsdata.Columns.Count).End(xlToLeft).Column

    OutputRow = 2
    SearchArr = Array("AV", "CS", "P", "X", "FW", "H", "J", "L", "M", "N", "P", "PD", "PK", "R", "S", "T", "V", "W", "X", "BK", "CP", "FX", "HD", "IP", "IU")
    For OutputRow = 2 To DataLastRow
        For OutputCol = 2 To DataLastCol
           strData = wsdata.Cells(OutputRow, OutputCol)
           ' strData = Replace(strData, ")", ",")
           ' strData = Replace(strData, "(", ",")
           'strData = Replace(strData, " ", "")
            aData() = Split(strData, ",")
            For lngLoop1 = LBound(aData, 1) To UBound(aData, 1)
                For lngLoop2 = LBound(SearchArr) To UBound(SearchArr)
                    If InStr(aData(lngLoop1), SearchArr(lngLoop2)) > 0 Then
                        wsPop.Cells(OutputRow, 1) = wsdata.Cells(OutputRow, 1)
                        wsPop.Cells(OutputRow, 2) = wsdata.Cells(1, DataLastCol)
                        wsPop.Cells(OutputRow, 3) = SearchArr(lngLoop2)
                        wsPop.Cells(OutputRow, 4) = Replace(aData(lngLoop1), SearchArr(lngLoop2), "")
                        OutputRow = OutputRow + 1
                    End If
                Next lngLoop2
            Next lngLoop1
        Next OutputCol
    Next OutputRow
sExit:
    On Error Resume Next
    Set wbData = Nothing
    Set wsPop = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sDataSource", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Ответы [ 2 ]

1 голос
/ 03 мая 2020

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

Некоторый код VBA для этого будет выглядеть следующим образом:

Sub sDataSource()
    On Error GoTo E_Handle
    Dim wsIn As Worksheet
    Dim lngInLastRow As Long
    Dim lngInLastCol As Long
    Dim wsOut As Worksheet
    Dim strData As String
    Dim aData() As String
    Dim aSearch() As Variant
    Dim lngLoop1 As Long
    Dim lngLoop2 As Long
    Dim lngOutRow As Long
    Dim lngInRow As Long
    Dim lngInCol As Long
    Set wsIn = Worksheets("SourceData")
    lngInLastRow = wsIn.Cells(wsIn.Rows.Count, "A").End(xlUp).Row
    lngInLastCol = wsIn.Cells(1, wsIn.Columns.Count).End(xlToLeft).Column
    Set wsOut = Worksheets("TempData")
    lngOutRow = 2
    aSearch = Array("AV", "BK", "CP", "CS", "FW", "FX", "HD", "IP", "IU", "PD", "PK", "P", "H", "J", "L", "M", "N", "R", "S", "T", "V", "W", "X")
    For lngInRow = 2 To lngInLastRow
        For lngInCol = 2 To lngInLastCol
            strData = wsIn.Cells(lngInRow, lngInCol)
            strData = Replace(strData, ")", ",")
            strData = Replace(strData, "(", ",")
            strData = Replace(strData, " ", "")
            aData() = Split(strData, ",")
            For lngLoop1 = LBound(aData, 1) To UBound(aData, 1)
                For lngLoop2 = LBound(aSearch) To UBound(aSearch)
                    If InStr(aData(lngLoop1), aSearch(lngLoop2)) > 0 Then
                        wsOut.Cells(lngOutRow, 1) = wsIn.Cells(lngInRow, 1)
                        wsOut.Cells(lngOutRow, 2) = wsIn.Cells(1, lngInCol)
                        wsOut.Cells(lngOutRow, 3) = aSearch(lngLoop2)
                        wsOut.Cells(lngOutRow, 4) = Replace(aData(lngLoop1), aSearch(lngLoop2), "")
                        aData(lngLoop1) = ""
                        lngOutRow = lngOutRow + 1
                    End If
                Next lngLoop2
            Next lngLoop1
        Next lngInCol
    Next lngInRow
sExit:
    On Error Resume Next
    Set wsIn = Nothing
    Set wsOut = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sDataSource", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

В этом коде я зациклил рабочий лист и получил значение для каждой недели / пользователя. Я заменил скобки запятыми и удалил все пробелы. Затем он был разбит на массив, и я затем прошёл этот массив, проверяя каждое из различных значений (т. Е. CS, P, AV, X), которые я ищу. Если я его найду, то выведу этот элемент массива, заменив текстовую часть пустой строкой).

Код был изменен, чтобы учесть тот факт, что некоторые имена данных могут вызывать дублирование (например, «P»). и «CP») при использовании InStr(), и я справился с этим, поместив двухсимвольные имена данных в начале массива, и, если есть совпадение, то установив элемент массива данных равным нулю длина строки.

С уважением,

0 голосов
/ 03 мая 2020

Нет простого решения для такой сложной задачи.

Если бы я был вами, я сначала разбил бы это на разные страницы: одна страница, содержащая результаты AV, одна с CS результаты, ...

Вам также нужно найти способ прочитать содержимое ячеек, я вижу, что нужно сделать следующее:

  • Удалить все AVO( и ) из всех ячеек (по крайней мере, так я понимаю задачу)
  • Различие между ячейками, содержащими запятую, и ячейками без (используйте массивы для хранения значений ячеек с запятыми)
  • Читая содержимое ячеек, остерегайтесь места (иногда присутствует (40 AV), иногда нет (40CS))

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

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