2017-10-12 8 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-columnで結果を受け取らないのか、なぜそれが失速して白くなるのか理解できません。

アイデア?上記のコメントを1として

+1

少しはそれに従うのは難しいですが、私は空白を埋めるのが簡単だと思って、ちょうど連結式を使っています。あなたはそれのためにVBAは必要ありません。 – SJR

+0

ちょっと詳しく説明すると、コードがちょっと難しく、使い易くするためにはSelectとActivateの使い方の1つの理由があります。可能であれば避けてください。これは通常です。 – SJR

答えて

0

は、ここでは異なるアプローチでは、非VBAの答えで大丈夫なら、あなたはD2でこの数式を貼り付けると、ダウンコピーすることができます

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

です:

=IF(B2="",LEFT(D1,FIND("-",D1)-1)&"-"&C2,B2&"-"&C2) 
関連する問題