Paul, I got sidetracked with another VB nightmare, but wanted to say It worked (and taught me something)!
THANK YOU! THANK YOU! On Jan 16, 10:08 am, Paul Schreiner <schreiner_p...@att.net> wrote: > Let me put on my "teacher" hat and see if I can help. > When you look in the VBA editor, in the Project Explorer, you see > you workbook listed as well as all the sheets and one sheet called > ThisWorkBook. > Now, the thing to recognize is that macros, (or subs) written in any > of these sheets (except for ThisworkBook) are normally available only > to the sheet. Not to other sheets, hence the keyword "Private Sub". > > Subs written in ThisWorkBook or in a Module are normally available to > all sheets. > > As in your example, the "click" event is only available to the sheet with > the button, which makes sense, why would you want to execute a click event > for a button you can't see... > > Now, the reason your macro only works if you have cell C39 selected is > because you TOLD it to when you said: > "Application"(excel)".ActiveCell"(the currently selected cell) > you could change "Activecell" to "Cells(39,3)" (row 39, column 3) > or even Range("C39") and it wouldn't care what cell you have selected. > > When you record a macro, Excel records that you changed sheets, but cannot > anticipate what you're going to do when you get there, so it records each > step. > Since you DO know what you were intending to do, you can combine steps. > For instance: > Worksheets("Sheet1").Activate > Range("A1:M7").Select > Selection.Copy > can be reduced to: > Worksheets("Sheet1").Range("A1:M7").Copy > > Now, the Paste method is a little screwy. > Even if you say: > Worksheets("Performance Attribute Weights").Paste Destination:=Range("A7:M13") > It will paste it to whatever sheet is currently active. > > so... you COULD reduce your macro to: > > Private Sub CommandButton1_Click() > TestVal = True > If sheets("Performance Attribute Weights").cells(39,3).value = 4 Then > Worksheets("Sheet1").Range("A1:M7").Copy > elseIf sheets("Performance Attribute Weights").cells(39,3).value = 5 Then > Worksheets("Sheet1").Range("A9:N16").Copy > elseIf sheets("Performance Attribute Weights").cells(39,3).value = 6 Then > > Worksheets("Sheet1").Range("A18:P26").Copy > elseIf sheets("Performance Attribute Weights").cells(39,3).value = 7 Then > Worksheets("Sheet1").Range("A28:R37").Copy > else > TestVal = False > End If > > If (TestVal) then > Worksheets("Performance Attribute Weights").Activate > ActiveSheet.Paste Destination:=Range("A7") > End If > End Sub > > (I added TestVal so that if the value is not 4-7, then nothing happens) > > Now.. to your last comment: > "I'm not even sure how to implement what you just wrote". > > What I wrote was a stand-alone "sub". > Normally, I would put it in a Module. > Then, to run it from your button, change the click event to: > > Private Sub CommandButton1_Click() > Btn_Copy > End Sub > > What you did by recording the macro and modifying it is a VERY good start. > But to speed things up and to keep the screen from jumping back and forth... > THAT's what makes the macros look GOOD.... > > hope this helps. > > Paul > > > > ----- Original Message ---- > > From: Thunderwhelmed <april.hil...@gmail.com> > > To: MS EXCEL AND VBA MACROS <excel-macros@googlegroups.com> > > Sent: Thursday, January 15, 2009 11:41:13 AM > > Subject: $$Excel-Macros$$ Re: IF-THEN macro > > > Hi Paul, Thanks so much! It's astonishing to me that this constitutes > > a "quick" macro for you! > > > I guess to answer your questions... I'm using Excel 2007, and > > shamefully, I really don't know how to write macros... I did come up > > with the script below though it's in conflict with your warning > > against activating sheets. Essentially, it's a hodgepodge of stuff I > > figured out by using the "record macro" tool and stepping into it. > > > Private Sub CommandButton1_Click() > > > If Application.ActiveCell = 4 Then > > Worksheets("Sheet1").Activate > > Range("A1:M7").Select > > Selection.Copy > > Worksheets("Performance Attribute Weights").Activate > > ActiveSheet.Paste Destination:=Range("A7:M13") > > End If > > > If Application.ActiveCell = 5 Then > > Worksheets("Sheet1").Activate > > Range("A9:N16").Select > > Selection.Copy > > Worksheets("Performance Attribute Weights").Activate > > ActiveSheet.Paste Destination:=Range("A7:N14") > > End If > > > If Application.ActiveCell = 6 Then > > Worksheets("Sheet1").Activate > > Range("A18:P26").Select > > Selection.Copy > > Worksheets("Performance Attribute Weights").Activate > > ActiveSheet.Paste Destination:=Range("A7:P15") > > End If > > > If Application.ActiveCell = 7 Then > > Worksheets("Sheet1").Activate > > Range("A28:R37").Select > > Selection.Copy > > Worksheets("Performance Attribute Weights").Activate > > ActiveSheet.Paste Destination:=Range("A7:R21") > > End If > > > End Sub > > > As you can see, the ranges to be copied/pasted differ based on the > > value of C39. The problem with this (it actually works) is that C39 > > must be active. Otherwise, it's a no-go. > > > ARGH, hate to be a pest, I'm not even sure how to implement what you > > just wrote! > > > On Jan 14, 5:05 am, Paul Schreiner wrote: > > > Not sure how much help you're looking for. > > > You said that you "don't know the VB language". > > > Does that mean that you don't know how to use the VB editor? > > > do you know how to write a macro? > > > Can you create your command button and assign a macro? > > > What version of Excel are you using? It won't matter for the VB, but it > > > will help in deciding how to describe it to you. > > > > Another "technique": > > > You describe activating a sheet, copying a range, activating another > > > sheet and > > pasting the data. > > > That is actually CPU intensive and causes a lot of screen flicker. > > > I prefer to copy the data from one sheet to another without selecting > > > them. > > > > I wrote this quick macro: > > > > Option Explicit > > > Sub Btn_Copy() > > > Dim FirstRow, LastRow, DestRow, R > > > Dim FirstCol, LastCol, DestCol, C > > > Select Case Sheets("Sheet3").Range("C39").Value > > > Case 4 > > > FirstRow = 1 > > > LastRow = 7 > > > FirstCol = 1 > > > LastCol = 13 > > > Case 5 > > > FirstRow = 9 > > > LastRow = 15 > > > FirstCol = 1 > > > LastCol = 14 > > > Case 6 > > > FirstRow = 17 > > > LastRow = 23 > > > FirstCol = 0 > > > LastCol = 0 > > > Case 7 > > > FirstRow = 25 > > > LastRow = 31 > > > FirstCol = 0 > > > LastCol = 0 > > > Case 8 > > > FirstRow = 33 > > > LastRow = 39 > > > FirstCol = 0 > > > LastCol = 0 > > > Case Else > > > FirstRow = 0 > > > LastRow = 0 > > > FirstCol = 0 > > > LastCol = 0 > > > End Select > > > If (FirstRow > 0) Then > > > DestRow = 7 - 1 ' (7) represents the first row in the > > > destination, > > (-1) prepares it for incrementing in the loop > > > For R = FirstRow To LastRow > > > DestRow = DestRow + 1 > > > DestCol = 1 - 1 > > > For C = FirstCol To LastCol > > > DestCol = DestCol + 1 > > > Sheets("Sheet2").Cells(DestRow, DestCol) = > > Sheets("Sheet3").Cells(R, C) > > > Next C > > > Next R > > > End If > > > End Sub > > > > If I KNEW that you were always going to copy 7 rows, then I could > > > calculate it > > mathematically. > > > But your columns were different for C39=4 (M) and C39=5 (N). > > > Therefore, I concluded that the rows/columns weren't consistent. > > > > If you need more help with putting the VBA code into a module and > > > assigning it > > to a button, > > > then we've got a lot more work to do! > > > > hth, > > > > Paul > > > > ----- Original Message ---- > > > > From: Thunderwhelmed > > > > To: MS EXCEL AND VBA MACROS > > > > Sent: Tuesday, January 13, 2009 7:30:14 PM > > > > Subject: $$Excel-Macros$$ IF-THEN macro > > > > > Hi all, > > > > > I have a worksheet that contains a column of 8 dropdown lists (combo- > > > > boxes) from a range in a different sheet. I have the (numerical) > > > > results of each selection set up to display in a hidden column. In > > > > another cell, I used the COUNTIF function to count the results of all > > > > selections >0 (0=no selection). > > > > > What I need to do is, based on that count, use a command button to > > > > activate another sheet in the same workbook, select a range of cells, > > > > then copy + paste into yet another sheet. > > > > > Basically: > > > > > if Cell C39=4, then > > > > Activate Sheet3 > > > > Select range A1:M7 > > > > Copy range > > > > Activate Sheet2 > > > > Paste range into Sheet2, starting at cell A7. > > > > > --OR-- > > > > > if Cell C39=5, then > > > > Activate Sheet3 > > > > Select range A9:N15 > > > > Copy range > > > > Activate Sheet2 > > > > Paste range into Sheet2, starting at cell A7. > > > > > etc, etc, when C39 = 6, 7, or 8 > > > > > I know it's all pretty much there, but I don't know the VB language. > > > > > I would really appreciate some help! Thank you in advance! > > > > > April > > > > > PS, does anyone know how to lock the contents of an entire sheet once > > > > that command button has been pressed? thanks!- Hide quoted text - > > > > - Show quoted text -- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ Visit the blog to download Excel tutorials at http://www.excel-macros.blogspot.com To post to this group, send email to excel-macros@googlegroups.com For more options, visit this group at http://groups.google.com/group/excel-macros?hl=en Visit & Join Our Orkut Community at http://www.orkut.com/Community.aspx?cmm=22913620 To Learn VBA Macros Please visit http://www.vbamacros.blogspot.com To see the Daily Excel Tips, Go to: http://exceldailytip.blogspot.com If you find any spam message in the group, please send an email to Ayush @ jainayus...@gmail.com -~----------~----~----~----~------~----~------~--~---