简体   繁体   中英

Copy paste specific cell values from one work sheet to another based on a specific criteria

Its been a while since I have done any sort of coding, so I am very rusty. I am trying to write some VBA code, so that when a button is clicked in the excel sheet it will check another sheet in the same workbook and copy of specific cell values. This is based on a criteria in one of the columns (column 15, I counted); I should probably add that the data is in a table. if that row meets the specified criteria from column 15, then specific columns are copied over to the worksheet with the button.

I do have some code, but I know there is a lot missing from it.

Would appreciate some input, am I on the right track? can anyone help on there I can get more info and tips on the coding I need to use. Not sure if there is an easy way to do this using tables?

Private Sub CommandButton1_Click()

''This will count how many rows are populated in the table''
a = Worksheets("Billable").Cells(Rows.Count, 1).End(xlUp).Row

''Loop will run from row 6 to the last row (Row 6 is the first row in table)''
For i = 6 To a
    ''If statement which will check the status column for Detailed Estimate Submitted > column 15''
    If Worksheets("Billable").Cells(i, 15).Value = "Detailed Estimate Submitted" Then
      Worksheets("Billable").Rows(i).Copy
      Worksheets("PM_Forecast").Activate
      b = Worksheets("PM_Forecast").Cells(Rows.Count, 1).End(xlUp).Row
      Worksheets("PM_Forecast").Cells(a + 1, 1).Select
      ActiveSheet.Paste
    End If
Next

Application.CutCopyMode = False

End Sub

An example of the table: - I only need to copy over 3 of the columns if they meet a specific criteria in the status column

表格标题

I cant comment so I will ask the question through this answer:

Your variable b is currently not being used, I think it was meant to be in this line: Worksheets("PM_Forecast").Cells(b + 1, 1).Select but you have written a instead of b.

Does this solve your current issue?

You did not answer my question regarding the format pasting...

So, please, test the next code which pastes on a classical way. But without selecting and declaring all used variables:

Private Sub CommandButton1_Click()
 Dim shB As Worksheet, shPM As Worksheet, lastRowB As Long, lastRowPM As Long
 Dim i As Long, lastCol As Long

 Set shB = Worksheets("Billable")
 Set shPM = Worksheets("PM_Forecast")

 lastRowB = Worksheets("Billable").Cells(Rows.Count, 1).End(xlUp).row

 'Loop will run from row 6 to the last row (Row 6 is the first row in table)''
 For i = 6 To lastRowB
    If shB.Cells(i, 15).Value = "Detailed Estimate Submitted" Then
        lastCol = shB.Cells(i, Columns.Count).End(xlToLeft).Column
        lastRowPM = shPM.Cells(Rows.Count, 1).End(xlUp).row
        shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Copy _
                                   shPM.Cells(lastRowPM + 1, 1)
    End If
 Next
 Application.CutCopyMode = False
End Sub

For array using variant you must only declare a new variable Dim arr As Variant and replace this part:

shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Copy _
                                   shPM.Cells(lastRowPM + 1, 1)

with this one:

arr = shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Value
shPM.Cells(lastRowPM + 1, 1).Resize(, UBound(arr, 2)).Value = arr

Then, delete the code line Application.CutCopyMode = False . It is not necessary, anymore, since the Clipboard memory is not used...

And use Option Explicit on top of your module. It will save you many times, when the code will become complex.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM