Excel VBA code to copy rows to relevant named sheets not working










0















I have found this code on this site from a previously answered question from two years ago.
The code looks at the rows of data on a Master Sheet and copies the relevant rows based on column D (Project) to the named sheet.



If a named sheet does not exist, a comment box is added to Column D, stating that the sheet name does not exist.



The code also looks at Column A (Invoice) and uses this a a unique ID so duplicate rows are not copied to the named sheets.



I amended the code to suit my needs (sheet titles, etc) but when I run the code, the relevant row is NOT copied to the named sheet but to the next sheet to the right.



I can't work out what is wrong with the code. Hoping someone can help!!!



Column A Column B Column C Column D
Invoice Date Amount Project
I18-1234 1/10/2018 $125.00 Project 1
I18-5678 10/10/2018 $1,500.00 Project 2
I18-2468 20/10/2018 $10,000.00 Project 1
I18-7931 15/10/2018 $300.00 Project 3
I18-1010 24/10/2018 $1,000.00 Project 1


I have a main sheet named "Master Sheet". This is where all data is entered.



Currently, I have another sheet named "Project 1".



The other sheets I have are named "Sheet2" and "Sheet3". (This is just while I test the code).



Sub Test()

Dim cell As Range
Dim cmt As Comment
Dim bolFound As Boolean
Dim sheetNames() As String
Dim lngItem As Long, lngLastRow As Long
Dim sht As Worksheet, shtMaster As Worksheet
Dim MatchRow As Variant

'Set master sheet
Set shtMaster = ThisWorkbook.Worksheets("Master Data")

'Get the names for all other sheets
ReDim sheetNames(0)
For Each sht In ThisWorkbook.Worksheets
If sht.Name <> shtMaster.Name Then
sheetNames(UBound(sheetNames)) = sht.Name
ReDim Preserve sheetNames(UBound(sheetNames) + 1)
End If
Next sht
ReDim Preserve sheetNames(UBound(sheetNames) - 1)

For Each cell In shtMaster.Range("D2:D" & shtMaster.Cells(shtMaster.Rows.Count, "D").End(xlUp).Row)
bolFound = False

' instead of looping through the array of sheets >> use Application.Match
If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
bolFound = True
Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))

' now use a 2nd Match, to find matches in Unique column "A"
MatchRow = Application.Match(cell.Offset(, -3).Value, sht.Range("A:A"), 0)
If Not IsError(MatchRow) Then
shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(MatchRow, 1)

Else '<-- no match in sheet, add the record at the end
On Error GoTo SetFirst
lngLastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
On Error GoTo 0
shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(lngLastRow, 1)
End If

End If

If bolFound = False Then
For Each cmt In shtMaster.Comments
If cmt.Parent.Address = cell.Address Then cmt.Delete
Next cmt
cell.AddComment "no sheet found for this row"
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
End If

Set sht = Nothing
Next
Exit Sub

SetFirst:
lngLastRow = 1
Resume Next

End Sub









share|improve this question


























    0















    I have found this code on this site from a previously answered question from two years ago.
    The code looks at the rows of data on a Master Sheet and copies the relevant rows based on column D (Project) to the named sheet.



    If a named sheet does not exist, a comment box is added to Column D, stating that the sheet name does not exist.



    The code also looks at Column A (Invoice) and uses this a a unique ID so duplicate rows are not copied to the named sheets.



    I amended the code to suit my needs (sheet titles, etc) but when I run the code, the relevant row is NOT copied to the named sheet but to the next sheet to the right.



    I can't work out what is wrong with the code. Hoping someone can help!!!



    Column A Column B Column C Column D
    Invoice Date Amount Project
    I18-1234 1/10/2018 $125.00 Project 1
    I18-5678 10/10/2018 $1,500.00 Project 2
    I18-2468 20/10/2018 $10,000.00 Project 1
    I18-7931 15/10/2018 $300.00 Project 3
    I18-1010 24/10/2018 $1,000.00 Project 1


    I have a main sheet named "Master Sheet". This is where all data is entered.



    Currently, I have another sheet named "Project 1".



    The other sheets I have are named "Sheet2" and "Sheet3". (This is just while I test the code).



    Sub Test()

    Dim cell As Range
    Dim cmt As Comment
    Dim bolFound As Boolean
    Dim sheetNames() As String
    Dim lngItem As Long, lngLastRow As Long
    Dim sht As Worksheet, shtMaster As Worksheet
    Dim MatchRow As Variant

    'Set master sheet
    Set shtMaster = ThisWorkbook.Worksheets("Master Data")

    'Get the names for all other sheets
    ReDim sheetNames(0)
    For Each sht In ThisWorkbook.Worksheets
    If sht.Name <> shtMaster.Name Then
    sheetNames(UBound(sheetNames)) = sht.Name
    ReDim Preserve sheetNames(UBound(sheetNames) + 1)
    End If
    Next sht
    ReDim Preserve sheetNames(UBound(sheetNames) - 1)

    For Each cell In shtMaster.Range("D2:D" & shtMaster.Cells(shtMaster.Rows.Count, "D").End(xlUp).Row)
    bolFound = False

    ' instead of looping through the array of sheets >> use Application.Match
    If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
    bolFound = True
    Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))

    ' now use a 2nd Match, to find matches in Unique column "A"
    MatchRow = Application.Match(cell.Offset(, -3).Value, sht.Range("A:A"), 0)
    If Not IsError(MatchRow) Then
    shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(MatchRow, 1)

    Else '<-- no match in sheet, add the record at the end
    On Error GoTo SetFirst
    lngLastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
    On Error GoTo 0
    shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(lngLastRow, 1)
    End If

    End If

    If bolFound = False Then
    For Each cmt In shtMaster.Comments
    If cmt.Parent.Address = cell.Address Then cmt.Delete
    Next cmt
    cell.AddComment "no sheet found for this row"
    ActiveSheet.EnableCalculation = False
    ActiveSheet.EnableCalculation = True
    End If

    Set sht = Nothing
    Next
    Exit Sub

    SetFirst:
    lngLastRow = 1
    Resume Next

    End Sub









    share|improve this question
























      0












      0








      0








      I have found this code on this site from a previously answered question from two years ago.
      The code looks at the rows of data on a Master Sheet and copies the relevant rows based on column D (Project) to the named sheet.



      If a named sheet does not exist, a comment box is added to Column D, stating that the sheet name does not exist.



      The code also looks at Column A (Invoice) and uses this a a unique ID so duplicate rows are not copied to the named sheets.



      I amended the code to suit my needs (sheet titles, etc) but when I run the code, the relevant row is NOT copied to the named sheet but to the next sheet to the right.



      I can't work out what is wrong with the code. Hoping someone can help!!!



      Column A Column B Column C Column D
      Invoice Date Amount Project
      I18-1234 1/10/2018 $125.00 Project 1
      I18-5678 10/10/2018 $1,500.00 Project 2
      I18-2468 20/10/2018 $10,000.00 Project 1
      I18-7931 15/10/2018 $300.00 Project 3
      I18-1010 24/10/2018 $1,000.00 Project 1


      I have a main sheet named "Master Sheet". This is where all data is entered.



      Currently, I have another sheet named "Project 1".



      The other sheets I have are named "Sheet2" and "Sheet3". (This is just while I test the code).



      Sub Test()

      Dim cell As Range
      Dim cmt As Comment
      Dim bolFound As Boolean
      Dim sheetNames() As String
      Dim lngItem As Long, lngLastRow As Long
      Dim sht As Worksheet, shtMaster As Worksheet
      Dim MatchRow As Variant

      'Set master sheet
      Set shtMaster = ThisWorkbook.Worksheets("Master Data")

      'Get the names for all other sheets
      ReDim sheetNames(0)
      For Each sht In ThisWorkbook.Worksheets
      If sht.Name <> shtMaster.Name Then
      sheetNames(UBound(sheetNames)) = sht.Name
      ReDim Preserve sheetNames(UBound(sheetNames) + 1)
      End If
      Next sht
      ReDim Preserve sheetNames(UBound(sheetNames) - 1)

      For Each cell In shtMaster.Range("D2:D" & shtMaster.Cells(shtMaster.Rows.Count, "D").End(xlUp).Row)
      bolFound = False

      ' instead of looping through the array of sheets >> use Application.Match
      If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
      bolFound = True
      Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))

      ' now use a 2nd Match, to find matches in Unique column "A"
      MatchRow = Application.Match(cell.Offset(, -3).Value, sht.Range("A:A"), 0)
      If Not IsError(MatchRow) Then
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(MatchRow, 1)

      Else '<-- no match in sheet, add the record at the end
      On Error GoTo SetFirst
      lngLastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
      On Error GoTo 0
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(lngLastRow, 1)
      End If

      End If

      If bolFound = False Then
      For Each cmt In shtMaster.Comments
      If cmt.Parent.Address = cell.Address Then cmt.Delete
      Next cmt
      cell.AddComment "no sheet found for this row"
      ActiveSheet.EnableCalculation = False
      ActiveSheet.EnableCalculation = True
      End If

      Set sht = Nothing
      Next
      Exit Sub

      SetFirst:
      lngLastRow = 1
      Resume Next

      End Sub









      share|improve this question














      I have found this code on this site from a previously answered question from two years ago.
      The code looks at the rows of data on a Master Sheet and copies the relevant rows based on column D (Project) to the named sheet.



      If a named sheet does not exist, a comment box is added to Column D, stating that the sheet name does not exist.



      The code also looks at Column A (Invoice) and uses this a a unique ID so duplicate rows are not copied to the named sheets.



      I amended the code to suit my needs (sheet titles, etc) but when I run the code, the relevant row is NOT copied to the named sheet but to the next sheet to the right.



      I can't work out what is wrong with the code. Hoping someone can help!!!



      Column A Column B Column C Column D
      Invoice Date Amount Project
      I18-1234 1/10/2018 $125.00 Project 1
      I18-5678 10/10/2018 $1,500.00 Project 2
      I18-2468 20/10/2018 $10,000.00 Project 1
      I18-7931 15/10/2018 $300.00 Project 3
      I18-1010 24/10/2018 $1,000.00 Project 1


      I have a main sheet named "Master Sheet". This is where all data is entered.



      Currently, I have another sheet named "Project 1".



      The other sheets I have are named "Sheet2" and "Sheet3". (This is just while I test the code).



      Sub Test()

      Dim cell As Range
      Dim cmt As Comment
      Dim bolFound As Boolean
      Dim sheetNames() As String
      Dim lngItem As Long, lngLastRow As Long
      Dim sht As Worksheet, shtMaster As Worksheet
      Dim MatchRow As Variant

      'Set master sheet
      Set shtMaster = ThisWorkbook.Worksheets("Master Data")

      'Get the names for all other sheets
      ReDim sheetNames(0)
      For Each sht In ThisWorkbook.Worksheets
      If sht.Name <> shtMaster.Name Then
      sheetNames(UBound(sheetNames)) = sht.Name
      ReDim Preserve sheetNames(UBound(sheetNames) + 1)
      End If
      Next sht
      ReDim Preserve sheetNames(UBound(sheetNames) - 1)

      For Each cell In shtMaster.Range("D2:D" & shtMaster.Cells(shtMaster.Rows.Count, "D").End(xlUp).Row)
      bolFound = False

      ' instead of looping through the array of sheets >> use Application.Match
      If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
      bolFound = True
      Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))

      ' now use a 2nd Match, to find matches in Unique column "A"
      MatchRow = Application.Match(cell.Offset(, -3).Value, sht.Range("A:A"), 0)
      If Not IsError(MatchRow) Then
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(MatchRow, 1)

      Else '<-- no match in sheet, add the record at the end
      On Error GoTo SetFirst
      lngLastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
      On Error GoTo 0
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(lngLastRow, 1)
      End If

      End If

      If bolFound = False Then
      For Each cmt In shtMaster.Comments
      If cmt.Parent.Address = cell.Address Then cmt.Delete
      Next cmt
      cell.AddComment "no sheet found for this row"
      ActiveSheet.EnableCalculation = False
      ActiveSheet.EnableCalculation = True
      End If

      Set sht = Nothing
      Next
      Exit Sub

      SetFirst:
      lngLastRow = 1
      Resume Next

      End Sub






      excel vba excel-vba






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 16 '18 at 7:30









      Scuba28Scuba28

      32




      32






















          1 Answer
          1






          active

          oldest

          votes


















          0














          change your part of the code :



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))


          to



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(cell.Value)





          share|improve this answer























          • Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

            – Scuba28
            Nov 17 '18 at 20:43












          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53333282%2fexcel-vba-code-to-copy-rows-to-relevant-named-sheets-not-working%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          change your part of the code :



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))


          to



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(cell.Value)





          share|improve this answer























          • Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

            – Scuba28
            Nov 17 '18 at 20:43
















          0














          change your part of the code :



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))


          to



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(cell.Value)





          share|improve this answer























          • Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

            – Scuba28
            Nov 17 '18 at 20:43














          0












          0








          0







          change your part of the code :



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))


          to



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(cell.Value)





          share|improve this answer













          change your part of the code :



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(sheetNames(Application.Match(cell.Value2, sheetNames, 0)))


          to



          ' instead of looping through the array of sheets >> use Application.Match
          If Not IsError(Application.Match(cell.Value2, sheetNames, 0)) Then
          bolFound = True
          Set sht = ThisWorkbook.Worksheets(cell.Value)






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 16 '18 at 9:59









          LambikLambik

          500513




          500513












          • Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

            – Scuba28
            Nov 17 '18 at 20:43


















          • Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

            – Scuba28
            Nov 17 '18 at 20:43

















          Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

          – Scuba28
          Nov 17 '18 at 20:43






          Thanks for your suggestion. Your code does copy the relevant data to the named sheet. The problem I found is if the data on the master sheet has been identified as having no named sheet and a comment flag is placed in column D, the next time your code runs with correctly named sheets, the comment flag also copies to the named sheet. Your code seems to skip the other part of my code where comments are deleted. I also have a macro run button on the master sheet and that is being copied to the named sheet also.

          – Scuba28
          Nov 17 '18 at 20:43




















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53333282%2fexcel-vba-code-to-copy-rows-to-relevant-named-sheets-not-working%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Top Tejano songwriter Luis Silva dead of heart attack at 64

          ReactJS Fetched API data displays live - need Data displayed static

          Evgeni Malkin