2017-10-11 13 views
3

私は2つのスプレッドシートをマージするExcelマクロで作業しています - 企業のリストとそれらの企業に関連する電子メールのリスト。ある企業に複数の電子メールが関連付けられている場合、その電子メール用に別の行を作成する必要があります。Excel VBAマクロで新しい行を作成する(私は間違って何をしていますか)

マクロの最後に向かってコードRows(row).Resize(1).Insertで新しい行を作成しようとするまで、すべて正常に進みます。この行になると、Excelは各行の最初の列広告を無限に複製します(列XEIまで)。

私のコードを変更して、100万の列ではなく新しい行を作成するにはどうしたらいいですか?次のように私のコードは次のとおりです。

Sub Commandbutton1() 


ThisWorkbook.Sheets("company").Activate 


Sheet2.Range("A1:A10000").Select 

Selection.Copy 


ThisWorkbook.Sheets("Sheet1").Activate 


Sheet1.Range("A1:A10000").Value = Sheet2.Range("A1:A10000").Value 

Sheet1.Range("B1").Value = "First Name" 

Sheet1.Range("C1").Value = "Last Name" 

Sheet1.Range("D1").Value = "Email" 




Dim i As Integer 


i = 1 


Do While i <= 100 

Dim companyName As String 
companyName = Cells(i, 1).Value 
firstname = Cells(i, 2).Value 
lastname = Cells(i, 3).Value 

'Query contacts list 
'Find all rows containing companyName 
'Find the email in those rows 
'Add the email to row i 

Dim slot As Integer 

slot_email = 4 


Dim result As String 
Dim sheet As Worksheet 
Set sheet = ActiveWorkbook.Sheets("contact") 


Dim isFirstInstance As Integer 

isFirstInstance = 0 

Dim j As Integer 

For j = 1 To sheet.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 



    Dim k As Integer 
    For k = 1 To 39 
     Dim cellVal As String 
     cellVal = ActiveWorkbook.Worksheets("contact").Cells(j, k).Value 
      If cellVal = "" Then 
      Exit For 
     ElseIf cellVal = companyName Then 
      Debug.Print ("For company " & companyName & ", found value on row " & j & " col " & k) 
      Cells(i, 4).Value = ActiveWorkbook.Worksheets("contact").Cells(j, 4).Value 
      Cells(i, 2).Value = ActiveWorkbook.Worksheets("contact").Cells(j, 2).Value 
      Cells(i, 3).Value = ActiveWorkbook.Worksheets("contact").Cells(j, 3).Value 

      isFirstInstance = isFirstInstance + 1 
       Debug.Print (isFirstInstance & " on column " & k) 

      If isFirstInstance > 1 Then 
       Debug.Print ("Found a duplicate contact!") 

       Dim row As String 
       row = i 

       Rows(row).Resize(1).Insert 

       i = i + 1 
      End If 

     End If 
    Next k 
Next j 

i = i + 1 


Loop 



End Sub 
+0

は、それが意図したとおりに働いていた(それは行番号SOME_CONSTANTに新しい行を挿入し)、任意の列を挿入しませんでした。 この行を別の行に置き換えて(またはコメントアウトして)、何が起こるかを見てください。とにかくこれらの行を挿入する必要があるのはなぜですか? –

+0

こんにちはMaciej、私は同じ会社で働いているかもしれない別の連絡先を反映するために行が必要です。この場合、会社名は別のメールアドレスで次の行に複製されます。 – alpacapaca

+0

しかし、コード内のこれらの追加行には決してアクセスしません。 'isFirstInstance> 1 'のセルをハイライトすることができます。その色を変更することで、行を挿入する必要がなくなります。 –

答えて

2

私は行(行)が.Resize(1).Insertあなたは、データの新しい行を挿入するために(全体ではなく、行の下にあなたの単一の列をシフトするために起こっていると考えています)。私はあなたが使用したいと思う:

+0

ありがとうございます! CutCopyModeは私のバグの原因でした。今それは素晴らしい仕事です! – alpacapaca

0
Sub InsertRowAtSecondLine() 
    Dim rowOfInterest As Long 
    rowOfInterest = 2 
    Cells(rowOfInterest, 1).EntireRow.Insert 
End Sub 

変換されます、それはあなたの前にコピーしたデータを挿入しようとしないように、例えば行(5).EntireRow.InsertともApplication.CutCopyModeが= Falseを使用

私は `行(SOME_CONSTANT).Resize(1).Insert`をしようとしたとき

a 
<blank row> 
b 
c 
d 
から
a 
b 
c 
d 

関連する問題