Does anyone know if it is possible to delete a document that is not updated by a certain time. I am trying to make a blank inspection sheet repopulate every night at 12:01 AM and if no one enters in inspection information for that day, the form for that day be deleted so I don't have a surplus of blank inspection forms saved.
Yes it is possible. here is the base code. You need to change the if statement to reflect the correct time period.
Dim oFileObj
Set oFileObj = Wscript.CreateObject("WScript.FileSystemObject")
oFileObj.GetFile("File.Name")
if oFileObj.DateLastModified < NOW then
oFileObj.DeleteFile("File.Name")
end if
Set oFileObj = Nothing
Related
I often have to check Word documents with multiple rounds of editing. To make things easier, I would like to be able to run a macro that prompts me to input a date and then any tracking before this date would be hidden, leaving only track changes made on or after the inputted date. Ideally, hitting the macro again would toggle the hidden track changes back to being shown.
I don't have an in-progress code as such, but do have two separate macros, each doing related things. The first is a simple toggle to hide and show insertions and deletions:
Sub ShowHideMarkup()
ActiveWindow.View.ShowInsertionsAndDeletions = Not _
ActiveWindow.View.ShowInsertionsAndDeletions
ActiveWindow.View.ShowFormatChanges = Not _
ActiveWindow.View.ShowFormatChanges
End Sub
And the second is one I've seen posted a few times online (created by Graham Mayor) - this one prompts for a date and then accepts earlier revisions:
Sub AcceptTrackingBeforeGivenDate()
Dim oRev As Revision
Dim oKeepDate As Date
Dim strRsp As String
While Not IsDate(strRsp)
strRsp = InputBox("Enter earliest date to keep", _
"Accept Changes Before Date", _
"1 Jan 2021")
If Len(strRsp) = 0 Then Exit Sub
Wend
oKeepDate = CDate(strRsp)
For Each oRev In ActiveDocument.Revisions
If oRev.Date < oKeepDate Then
oRev.Accept
End If
Next oRev
End Sub
I'm really not sure how to combine the two. Could anyone point me in the right direction?
Many thanks in advance!
Luke
Your two macros cannot be combined to do as you want. The:
first simply toggles the track-changes view on/off for all tracked changes.
second simply accepts all changes before a specified date, meaning they no longer exist in the document and, unless all the 'accepts' are undone or discarded (by not saving the document), provides no means of 'unhiding' those changes.
Word has no capacity to display some tracked changes and hide others based on the date.
The kludgy workaround I had in mind is equivalent to what the second macro does - without saving the modified document.
Do note that, even without using Track Changes, Word allows you to use its document comparison feature to compare two versions of the same document (e.g. the current version and a version in your backups). You could do the same thing by saving daily/weekly versions of the documents (different filenames, of course), to compare any two versions against each other.
I am trying to check if positions in a delivery which is changed via the transaction vl02n fulfill some specific critiria before the document is saved.
For this action I want to use the user exit USEREXIT_SAVE_DOCUMENT_PREPARE.
In the debugger I checked which tables and variables are accessible and found out that there is a global table XLIPS which contains all positions that are visible on the current to be saved delivery.
The problem is that in XLIPS there are also the positions which were already deleted at the GUI of vl02n.
Because I just want to check the positions which indeed will be saved I don't want to use the table XLIPS.
How could I solve this problem and is there a better way than using XLIPS?
Thank you very much for your help and please excuse my bad english.
XLIPS contains the change information of all delivery items upon saving. So if you delete a line, XLIPS will still hold the deleted line, with the field XLIPS-UPDKZ set to D - indicating that the line has been deleted (or I inserted or U updated). With this in mind, you should be able to program your checks against the relevant items accordingly:
LOOP AT xlips ... WHERE updkz NE 'D'.
<your code here>
ENDLOOP.
I've been working on an independent project for a client of mine. They wanted to produce a button that, upon the user-click, it would open up a user-form and have a variety of macro-related options to choose from: a drop-down list, checkbox, option select button, etc.
I created a test formula and submitted it to the client; they enjoyed it thoroughly and decided to sent me a file to 'copy & paste' my original code within their excel file.
Problem is; because I'm a tad bit inexperienced with VBA I've run into a problem where once I click the button - the user form doesn't show up.
Below is a Dropbox link of the original file I created and it's original code; as well as the file that I am trying to copy.
Any help would be all welcome and appreciated.
Link to dropbox: https://www.dropbox.com/sh/l1t37lz8uritrua/AAAdWPGvw0GDZ6hW4SwmbBdRa?dl=0
OriginalProject.xlsm has a form named honor_roll_form which contains 100 lines of code.
CopyOfOriginal.xlsm has a form named UserForm1 which contains no useful code.
I do not believe there is any method of directly copying user forms from one workbook to another. Instead
Within VB Editor of OriginalProject.xlsm, select honor_roll_form.
Click File then Export File and save the form on your desktop or where ever you like.
You will now have two files on your desktop; one with an extension of frm and one with an extension of frx.
Within VB Editor of CopyOfOriginal.xlsm, click File then Import file.
Import honor_roll_form.frm
When I try clicking button "Honor Roll", I get "Method or data member not found" for project1Box. I will investigate after dinner (18:57 here) unless you tell me you already know why I am getting this error.
Extra comments in response to request from OP
It is late here but I have started looking down sub execute_button_Click within the second CopyOfOriginal.xlsm. I will comment on what I see even if it is not directly relevant to the non-execution of the macro.
If you open the VB Editor and look on the left you will see the Project Explorer. Near the top you will see:
Microsoft Excel Objects
Sheet1 (Sheet1)
I have always found this confusing. The first “Sheet1” is Excel’s Id for the worksheet and cannot be changed. The second “Sheet1” is the default name for the worksheet which can be changed. You can write Sheet1.Range("A1") or Worksheets("Sheet1").Range("A1"). That is: you can reference a worksheet by its Id or its name. You have named a variable of type Worksheet as Sheet1. Using Excel’s names as variable names can lead to bizarre errors so it is important to avoid doing anything like this.
It is better to always use meaningful names. At the moment, you know what Sheet1 means but if you come back to this macro in six or twelve months will you remember. I would use a variable as you have but I would name it WshtCis208 or WshtVBAProg or something similar.
Set ID = Range(Sheet1.Cells(2, 1), Sheet1.Cells(52, 1)) could be written as:
With WshtCis208
Set ID = Range(.Cells(2, 1), .Cells(52, 1))
End With
Using With statements produces faster code and, almost always, code that it easier to read.
“52” is the current bottom row for this table. Will you amend the macro for them every time they add or remove a student? There are several techniques for finding the last row, none of which is perfect in every situation. The technique that is the most convenient most of the time is:
Const ColCis208Id as Long = 1
Const ColCis208MidTermExam as Long = 5
Dim RowCis208Last as Long
RowCis208Last = .Cells(.Rows.Count, ColCis208Id).End(xlUp).Row
At the moment, column 1 is the Id column. It is perhaps unlikely that the Id column will move but it is very likely that some of the others columns will move when some new column is identified as useful. Do you want to scan the code trying to decide which 5s refer to the MidtermExam column when a Project3 column is added?
Constants allow you to name literals that might change. It makes your code easier to read and saves so much pain when a value changes.
.Rows.Count gives the number of rows in a worksheet for the current version of Excel so .Cells(.Rows.Count, ColCis208Id) identifies the bottom cell of column 1. End(xlUp).Row says go up until you hit a cell with a value and returns its row number. It is the VBA equivalent of Ctrl+Up.
The next statement subjectCount = … fails because projectBox does not exist on the form. You have changed the captions but not the names.
As far as I can see the form fails to execute because you have started updating it but have not finished.
I have a UserForm with a DatePicker control in it.
It works fine, except when copying the selected date to the spreadsheet.
This is the code:
Range("A1").Value = UserForm1.DTPicker1.Value
Which returns:
00:00:00
In cell A1, no matter what date has been selected.
You cell formatting might be set to Time instead of Date.
Try changing that to see if it works.
Also, make formatting 'General' AFTER this step, to see if anything has been pasted in "A1".
You should need an intermediate variable to get it, like below:
t = Me.DTPicker1.Value
ws.Range("A1") = t
Make sure that the command to transfer the data is located in the same form or page of a multipage form as the DTPicker itself.
For some reason it wont work when the two are separated and will display a zero in the target cell. That zero is the "time" part of the date which has been switched off. Although the "Date" part refuses to transfer over, for some reason the time does, and so that zero time is read in the cell as time zero which is mid-day.
So in summary:
Keep the DTPicker and transfer control on the same page and that should solve the problem.
The code is pretty simple. It's
Sheet1.Range("AA9") = Me.DTPicker1.Value
I'm new to MS Project and I need help on something that I don't know if It's possible to do.
In a list of hundreds of tasks, I need to hide some, based on a criteria. This First step is easy, I've created a filter with the criteria that I wanted, applied it to the tasks and it worked well.
The problem is that I need to change duration of tasks that became hidden by the filter, that is, change its duration to 0 so it impacts durations of the other tasks in the list. And by filtering, the only thing that is done is hide tasks from the view, but they still there, and so the dates and durations remain intact.
Is there anyway that I can hide tasks, and set its duration to 0? Can be through VBA also, because I worked with VBA before, not in Project, but in Access and Excel.
If you have MS Project 2010 or later, you can set the tasks inactive (right mouse button / inactivate task). This makes duration etc. not affecting other tasks any more even if still stated in the inactive tasks.
Otherwise, a macro like this should help:
Dim tskX As Task
For Each tskX In ActiveProject.Tasks
If Not (tskX Is Nothing) Then 'Do not combine this line with any other line! You would get runtime errors when accessing empty tasks (space rows) in your schedule.
If Not tskX.ExternalTask Then 'You can't modify external linked tasks anyhow. You would get runtime errors if trying this.
If tskX.Text1 = "x" Then 'Instead of "Text1" you can access the field containing your criteria here
tskX.PercentWorkComplete = 0
tskX.Duration = 0
End If
End If
End If
Next tskX
Best regards, Kawi42