I have build a quiz and displaying score using some checks and output cells have "1" if ans correct and "0" if wrong.
to calculate score I use the function
=COUNTIF(S7:S158,1)
Problem is the score gets updated as soon user starts writing ans.
I want to have a Macro SUBMIT(using form control) which when clicked gives the score.
what should i write in Sub SUBMIT() so as to execute the above function
You can write fomula:
=IF(COUNTA(S7:S158)=x;COUNTIF(S7:S158,1);"")
where x is a number of questions (for example 100). So, function COUNTA counts number of non empty cells in the range, and if the user ansered on all questions, condition COUNTA(S7:S158)=x becames true and the COUNTIF(S7:S158,1) calculated, otherwise an empty string is displayed
You can set the following code in Workbook_Open
Sheet1.EnableCalculation = False
In Sub Submit()
Sheet1.EnableCalculation = True
Sheet1.Calculate
For more, see this
I'm a developer and I resort to macro only when all options are exhausted. This is mainly for the benefit of people that might want use/reuse it for other purposes. But that's just my preference.
You can have a cell with a label of Show Score and accepts Yes/No and put an IF around your =COUNTIF(S7:S158,1).
Related
I have a form that is supposed to show the total sum of different numeric values between two dates, a start date and a finish date. For this, I thought the best option would be to use the SumIfs WorkSheetFunction. However, after trying to code this, the function is not working properly. I am not sure of what is wrong. If I type the exact same formula on the worksheet that has the table with my sample data, it works perfectly.
So, the form I designed is the following:
A second label and textbox will be added for the finish (or end) date. However, I thought it would be better to do that once I get the code to work with a single date in the beginning. The textbox where the user will insert the start date is called tbxDate and the textbox that will show the resulting sum is called tbxBalance. The button that triggers the SumIfs functions is called cmdCalculate.
Also, the table that stores the data (which only has one row of data so far for testing purposes) is this one:
The table name is Sales, and the worksheet name is SalesWS. I thought the code should be pretty simple, unless there is something I am missing. What I did was:
Private Sub cmdCalculate_Click()
Set SalesRange = Worksheets("SalesWS").Range("Sales[TOTAL]")
Set DatesRange = Worksheets("SalesWS").Range("Sales[DATE]")
tbxBalance = Application.WorksheetFunction.SumIfs(SalesRange , DatesRange , ">=" & tbxDate)
End Sub
The issue is that the >= part of the criteria is failing. I only get proper results using only the greater than or less than conditions. For example, if I enter the date 09/08/2020 in the textbox the result in the balance textbox is 0, but if I enter the date 08/08/2020 or anything before it works. It just ignores the condition to sum the values if the date is equal to what is entered. It only works with dates greater or less than what the user inputs in the textbox, excluding the chosen date.
I already checked that the column with the dates in the table is formatted properly.
The version of your code given below should work provided your DATE range contains true dates and tbxDate contains a string VBA can recognise as a date.
Private Sub cmdCalculate_Click()
Dim Fun As Double
Set SalesRange = Worksheets("SalesWS").Range("Sales[TOTAL]")
Set DatesRange = Worksheets("SalesWS").Range("Sales[DATE]")
Fun = Application.WorksheetFunction.SumIfs(SalesRange, DatesRange, ">=" & CLng(CDate(tbxDate.Value)))
tbxBalance = Format(Fun, "#,##0.00")
End Sub
Remember that tbxBalance will cotnain a text string, not a number. Use Excel's NUMBERVALUE function to convert the formatted number you have in tbxBalance after the above code back to a number you can calculate with.
Currently I am working on a data set that has multiple filter bars that can be selected and help search the data and provide how many meet its requirements among other things. E.g. by choosing a manager and partner name it looks through those lines in the data table.
I have made it so it posts out a string of the text formula into boxes which are then concatenated and using a UDF Eval, enforced (it's needed to be broken down a lot due to lots of If and Else statements.
The thing is, as jobs are completed they are not deleted instead they are hidden.
How do I allow this data table to do a Count Ifs search with only looking at visible? Presumably its a UDF?
The ranges are from 6:1000
Below is the breakdown of the code I have. I need find a function to make this code work only on visible.
I have made it so it posts out a string of the text formula into boxes which are then concatenated and using a UDF Eval, enforced (it's needed to be broken down a lot due to lots of If and Else statements.
The thing is, as jobs are completed they are not deleted instead they are hidden.
How do I allow this data table to do a Count Ifs search with only looking at visible? Presumably its a UDF?
The ranges are from 6:1000
Below is the breakdown of the code I have. I need find a function to make this code work only on visible.
Sub SetCriteria()
If Sheet8.Range("E6").Value = 1 Then
'The 1 is displayed if there is a value placed in the filter part of the dashboard. If not this value remains 0.
Sheet8.Range("F6") = "Tank!G6:G1000,Dashboard!C6,"
'If there is a value in the filter, then the writing for the CountIf formaul is displayed, linking to the criteria.
Else: Sheet8.Range("F6") = "Tank!G6:G1000,""*"","
'If there isn't anything placed in the critieria then a wild card is selected to ensure all option for that catergory are chosen.
End If
If Sheet8.Range("E7").Value = 1 Then
'Same as above, though this time for Task Manager.
Sheet8.Range("F7") = "Tank!I6:I1000,Dashboard!C7,"
Else: Sheet8.Range("F7") = "Tank!I6:I1000,""*"","
'The two different printed formulas, depending on criteria inclusion
End If
If Sheet8.Range("E8").Value = 1 Then
'Procedure for TAS Consultant
Sheet8.Range("F8") = "Tank!J6:J1000,Dashboard!C8,"
Else: Sheet8.Range("F8") = "Tank!J6:J1000,""*"","
End If
If Sheet8.Range("E9").Value = 1 Then
'Procedure for Pillar
Sheet8.Range("F9") = "Tank!H6:H1000,Dashboard!C9)"
Else: Sheet8.Range("F9") = "Tank!H6:H1000,""*"")"
End If
End Sub
EDIT: Here is my Evaluate Function
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Below array-formula to put in a cell, (Codename Sheet8 is Sheetname Sheet8 I assume)
close it with Ctrl+Shift+Enter
=SUM(SUBTOTAL(3,OFFSET(Tank!G6:G1000,ROW(Tank!G6:G1000)-MIN(ROW(Tank!G6:G1000)),,1))*(IF(Sheet8!E6=1,Tank!G6:G1000=Dashboard!C6,1))*(IF(Sheet8!E9=1,Tank!H6:H1000=Dashboard!C9,1))*(IF(Sheet8!E7=1,Tank!I6:I1000=Dashboard!C7,1))*(IF(Sheet8!E8=1,Tank!J6:J1000=Dashboard!C8)))
This formula is instead of your Sub setcriteria and your Eval function,
You could also break it down as you did before and put it in your eval function.
(Not visible rows must be filtered)
But when you go the VBA-route, have a look at looping your range, only visible rows, check for the criteria and count if met.
I guess this needs a VB Macro. I need to know how to do this. I have an excel sheet,lets say with four columns - NAME, AGE, GENDER and BIRTHDAY. Suppose I want to ensure that the AGE column is always filled for all the records and is always positive and above zero. Number of records in the file are not fixed so file can have 5 rows or 500 rows. I need to make sure that if any of the columns NAME, GENDER or BIRTHDAY is filled in a row and AGE is blank, 0 or negative then excel should prevent the user from closing the file.
you can hack this solution a little to suit your needs
VBA Excel action when closing workbook
https://stackoverflow.com/a/27923799/6868389
Since the particular details of your question are so vague i can propose a solution to the closing part. The individual conditions you will have to add based on what exactly you have in the file and want but you can add them in between to set MyValidations to 1. As mentioned above this is based on Workbook_BeforeClose event.
https://msdn.microsoft.com/en-us/library/office/ff194765.aspx
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MyValidations = 1 Then
Cancel = False
Else
MsgBox "Nope'"
Cancel = True
End If
End Sub
I'm working on an excel spreadsheet and want an if statement in a cell that allows user input if a certain condition is met, and calculates a value otherwise. Something like
=if(condition true, whatever user wants, 5*$A$1,)
Is there a way to do this?
You won't be able to have the user-input in the same cell as your formula. (without using VBA)
To do it without VBA you will need to use at least 2 cells, one with your formula, and one for the user value
There are a couple of ways you can do it with VBA
Heres a simple one, but would not really recomment it, if lots of cells use this it you'll get lots of inputboxes!
usage: =IF(condition, UserInput(), false result)
Public Function UserInput() As Integer ' used integer as an example
Dim Result As Variant
Result = Application.InputBox("Enter an Integer", "Input Required", , , , , , 1) ' inputbox, the final 1 makes it only accept numbers
If VarType(Result) = vbBoolean Then
UserInput = 0 ' the default value
Else
UserInput = CInt(Result) ' make sure its an integer
End If
End Function
Another one, would involve using the selection change and cell change events to read the initial value of the cell being changed, and allow the change (adding the value into the initial formula's "true" block or deny the changes by reverting the cells formula to the initial one.
You either need to use a Macro to update only null columns or you need to allow user to enter values in another column and then merge the values in this column, third option is to fill it with formulas and allow people to edit it to any value if they want only values
=IF(C11="Economic",120,IF(C11="DBServer",480,IF(C11="Gamer",120,IF(C11="Custom",M15,"null"))))
My example was to build an optimal computer given certain constraints. There was a drop down with Economic, DBServer, Gamer, and Custom as options. If you chose economic, then 120 would show up in the cell, DbServer meant 480, etc. If you selected custom, then it would refer to cell M15 which was a user input that didn't affect the code of the cell you wanted the final number in.
I am writing a quick application myself - first project, however I am trying to find the VBA code for writing the result of an input string to a named cell in Excel.
For example, a input box asks the question "Which job number would you like to add to the list?"... the user would then enter a reference number such as "FX1234356". The macro then needs to write that information into a cell, which I can then use to finish the macro (basically a search in some data).
You can use the Range object in VBA to set the value of a named cell, just like any other cell.
Range("C1").Value = Inputbox("Which job number would you like to add to the list?)
Where "C1" is the name of the cell you want to update.
My Excel VBA is a little bit old and crusty, so there may be a better way to do this in newer versions of Excel.
I recommend always using a named range (as you have suggested you are doing) because if any columns or rows are added or deleted, the name reference will update, whereas if you hard code the cell reference (eg "H1" as suggested in one of the responses) in VBA, then it will not update and will point to the wrong cell.
So
Range("RefNo") = InputBox("....")
is safer than
Range("H1") = InputBox("....")
You can set the value of several cells, too.
Range("Results").Resize(10,3) = arrResults()
where arrResults is an array of at least 10 rows & 3 columns (and can be any type). If you use this, put this
Option Base 1
at the top of the VBA module, otherwise VBA will assume the array starts at 0 and put a blank first row and column in the sheet. This line makes all arrays start at 1 as a default (which may be abnormal in most languages but works well with spreadsheets).
When asking a user for a response to put into a cell using the InputBox method, there are usually three things that can happen¹.
The user types something in and clicks OK. This is what you expect to happen and you will receive input back that can be returned directly to a cell or a declared variable.
The user clicks Cancel, presses Esc or clicks × (Close). The return value is a boolean False. This should be accounted for.
The user does not type anything in but clicks OK regardless. The return value is a zero-length string.
If you are putting the return value into a cell, your own logic stream will dictate what you want to do about the latter two scenarios. You may want to clear the cell or you may want to leave the cell contents alone. Here is how to handle the various outcomes with a variant type variable and a Select Case statement.
Dim returnVal As Variant
returnVal = InputBox(Prompt:="Type a value:", Title:="Test Data")
'if the user clicked Cancel, Close or Esc the False
'is translated to the variant as a vbNullString
Select Case True
Case Len(returnVal) = 0
'no value but user clicked OK - clear the target cell
Range("A2").ClearContents
Case Else
'returned a value with OK, save it
Range("A2") = returnVal
End Select
¹ There is a fourth scenario when a specific type of InputBox method is used. An InputBox can return a formula, cell range error or array. Those are special cases and requires using very specific syntax options. See the supplied link for more.
I've done this kind of thing with a form that contains a TextBox.
So if you wanted to put this in say cell H1, then use:
ActiveSheet.Range("H1").Value = txtBoxName.Text