2016-05-31 1 views
0

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

Desired Result

Он должен быть в состоянии обрабатывать дубликаты и пробелы.

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

Спасибо всем!

-Edit 1-

мне удалось найти способ объединить значения данных:

Функция ConcatinateAllCellValuesInRange (sourceRange Как Excel.Range) As String Dim finalValue As String

Dim cell As Excel.Range 

For Each cell In sourceRange.Cells 
    finalValue = finalValue + "," + CStr(cell.Value) 
Next cell 

ConcatinateAllCellValuesInRange = Right(finalValue, Len(finalValue) - 1) 

Конечная функция

Однако теперь трюк все еще идентифицирует диапазон ввода для этой функции, т.е. при изменении номера детали.

ответ

0

Возможным решением было бы создать коллекцию, которая использует элемент как ключ и имеет значения Used-On в качестве значения, поэтому при первом вступлении Части добавляется пара KeyValue, а затем в непрерывном цикле, если ключ уже существует в коллекции, принимает значение ключа и один из коллекции, объединяет их вместе, удаляет текущую пару KeyValue и добавляет новую (вы не можете изменить пару KeyValue коллекции, поэтому удалите старый и добавить новый).

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

Позвольте мне знать, если вам нужна помощь с этим


EDIT

Вот пример метода я описал, хотя я использовал словарь вместо коллекции, потому что он имеет больше функциональных возможностей (необходима ссылка на "Microsoft Scripting Runtime"):

Option Explicit 

Sub combineStuff() 

    'Create Dictionary 
    Dim tmpDic As New Dictionary 

    'tempstring to preserve the value of a key 
    Dim tmpValue As String 


    Dim i As Integer 

    'Loop through rows - change this to your needs 
    For i = 1 To 15 Step 1 

     'Simple check if "Part" and "Used-On" are both filled 
     If Cells(i, 1).Value <> "" And Cells(i, 2).Value <> "" Then 

      'Check if the Key already exists 
      If tmpDic.Exists(CStr(Cells(i, 1).Value)) Then 

       'If it does, save it's value 
       tmpValue = tmpDic.Item(CStr(Cells(i, 1).Value)) 

       'Delete the Key Value pair 
       tmpDic.Remove CStr(Cells(i, 1).Value) 

       'Add Key Value pair with updated Value 
       tmpDic.Add CStr(Cells(i, 1).Value), tmpValue & "," & CStr(Cells(i, 2).Value) 
      Else 

       'Key does not exist yet, add it 
       tmpDic.Add CStr(Cells(i, 1).Value), Cells(i, 2).Value 
      End If 
     End If 
    Next i 

    Dim tmpKey As Variant 
    i = 1 

    'Loop through all items in the Dictionary 
    For Each tmpKey In tmpDic 

     'Insert Key 
     Cells(i, 4).Value = tmpKey 

     'Insert Value 
     Cells(i, 5).Value = tmpDic(tmpKey) 
     i = i + 1 
    Next tmpKey 

End Sub 

Обратите внимание, что словарь будет не сортировать! Ключ, который был изменен последним, является последним в списке. Если вы хотите, чтобы результат был отсортирован, было бы лучше использовать многомерный массив для хранения пар ключей и значений. Тогда вы можете легко отсортировать их.

+0

Кажется, что это определенно сработает - к сожалению, я не так практиковал с VBA, как хотелось бы, и я не уверен, как я это сделаю. Я определенно буду благодарен за помощь! – madacho

+0

обновленный ответ. – gizlmo

+0

Как вы относитесь к ссылке на исполняемый файл Microsoft Scripting [email protected] – madacho

Смежные вопросы