CountIfs date range AND conditional, possibly a VBA solution - vba

Okay, so here is a sample my current code. I have this in several cells , where B-H7 reflect the absence type it is searching for.
=COUNTIFS('Old Data'!$A:$A,Tracking!A8,'Old Data'!$B:$B,$E$7, 'Old Data'!D:D, ">"&$B$5, 'Old Data'!D:D, "<"&$C$5)
What this code is doing is looping through a spreadsheet, where the employee name is found in the data sheet, comparing the absence types and assorting them to their respective columns and counting them, the last bit of code restricts the search between date ranges.
That being said, I need to add conditions to this that I'm not sure I can without taking it into VBA. In the "Old Data" Sheet in column D I have start time, which displays in MM/DD/YY HH:MM format. In Column E I have End Time, which displays in the same MM/DD/YY HH:MM format.
I need to have a way to
A.) Have the progam count the number of days between these dates and a +1 to the count for each respective day.
B.) If the start and end date are the same, have the program compare the number hours. if it is less than 4, only add a .5 to the counter.
My first thought is to scratch the countifs formula and loop through and parse it out using VBA, but I thought I'd check first to see if it can be done with just the formula as the power of the built in function has been pretty surprising to me so far.
I think I should probably take this from a formula to a VBA function and call it in the cells, but I'm not entirely sure, pretty new to the VBA/Excel scene.
Also, I'm in Excel 2007.
Thanks for any input on this issue!

It's possible to do with a formula but not with COUNTIFS. This array formula should do it
=SUM(IF(('Old Data'!$A$2:$A$100=Tracking!A8)*('Old Data'!$B$2:$B$100=$E$7)*('Old Data'!$D$2:$D$100>$B$5)*('Old Data'!$D$2:$D$100<$C$5),IF('Old Data'!$E$2:$E$100-'Old Data'!$D$2:$D$100<"4:00"+0,0.5,INT('Old Data'!$E$2:$E$100)-INT('Old Data'!$D$2:$D$100)+1)))
confirmed with CTRL+SHIFT+ENTER
I restricted the data range to rows 2 to 100, adjust as required, whole columns is possible but that may slow down the formula considerably
To count workdays only change to this version:
=SUM(IF(('Old Data'!$A$2:$A$100=Tracking!A8)*('Old Data'!$B$2:$B$100=$E$7)*('Old Data'!$D$2:$D$100>$B$5)*('Old Data'!$D$2:$D$100<$C$5),IF('Old Data'!$E$2:$E$100-'Old Data'!$D$2:$D$100<"4:00"+0,0.5,NETWORKDAYS('Old Data'!$D$2:$D$100+0,'Old Data'!$E$2:$E$100+0))))
You can also exclude holidays if you add a holiday range to the NETWORKDAYS function

Related

Autofilter in Excel using VBA based on date range the user has entered

Tl; dr: How can I use VBA to autofilter dates based on dates entered in two cells (one for start date and one for end date)?
I'm trying to autofilter with VBA in Excel. I have a dataset that contains multiple rows (that change in the amount of rows every day). Seeing how I can have a macro that would automatically delete out dates that are outside of a range that the user would enter in two cells (one for the beginning of the date range and one for the end of the date range). I have code that pulls the data from its source and formats it, but the code to delete out the rows that fall outside of the date range I don't have any at this time. The dates could constantly change, some are before the start date and some are after the end date.
For example, if a user enters a start date of 2/1/2019 and an end date of 3/1/2019, then the autofilter would delete any before 2/1 and any after 3/1. The following week may have a completely different start and end date, so it would need to come from the cells rather than the dates themselves entered in the code.
The goal is to eventually have a count of the number of dates that appear in this dataset within the date range given, so alternatively the data could remain unchanged and just have a count of those dates. However I'd like to avoid this as it will eventually go in a report and I don't want to confuse the readers of the report if it contains older dates/dates after the date range.
I mentioned in the first paragraph that the data may change. This is because the rows above the dataset may be deleted or have some added. I haven't tested this out but a solution I've seen is here, where the range would always be referenced correctly. https://www.thespreadsheetguru.com/blog/5-ways-to-create-a-dynamic-auto-adjusting-vba-range

VLookup multiple values

I have a table of Dates and Days in a specific time range called Data
I also have a sheet of a specific employee called "Jackson" and a sheet for employees to input their free time in so I can generate Jackson sheet.
I tried VLookup so if Jackson input Monday" as his free time, the Jackson sheet will print out a template of all Mondays in the given time range. I want it also to print out the dates based on the table of date/days.
Here is a picture of what I would like:
Stack Overflow has saved me SO MANY MANY MANY times, thank you for your helps!
You could use "&" between the two lookup criterion and table arrays. Be sure to make the formula an array with ctrl shift enter

Bloomberg and updating formula if holidays give N/A

We use the BDH function to get closing prices at the end of each trading day, and do this for a list of different types of securities and indices at once.
Currently every BDH-of-index in the list refers to the same date at the top of the sheet, and if one index gives N/A because there is no trading on that day, we manually make it refer to a cell with another date.
=BDH($B4&" index","px_last",$I$1,$I$1)
Where B4 refers to an index ("SPX" etc.) and I1 = yesterday's date.
I've just written a VBA routine that updates the dates at the top, but now I want it to also check if any of the indices gives an N/A and, if so, let that one refer to another cell date automatically.
Can someone give me some advice on how to check the values in a row ranging c4:c20, and then change the cell that formula uses. Or should I alter the formula itself as well?
You could probably use an override instead:
=BDH($B4&" index","px_last",$I$1,$I$1,"Days=A,Fill=P")
That will retrieve the last available price as of yesterday's close, which may be the day before yesterday's close (or an earlier date) if that specific instrument did not trade yesterday.

I am trying to write a vba code to extract Data from a workbook based a given date range. User should be able to enter date range

I am trying to write a simple vba code to extract data from the work hour sheet. User should be able to specify a date range and the vba code should able to extract the data based on the range.
The hour sheet has dates mentioned in the columns and work items in the rows. Users put their hour spend for the day against the given work item in the corresponding dates.
For ex. if I select range 01-08-2015 to 01-08-2015 the code should be able to extract the hour spend in the given date range for the particular work item. The data should then be shown to the user in the Calculations sheet.
I was looking to add a command button to facilitate the process
Work Items are arranged in rows and dates are arranged in columns.
Without seeing the spreadsheet, my gut would say to try something like this. Create a new sheet that has a spot for the starting date and ending date to be put in cells, eg A2 = starting date and B2 = ending date. If this is for a user, have the label for this in A1 and B1. Add a command button that will run the macro. macro should use a loop to find all the dates within the range, it would be easiest if the master data sheet was sorted, then have the code copy and paste the cells as needed. Without more details on the sheet layout, I can't really put some code together for you.

Autofill Custom List

I am trying to code a schedule generator in Excel using formulas or VBA that can automatically fill in the correct cells with data from a custom list (it can be stored anywhere - another spreadsheet, somewhere in the same sheet). Does anyone know an easy way to do this using VBA/Excel formulas or some other method (maybe even a better program to do it in)?
A user should type the start date in a cell and then it automatically fills in the same data into the weekdays, skipping weekends and holidays, which are also user inputted somewhere in a spreadsheet.
This picture explains what I am trying to accomplish:
There would be a place to input a new class and start date and the rest would auto fill. The custom list would be the titles (i.e. Database Basics, Tables, Primary Keys, Foreign Keys and so on)
The top two rows are date and day of week (that part is easy) but then give a start date fill in the list (until you reach the end of the list) in the weekdays but do not fill in weekends or user chosen holidays. Ideally this would work for every row. So if I have multiple start dates then maybe rows 3,4,5 would have different schedules but I can see where they coincide and do not based on this simple view.
This is a description of a technique that you may adapt for your use. Say we want to auto-fill dates (working days) in row #1 based on a staring date in cell A1.
Leave A1 empty. Format the cells in row #1 as Date.
In B1 enter:
=IF(A1="","",WORKDAY(A1,1))
and copy across. Now when a date is entered in A1, the rest of row #1 will follow suit.