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.
Related
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
Consider I have a Table A in Excel - details as below:
And another Table B as follows
I want out-put as follows,
The Name from Table B has to be checked with Name in Table A, and respective StartDate and EndDate should be picked from Table A and same should be compared with dates in Table B and cell under that name should be colored to green if Status in Table A is in "In Progress" or to Red if in "On hold"
For Example:
Consider Jack in Table B, it has 3 records in Table A, The first start date should be picked i.e 4-Apr-2017 and End date as 27-Apr-2017, and respective coloring has to be done based on status field.
How can I achieve this using VBA/anything in Excel. I'm new to VBA.
Yes you can do it in VBA but I would recommend using conditional formatting (formula) as it doesn't require programming knowledge. To do this, you will need to employ the Vlookup formula.
I believe the output you want is something in the picture link here?
To make conditional formatting, look in the "Home" tab, under Styles -> Conditional Formatting. Highlight the cell you want to format, then select Conditional Formatting -> New Rule. This will cause a new window to pop up. Select "Use a formula to determine which cells to format".
You would want 2 conditional formats.
1.To show green if the date is within the start and end date. To do so, select the first cell in the Gantt chart (cell B8 in example) then enter formula below.
=IF(AND(B$7>=VLOOKUP($A8,$A$2:$D$5,3,FALSE()),B$7<=VLOOKUP($A8,$A$2:$D$5,4,FALSE())),TRUE(),FALSE())
2.To show red when user has item beyond due date, enter formula below with same cell highlighted.
=IF(B$7>VLOOKUP($A8,$A$2:$D$5,4,FALSE()),TRUE(),FALSE())
Once that is done, you can apply the format painter or copy and paste the cell with conditional formatting to extend your table/Gantt chart.
Note that the $ signs are important as they lock the relative reference positions in the formulas. Using the second formula as an example, B$7 refers to the date and you need the reference to be locked to row 7, where all the dates are. On the other hand, the column reference (Column B) can be shifted as you want it to change to with the columns to properly compare against the other dates.
As for multiple items per user, can you expand upon your initial question? Would you like to track based on per user or per item? I am assuming that you're creating a Gantt chart to track a project. In that case, it would make more sense to track specific tasks assigned to people. You can modify the example given to track based on task.
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.
Currently we use an excel spreadsheet with 4 tabs (as tab for each team), each tab is a planner/diary that week, each day has 4 "slots" for jobs that are planned in.
The people type in the information for each job into one of the 4 slotsfor the day. Each slot contains information in different cells; Job No., Address, Duration, Notes, etc...
The issue/time consuming aspect of this method is when jobs have to be moved about between teams or moved to a different day it involves lots of copying, pasting and deleting.
What I am trying to achieve is some form of drag/drop interface (similar to the way the calendar in Outlook works), where the people who use the spreadsheet can input details for the job in a form and then have a drag an drop "tile" to be able to drag into one of the "slots.
The data contained in these slots needs to be able to produce a report which is a linear list of all the jobs planned that week.
I am at a loss to figure out what method I should use to create this, it seems it is beyond the reach of Excel from what I can find, also beyond the reach of Access, so I suspect it will involve some form of programming. I have basic understanding of VBA, but that's about it.
Can anyone make any suggestions.
Thanks
Working with data in this format will always be hard and I would not reccomend adding any drag and drop until you have sorted out the structure of your data.
You might like to consider another approach, which involves restructuring your data to make it easier to work with...
If you had one sheet with the following columns:
Teamname
Date (instead of Week Number and Day of week,)
Timeslot
JobNo
Address
Duration
Notes
Etc
Then each row would represent a job and have details of when it is occurring.
This is way a database would store the information about the jobs that are happening.
To change when a job is happening, all you have to do is update the date (and timeslot) of the row.
You could then create another worksheet for each team that uses excel formulas to lookup jobs happening this week and display them in a column for each day - like you have now. These sheets would be for display purposes only.
(You would use formulas like VLOOKUP etc)
If you want to change the date of a job you then simply go to the worksheet with the long list and change the date.
Having your data in this long list (ie normalised) format will give you many benefits. For instance you can summerise the report of the data using pivot tables.
If you add filters to the long list (SEE Ribbon>>Data>filters) you can order the data and reduce the list to only show jobs on a selected date, or for a selected team etc...
This is definitely the way forwards. Having restructured the data in this way, you could then add flashy ways to change when a job is taking place by adding buttons on the team worksheets or something.
PART2:
So in you ling list I would recommend excel CONCATENATE function to add an extra column with the text you want displayed elsewhere in your "calendar". #COLUMNA
I would also create another column which is a unique identifier for the row. This will probably be the "Date in YYYMMDD format & timeslot in HHMI format" concatenated together.
In the calendar view sheets say you need a column to display each day of the week with a row for each time slot: You need to
enter a StartDate of the period you want to view
Set up a column for each day (with a formula to calculate the date of the day (ie StartDate, StartDate+1 etc). The date is displayed as a column header (perhaps with a format that shows the dayname, but is stores the date)
each row will have a column that has the timeperiod name and each row will have a value entered. The value is the same as those used in the long list's timeperiod column.
When a user double clicks on a cell you can use the worksheet event
Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
in the VBA code, for this event you need to:
see if the cell double clicked is one you want to respond to
if it is find the date and timeperiod from the corresponding column and row header.
use VBA to activate the long list sheet and probably filter to only show the jobs taking place that day or perhaps that week. Then select (or highlight?) the job that was double clicked.
This is quite easy once you know VBA.
There is a lot to know though I would:
use a named range to define the row with the date and another to define the column with the timeperiod
use a named range to define the cells that will respond to a double click
use range functions in VBA like intersection and the entirerow, entirecolumn range properties to find the date and timeperiod of the double clicked cell.
use the macro record to write the initial code that will do the filter.
adjust the code to be well written and to find the date and timeperiod as required.
Create a sheet for all departments? Or just create one sheet where the dept can be chosen.
You could get clever and allow the user to select two cells in the calendar and provide buttons that do things like:
swap the jobs
If they select many cells then a button to Goto the list and only show jobs that were selected in the calendar.
Perhaps the user could select one job and buttons could move the job back or forwards 1,2,7,14 days.
Note that you can use the long list to record other details of the job like time taken, customer, start time, end time etc...
See about Pivot tables here which might give you some ideas about how you can summarise you data to give info like jobs per day, total value of jobs by day, etc...
Before you tie yourself in knots using Excel, you should always consider using Access.... as with someone who know what they are doing, access will deliver a lot more in a shorter period of time and can do nice things like print one page per job etc etc...
(Do you need a contractor?)
mr#HarveyFrench.co.uk
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.