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

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

Набор данных выглядит примерно так:

 prod1    code    garbage   info1   info2 ... info10    

1     23       1       k         a        b    ...      j  

2     27       1       k         a2       b    

3     57       2       k         a        b      c  

4     ...  

5  

6  

7  

8  

9  

10  

Я пытаюсь установить значение для условий на значение раскрывающегося списка в ведомости утверждений и перебрать столбец F, где совпадает код ing.и если он находит совпадение, итерирует горизонтально по столбцам info #, пока не достигнет пустого.В этот момент он снова начнет двигаться вертикально вниз, пока либо не достигнет последнего значения в таблице, либо не найдет другое совпадение и не запишет новые информационные значения.

В идеале каждое информационное значение отправляется в массив и распечатывается в ячейке C5: CX в электронной таблице.было бы еще лучше, если бы это могло удалить дубликаты, но я боюсь, что не знаю достаточно о VBA, чтобы заставить его работать.

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

    Sub refresh()
    Let ing = ThisWorkbook.Sheets("claim_report").Range("B2").Value
    Dim Claims
    Dim i As Integer, j As Integer
    j = 0
    For Each cell In ThisWorkbook.Sheets("fulldb").Range("F2:F56000")
        If cell.Value = ing Then
            For i = 6 To 15
                While cell.Offset(columnOffset:=i) <> ""
                    Claims(j) = cell.Value
                    i = i + 1
                    Wend
            Next
        End If
    Next
    Range("C4:C100") = Claims
End Sub

Причина, по которой у меня есть i 6-> 15, заключается в том, что строки смещены от столбца F на 6 столбцов.поэтому мысль заключалась в том, что он перебирал ячейки M2, N2, O2 ... V2, пока я не нашел пустую ячейку.

В некоторых строках некоторые из информационных столбцов пустые, поэтому вы можете заполнить 1,2,3,4, оставшиеся пустыми или 1-10, поэтому я решил использовать пустую ячейкусломать функцию.

Что бы я хотел, используя мой набор данных в качестве примера, это ввести код 1, чтобы макрос создал массив Claims, добавил значения столбцов, где код соответствует входному коду в другой электронной таблице, [a, b, ..., j, a2].Затем он будет введен в другой лист в ячейке C4 как транспонированный список.

Например,

C4 : a
C5 : b
C6 : ...
C14 : j
C15 : a2

1 Ответ

0 голосов
/ 03 апреля 2019

Похоже, некоторые проблемы с квалификацией и, возможно, просто слишком сложны.Я думаю, что вы можете сделать это немного проще для себя, используя row.value = row.value (или находя последний столбец в строке, что является более сложным способом, которым, как вам кажется, вы пытаетесь), когда он соответствует вашим критериям.Убедитесь, что вы используете Option Explicit.

, используя row.value = row.value:

dim i as long, lrs as long, lrd as long
with sheets("source") 
    lrs = .cells(.rows.count,6).end(xlup).row 'find last row on source sheet
end with
with sheets("destination") 'claim_report?
    for i = 1 to lrs 'loop through source sheet
        if sheets("source").cells(i,6).value = .cells(2,2).value then
            lrd = .cells(.rows.count,6).end(xlup).row+1  'find last row +1 on destination sheet, where you will add output
            .rows(lrd).value = sheets("source").rows(i).value
        end if
    next i
end with

, используя определенные диапазоны, все еще значение = значение:

dim i as long, lrs as long, lcs as long, lrd as long
with sheets("source") 
    lrs = .cells(.rows.count,6).end(xlup).row
end with
with sheets("destination") 'claim_report?
    for i = 1 to lrs
        if sheets("source").cells(i,6).value = .cells(2,2).value then
            lcs = sheets("source").cells(i,sheets("source").columns.count).end(xltoleft).column
            lrd = .cells(.rows.count,6).end(xlup).row+1
            .range(.cells(lrd,1).cells(lrd,lcs)).value = sheets("source").range(sheets("source").cells(i,1)sheets("source").cells(i,lcs)).value
        end if
    next i
end with
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...