2016-03-27 2 views
-2

Как и в названии, мне нужен какой-то макрос или скрипт vba или что-то, что использует microsoft excel для создания ряда дополнительных строк под основным в Excel, число основано на значении из ячеек в первом столбце. Лист выглядит Сорт, как это:Как сгенерировать дополнительные строки под основными в Excel на основе значений из ячеек в первом столбце

Value1  Description1 Email1 Name1 etc 
    Value2  Description2 Email2 Name2 etc 
    ....      
    Value N 

Под каждую строку мне нужно, чтобы генерировать новые строки на основе значений из первой ячейки и автополные оставшейся строку с информацией из основных. Значения, следующие в одном столбце, следуют одному из следующих правил:
1. Там могут быть пустые ячейки, и в этом случае ничего не происходит.
2. Может быть один 10-значный номер, и в этом случае ничего не происходит.
3. Может быть более 10 цифр цифр, разделенных запятыми, которые затем должны быть извлечены в разных строках.
4. Может быть что-то вроде «1234567890 - 1234567893», и в этом случае мне нужно будет сгенерировать 4 новые строки, начиная со значений, заканчивающихся на 0,1,2,3.
5. Может быть диапазон от 4), а затем новый номер, разделенный запятыми, например: «value-value, value» (еще 10 цифр числа кстати).
6. И, наконец, 2 диапазона значений, например «value-value, value-value».

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

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

Заключительный пример:

1000000000 - 1000000003       Text1 [email protected] Joe   
1000000000          Text1 [email protected] Joe  
1000000001          Text1 [email protected] Joe   
1000000002          Text1 [email protected] Joe  
1000000003          Text1 [email protected] Joe   
2000000000, 2000000002       Text2 [email protected] Bob   
2000000000          Text2 [email protected] Bob     
2000000002          Text2 [email protected] Bob 
3000000000- 3000000002, 3000000005- 3000000007 Text3 [email protected] John 
3000000000          Text3 [email protected] John     
3000000001          Text3 [email protected] John 
3000000002          Text3 [email protected] John 
3000000005          Text3 [email protected] John 
3000000006          Text3 [email protected] John 
3000000007          Text3 [email protected] John 
+1

Nice спецификация программного обеспечения. Что вы можете показать с точки зрения первоначальных усилий по решению проблемы? – Jeeped

ответ

1

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

Сохраните оставшуюся часть значений в варианте массива, который будет использоваться для заполнения повторяющихся значений для каждой новой строки.

Module1 (Code)

Option Explicit 

Sub insertRows() 
    Dim rw As Long, i As Long, j As Long 
    Dim vals As Variant, vtmp As Variant, vtmp2 As Variant 

    With Worksheets("Sheet1") 
     For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 
      If CBool(InStr(1, .Cells(rw, 1).Value2, Chr(44))) Or _ 
       CBool(InStr(1, .Cells(rw, 1).Value2, Chr(45))) Then 
       vals = .Cells(rw, 1).Resize(1, 4).Value2 
       vtmp = Split(Replace(vals(1, 1), Chr(32), vbNullString), Chr(44)) 
       For i = UBound(vtmp) To LBound(vtmp) Step -1 
        vtmp2 = Split(vtmp(i), Chr(45)) 
        For j = Int(Right(vtmp2(UBound(vtmp2)), 1)) To Int(Right(vtmp2(LBound(vtmp2)), 1)) Step -1 
         .Cells(rw + 1, 1).EntireRow.Insert 
         .Cells(rw + 1, 1).Resize(1, 4) = vals 
         .Cells(rw + 1, 1) = Int(Left(vtmp2(UBound(vtmp2)), 9) & j) 
         With .Cells(rw + 1, 1).Resize(1, 4).Interior 
          .Pattern = xlSolid 
          .PatternColorIndex = xlAutomatic 
          .ThemeColor = xlThemeColorAccent6 
          .TintAndShade = 0.799981688894314 
          .PatternTintAndShade = 0 
         End With 
        Next j 
       Next i 
       'optionally delete the original row 
       '.Rows(rw).EntireRow.Delete 
      End If 
     Next rw 
    End With 

End Sub 

Я оставил немного комментировал код в случае, если вы хотели, чтобы удалить оригинальную строку.


insertRows_10_digits
Выборочные данные перед тем InsertRows()

insertRows_10_digits_after
Выборочные данные после InsertRows()

+0

Большое вам спасибо, вы за работой! – Fahrenhate

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