2016-01-07 2 views
1

Как я могу сгенерировать Excel, как на изображении ниже, через макрос? Коротко я хотел бы сделать:Найти значения в диапазоне и распечатать в столбце

  • цифры между a1 и b1 print to d column;
  • номера между столбцами a2 и b2 print to e;
  • номера между символами a3 и b3 для f.

Столбцы A и B имеют тысячи значений.

excel rows mahmut

+0

Вы ищете ответ VBA? Может быть решение формулы. Быстро: если вы скопируете столбец A, а затем вставьте (транспонируете) в D, вы получите список ... тогда в D2 вы можете сделать '= IF (AND (D1 <>" ", D1 <> $ B $ 1), D1 + 1, "") '... единственное, что я не знаю, как заставить это перетащить и правильно обновить, какую строку/столбец посмотреть. – BruceWayne

+0

Для следующего цикла для значения i = range ("a1"). Value to range ("b1"). Для номера строки вам понадобится счетчик. –

+3

Я провел несколько тестов на более чем 10 000 строк. Рейтинг в скорости от самого быстрого до самого медленного, 1. tigeravatar, 2.Mine (ScottCraner), 3.Jeeped, 4.Manu, 5, BruceWayne. Фактические результаты могут незначительно отличаться. –

ответ

2

только потому, что я люблю головоломки:

Sub u5758() 
Dim x As Long 
Dim i As Long 
Dim oArr() As Variant 
Dim arr() As Long 
Dim rng As Range 
Dim ws As Worksheet 
Application.ScreenUpdating = False 
Set ws = ActiveSheet 

x = 4 
With ws 
oArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp)).value 
    For j = LBound(oArr, 1) To UBound(oArr, 1) 
     ReDim arr(oArr(j, 1) To oArr(j, 2)) 
     For i = LBound(arr) To UBound(arr) 
      arr(i) = i 
     Next i 
     .Cells(1, x).Resize(UBound(arr) - LBound(arr) + 1).value = Application.Transpose(arr) 
     x = x + 1 
    Next j 
End With 
Application.ScreenUpdating = True 

End Sub 

enter image description here

+1

Я очень ценю вашу помощь. Это действительно помогает. Огромное спасибо. Ты невероятный человек Скотт. – mahmutziya

2

Вы могли бы использовать это:

Sub test() 

Dim Lastrow As Long 
Dim j As Double, i As Double, r As Double 
Dim wb As Workbook 
Dim ws As Worksheet 

Set wb = ThisWorkbook 
Set ws = wb.Sheets("Sheet1") ' Change the name of your sheet 

Lastrow = ws.Range("A" & Rows.Count).End(xlUp).Row 

j = 4 ' Column D 

With ws 

For i = 1 To Lastrow ' Start the loop at A1 until the last row in column A 

    .Cells(1, j) = .Cells(i, 1).Value 

r = 1 

    Do 
     .Cells(r + 1, j) = .Cells(r, j) + 1 
     r = r + 1 

    Loop Until .Cells(r, j) = .Cells(i, 2).Value 

    j = j + 1 

Next i 

End With 

End Sub 
+1

Если вы назначили 'Lastrow' последней строкой в ​​столбце A на Sheet1, вам действительно не следует полагаться на свойство [ActiveSheet] (https://msdn.microsoft.com/en-us/library/office/ff822753 .aspx? f = 255 & MSPPError = -2147217396) для всех ссылок на ячейки. Быстрый [С ... End With statement] (https://msdn.microsoft.com/en-us/library/wc500chb.aspx), чтобы обернуть большую часть кода, позаботится об этом. – Jeeped

+2

Теперь вам нужно поставить '.' перед всеми вашими ячейками (...'; '.Cells (1, j) = .Cells (i, 1) .Value' –

+0

Спасибо Jeeped и Scott Craner I действительно ценю ваш совет! – manu

2

Я тоже люблю головоломки.

Sub from_here_to_there() 
    Dim rw As Long 
    With Worksheets("Sheet5") '<~~ set this worksheet properly! 
     For rw = 1 To .Cells(Rows.Count, 1).End(xlUp).Row 
      If IsNumeric(.Cells(rw, 1)) And IsNumeric(.Cells(rw, 2)) Then 
       With .Columns(Application.Max(4, .Cells(1, Columns.Count).End(xlToLeft).Column + 1)) 
        .Cells(1, 1) = .Parent.Cells(rw, 1).Value2 
        .DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ 
         Step:=1, Stop:=.Parent.Cells(rw, 2).Value2 
       End With 
      End If 
     Next rw 
    End With 
End Sub 

number_series

+1

Я очень ценю вашу помощь. Это очень помогает. Большое вам спасибо. Вы тоже increadibe. – mahmutziya

3

В качестве альтернативы, вот формула решения:

=IF(ROW(D1)>INDEX($A:$B,COLUMN(D1)-COLUMN($C1),2)-INDEX($A:$B,COLUMN(D1)-COLUMN($C1),1)+1,"",INDEX($A:$B,COLUMN(D1)-COLUMN($C1),1)+ROW(D1)-1) 

Хотя я понимаю, что формула решения не может быть осуществимо на основе этого заявления:

Столбцы A и B имеют тысячи значений.

EDIT: Чистый массив VBA решение:

Sub tgr() 

    Dim ws As Worksheet 
    Dim rData As Range 
    Dim aData As Variant 
    Dim aResults() As Variant 
    Dim lMaxDiff As Long 
    Dim i As Long, j As Long 
    Dim rIndex As Long, cIndex As Long 

    Set ws = ActiveWorkbook.ActiveSheet 
    Set rData = ws.Range("A1", ws.Cells(Rows.Count, "B").End(xlUp)) 

    lMaxDiff = Evaluate("MAX(" & rData.Columns(2).Address(external:=True) & "-" & rData.Columns(1).Address(external:=True) & ")") + 1 
    aData = rData.Value2 
    ReDim aResults(1 To lMaxDiff, 1 To rData.Rows.Count) 

    For i = LBound(aData, 1) To UBound(aData, 1) 
     If IsNumeric(aData(i, 1)) And IsNumeric(aData(i, 2)) Then 
      rIndex = 0 
      cIndex = cIndex + 1 
      For j = Int(aData(i, 1)) To Int(aData(i, 2)) 
       rIndex = rIndex + 1 
       aResults(rIndex, cIndex) = j 
      Next j 
     End If 
    Next i 

    ws.Range("D1").Resize(UBound(aResults, 1), UBound(aResults, 2)).Value = aResults 

End Sub 
+0

Большое спасибо, мой друг. – mahmutziya

+1

Woww.It очень быстро. – mahmutziya

1

Вот еще один быстрый один раз для удовольствия:

Sub transposeNfill() 
Dim lastRow&, i&, xStart$, xEnd$, xMid$ 

lastRow = Cells(Rows.Count, 1).End(xlUp).Row 

For i = 1 To lastRow 
    xStart = Cells(i, 1) 
    xEnd = Cells(i, 2) 
    xMid = xEnd - xStart 
    Cells(1, i + 3).Value = xStart 
    Cells(1 + xMid, i + 3) = xEnd 
    Range(Cells(2, i + 3), Cells(xMid, i + 3)).FormulaR1C1 = "=r[-1]c+1" 
    Cells.Copy 
    Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Application.CutCopyMode = False 

Next i 

End Sub 
+0

замечательно. Большое вам спасибо. Возможно ли, что все результаты в одной колонке? – mahmutziya

+1

@ user5758125 - Это будет считаться корректировкой исходного вопроса, который отменяет все предыдущие действительные и, как правило, недовольны. Если у вас есть новый вопрос, задайте новый вопрос. – Jeeped

+0

@ user5758125 Просто FYI, и ничего не повторится t Брюс, но это был самый медленный в 1000 раз. Тигараватар занял менее 5 секунд, чтобы проанализировать более 10 000 строк. Я остановил это через 4 минуты, и он сделал только 390 строк. –

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