2017-10-12 111 views
0

下圖顯示了我擁有的Excel列表。列A-C是我擁有的內容。列D和E是我正在尋找的結果。我已經手動輸入它來顯示結果。Excel列表VBA連接

Excel list

目前我的代碼看起來是這樣的:

Option Explicit 

Sub New_SKU() 

Dim wb As Workbook 
Dim ws As Worksheet 

'figure out how far down data goes 
Dim endrow As Long 
Dim currentrow As Long 
Dim basename 

Set wb = ThisWorkbook 
Set ws = wb.Sheets("Blad1") 

With ws 
    endrow = .Cells(.Rows.Count, "A").End(xlUp).Row 

    'always start in the correct column 
    .Cells(.Cells(1, "B").End(xlDown).Row, "B").Activate 

    'loop through all data 
    Do While ActiveCell.Row < endrow 

     'loop through empty cells and set formula if cell isn't empty 
     Do While ActiveCell.Row <= endrow 

      'if next cell isn't empty, isn't past the end of the list, go to outer loop 
      If ActiveCell.Formula <> "" And ActiveCell.Offset(1, 0).Formula = "" And ActiveCell.Row <= endrow Then 

       basename = Selection.Address 

       ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
       ActiveCell.Offset(1, 0).Activate 

'   If ActiveCell.Formula = "" And ActiveCell.Offset(0, 1).Formula <> "" And ActiveCell.Row <= endrow Then 
'    ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
'    ActiveCell.Offset(1, 0).Activate 

'   If ActiveCell.Formula = "" And ActiveCell.Offset(0, 1).Formula <> "" And ActiveCell.Row <= endrow Then 
'    ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
'    ActiveCell.Offset(1, 0).Activate 

'   If ActiveCell.Formula = "" And ActiveCell.Offset(0, 1).Formula <> "" And ActiveCell.Row <= endrow Then 
'    ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
'    ActiveCell.Offset(1, 0).Activate 

'   If ActiveCell.Formula = "" And ActiveCell.Offset(0, 1).Formula <> "" And ActiveCell.Row <= endrow Then 
'    ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
'    ActiveCell.Offset(1, 0).Activate 

'   If ActiveCell.Formula = "" And ActiveCell.Offset(0, 1).Formula <> "" And ActiveCell.Row <= endrow Then 
'    ActiveCell.Offset(0, 2).Formula = "=CONCATENATE(" & basename & ",""-""," & "C" & Selection.Row & ")" 
'    ActiveCell.Offset(0, 3).Formula = "=" & basename & "" 
'    ActiveCell.Offset(1, 0).Activate 

      Else 
       Exit Do 
      End If 
'   End If 
'   End If 
'   End If 
'   End If 
'   End If 
     Loop 
    Loop 

End With 

End Sub 

我從我得到的幫助與先前類似的問題重用代碼。

我的第一個問題:

如果取消對if語句,當我啓動腳本的Excel一片空白(白)和攤位立刻。

以當前狀態運行腳本(If-satements已註釋掉),我可以看到我在單元格D2中獲得了正確的結果,然後選中了單元格B3(請注意,列D中沒有結果或E),然後屏幕變空白並且Excel停止。我在E欄中沒有得到任何結果。

由於尺寸(C列)有變化,它可以在2-3到5-6之間變化。

我不明白爲什麼我不會在E欄中收到結果,爲什麼它會停頓並變白。

任何想法?

+1

有點難以遵循,但我認爲更容易填補空白,然後使用拼接公式一路下來。你甚至不需要VBA。 – SJR

+0

只是爲了闡述,代碼有點難以遵循的一個原因,可能棘手的是你使用Select和Activate。儘可能避免,而這通常是。 – SJR

回答

0

按照上述評論,這裏是一個不同的方法

Sub x() 

Dim r As Long 

Columns(2).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=r[-1]c" 

For r = 2 To Range("A" & Rows.Count).End(xlUp).Row 
    Cells(r, 4).Value = Cells(r, 2).Value & "-" & Cells(r, 3).Value 
    Cells(r, 5).Value = Cells(r, 2).Value 
Next r 

Columns(2).SpecialCells(xlCellTypeFormulas).ClearContents 

End Sub 
0

如果沒有問題與非VBA的答案,你可以粘貼此公式D2抄下:

=IF(B2="",LEFT(D1,FIND("-",D1)-1)&"-"&C2,B2&"-"&C2)