2015-07-22 2 views
0

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

Sub Extract_All_Data() 

'this macro assumes that your first row of data is a header row. 
'will copy all filtered rows from one worksheet, to another blank workbook 
'each unique filtered value will be copied to it's own sheet 

'Variables used by the macro 
Dim wbOrig, wbDest As Workbook 
Dim rngFilter As Range, rngUniques, rngUniques2 As Range 
Dim cell As Range, counter As Integer 
Dim xValue, OutValue As String 

' Prompt user to choose file and open it 
MsgBox "Please select the file that will be split." 
strFileToOpen = Application.GetOpenFilename(Title:="Please select the file that will be split.", FileFilter:="Excel Files *.xls* (*.xls*),") 

If strFileToOpen = "False" Then 
    MsgBox "No file selected.", vbExclamation, "Sorry!" 
    Exit Sub 
Else 
    Set wbOrig = Workbooks.Open(Filename:=strFileToOpen) 
End If 


Sheets("HTPN").Activate 

' Set the filter range (from A1 to the last used cell in column A) 
Set rngFilter = Range("A1", Range("A" & Rows.Count).End(xlUp)) 

Application.ScreenUpdating = False 

With rngFilter 

    ' Filter column A to show only one of each item (uniques) in column A 
    .AdvancedFilter Action:=xlFilterInPlace, Unique:=True 

    ' Set a variable to the Unique values (one for ClientID and one for Client Name) 
    Set rngUniques = Range("A2", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) 
    Set rngUniques2 = Range("B2", Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) 

    ' Clear the filter 
    ActiveSheet.ShowAllData 

End With 

' Create a new workbook with a sheet for each unique value 
Application.SheetsInNewWorkbook = rngUniques.Count 
Set wbDest = Workbooks.Add 
Application.SheetsInNewWorkbook = 3 

' Filter, Copy, and Paste each unique to its' own sheet in the new workbook 
For Each cell In rngUniques 

    counter = counter + 1 

    'NOTE - this filter is on column A (field:=1), to change 
    'to a different column you need to change the field number 
    rngFilter.AutoFilter field:=1, Criteria1:=cell.Value 

    ' Copy and paste the filtered data to it's unique sheet 
    rngFilter.Resize(, 30).SpecialCells(xlCellTypeVisible).Copy Destination:=wbDest.Sheets(counter).Range("A1") 

    ' Name the destination sheet 
    ' Strip Client name to extract the AU # 
    xValue = rngUniques2(counter, 1).Value 

    Debug.Print xValue 

    OutValue = "" 

    For xIndex = 1 To VBA.Len(xValue) 
     If (VBA.Mid(xValue, xIndex, 1) <> "-") Then 
       If VBA.IsNumeric(VBA.Mid(xValue, xIndex, 1)) Then 
        OutValue = OutValue & VBA.Mid(xValue, xIndex, 1) 
       End If 
     Else: Exit For 
     End If 
    Next 

    wbDest.Sheets(counter).Name = cell.Value & " - " & OutValue 
    wbDest.Sheets(counter).Cells.Columns.AutoFit 

Next cell 

rngFilter.Parent.AutoFilterMode = False 
Application.ScreenUpdating = True  

End Sub 

РЕДАКТИРОВАТЬ ОБЪЯСНЯТЬ

Образец данных:

A B

1 A

1 A

1 A

2 B

2 Б

3 С

3 С

3 С

3 С

4 D

4 D

4 D

Программа копирует все строки каждого уникального элемента в столбце A, чтобы разделить вкладки и попытаться правильно назвать вкладку. Это именование вкладки, которая вызывает у меня проблемы. Я пытаюсь получить название вкладки в следующем формате «значение - значение B», так что для приведенного выше примера, там будет четыре вкладки под названием:

1 -

2 - B

3 - с

4 - Д

rngUniques содержит уникальные значения из колонки а и rngUniques2 содержит соответствующие значения из столбца B. Я пытаюсь читать из обоих диапазонов в том же для каждого цикла, но не получает правильные данные в rngUni ques2. Например, когда я запустить макрос, это было бы назвать вкладки:

1 -

2 -

3 - B

4 - С

Небольшой размер выборки выше, похоже, что это только один элемент, но он уходит дальше, как он идет. Мои фактические данные создают 110 отдельных вкладок. Я предполагаю, что ошибка исходит из того, как я пытаюсь получить доступ к данным ниже.

xValue = rngUniques2(counter, 1).Value 

Как бы я продвигался по данным другого диапазона при использовании для каждой петли в другом диапазоне?

+0

Определите «не потянув правильное значение». Покажите, что вы ожидаете от значения, и что оно на самом деле появляется. –

+0

Допустим, что rngUniques2 представляет собой таблицу алфавита, то есть 26 ячеек с одной буквой каждый, а rngUniques - это список чисел от 1 до 26. В первый раз через цикл For он правильно вытащит «A» из rngUniques2. После этого он будет продвигаться через диапазон на другом шаге, чем rngUniques. Например, это будет примерно так: 1-A 2-A 3-B 4-C 5-C и т. Д. Вы можете видеть, как второй диапазон уходит от первого в цикле. – Jay

+0

До сих пор я мог использовать эту команду для работы, просто комбинируя столбцы A и B в столбец A. Макрос отлично работает, когда сам использует rngUniques. Однако в файле имеется 15000 строк, поэтому я знаю, что это не самый эффективный подход, тем более, что он должен выполнять манипуляции с строками для каждой строки. – Jay

ответ

0

я был способный к грубой силе, чтобы это работало для меня, просто объединив столбцы А и В в колонку А.

0

ОК, спасибо, последнее редактирование действительно помогает.

Заключительное разъяснение: Если текст в столбце A всегда, скажем, «2», это текст в столбце B всегда, скажем, «B»? Или бывают случаи, когда ColumnA может быть 2, но столбец B может быть «C»? Потому что для меня, я думаю, вы слишком сильно себя чувствуете, делая какие-либо проверки rnguniques2 вообще.

Предполагая, что столбец B одинаковый для каждого уникального столбца Значение, вы можете удалить все ссылки на rnguniques2, за исключением начального «set = column B», а затем при настройке имени листа просто перейдите «rnguniques (счетчик, 1) .value & "-" & rnguniques (счетчик, 2) .value»

Я не могу видеть пункт этого раздела кода здесь:

xValue = rngUniques2(counter, 1).Value 

Debug.Print xValue 

OutValue = "" 

For xIndex = 1 To VBA.Len(xValue) 
    If (VBA.Mid(xValue, xIndex, 1) <> "-") Then 
      If VBA.IsNumeric(VBA.Mid(xValue, xIndex, 1)) Then 
       OutValue = OutValue & VBA.Mid(xValue, xIndex, 1) 
      End If 
    Else: Exit For 
    End If 
Next 
+0

Столбец B всегда будет одинаковым для уникального значения в A. Причина для кода выше, потому что столбец B на самом деле является длинным названием компании, которое включает идентификационный номер. Код удаляет номер только потому, что на самом деле это то, что мне нужно, чтобы поместить имя вкладки. Вот почему мне нужно было работать с этим значением само по себе. Это также означает, что я не могу просто конкатенировать ценности, как вы предлагали. – Jay

+0

@Jay. Все эти детали, которые мне нужно было вытащить, были необходимы, чтобы ответить на ваш вопрос. Пожалуйста, повторно отредактируйте свой вопрос, чтобы включить образец ваших данных **, включая способ его форматирования в ваших исходных книгах **, а также все конкретные предположения и примечания, которые были размещены в виде комментариев на этом пути. –

+0

Спасибо за помощь. Тем не менее, я просто воспользуюсь обходным решением, о котором я говорил выше. Он немного неэффективен, но он выполняет свою работу. Мне нужно было сегодня работать, поэтому я доволен этим. – Jay

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