A Few PI ProcessBook VBA Tips

2y ago
140 Views
28 Downloads
885.73 KB
22 Pages
Last View : 17d ago
Last Download : 2m ago
Upload by : Kamden Hassan
Transcription

A Few PI ProcessBook VBATipsOSIsoft vCampus White Paper

How to Contact UsWorldwide OfficesEmail: vCampus@osisoft.comWeb: http://vCampus.osisoft.com Contact UsOSIsoft Australia Pty Ltd.Perth, AustraliaAuckland, New ZealandOSIsoft, LLCOSIsoft Europe GmbH777 Davis St., Suite 250San Leandro, CA 94577 USAFrankfurt am Main, GermanyOSI Software Asia Pte Ltd.SingaporeHouston, TXJohnson City, TNMayfield Heights, OHPhoenix, AZSavannah, GASeattle, WAYardley, PAOSIsoft Canada ULCMontreal, QuebecCalgary, AlbertaOSIsoft, LLC. ShanghaiShanghai, People’s Republic of ChinaOSIsoft Japan KKTokyo, JapanOSIsoft Mexico S. De R.L. de C.V.Mexico City, MexicoSales Outlets and DistributorsBrazilMiddle East/North AfricaRepublic of South AfricaRussia/Central AsiaSouth America/CaribbeanSoutheast AsiaSouth KoreaTaiwanWWW.OSISOFT.COMOSIsoft, LLC is the owner of the following trademarks and registered trademarks: PI System, PIProcessBook, Sequencia, Sigmafine, gRecipe, sRecipe, and RLINK. All terms mentioned in this bookthat are known to be trademarks or service marks have been appropriately capitalized. Any trademarkthat appears in this book that is not owned by OSIsoft, LLC is the property of its owner and use hereinin no way indicates an endorsement, recommendation, or warranty of such party’s products or anyaffiliation with such party of any kind.RESTRICTED RIGHTS LEGENDUse, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph(c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013Unpublished – rights reserved under the copyright laws of the United States. 1998-2010 OSIsoft, LLCa few processbook vba tips v2.docx

TABLE OF CONTENTSTable of Contents . iiOverview . 1About this Document . 1What You Need to Start . 1"One-Click Value Trend" VBA Script . 2Introduction . 2The General Settings . 2The Display Open Event. 2The Display Click Event . 3"One-Click Value Ad Hoc Trend" VBA Script . 5Introduction . 5The General Settings . 5The Display Open Event. 5The Display Click Event . 5Creating XYPlots Programmatically . 7Introduction . 7The General Settings . 7The Command Button . 8The CreateButton Click Event. 8The Display DataUpdate Event . 10“SetViewPort” VBA code snippet . 12Introduction . 12The General Settings . 12The Display Open Event. 12The Value1 DataUpdate Event . 12“Modified” property . 13Introduction . 13The General Settings . 13ii

The Display BeforeClose Event . 13Pass the Context from Parent to Child (Module Relative Display) . 14Introduction . 14The General Settings . 14The cmdOpenChildDisplay Click Event . 14Pass the Context from Parent to Child (Element Relative Display). 16Introduction . 16The General Settings . 16The cmdOpenChildDisplay Click Event . 16Revision History . 18iii

OVERVIEWABOUT THIS DOCUMENTThis document is exclusive to the OSIsoft Virtual Campus (vCampus) and is available on itsonline Library, located at http://vCampus.osisoft.com/Library/library.aspx. As such, it isprovided 'as is' and is not supported by OSIsoft's regular Technical Support.Any question or comment related to this document should be posted in the appropriatevCampus discussion forum (http://vCampus.osisoft.com/forums) or sent to the vCampusTeam at vCampus@osisoft.com.ABOUT THIS WHITE PAPERThis document contains a loose collection of various examples that can prove useful tomanipulate PI ProcessBook displays and objects. Some of these examples were previouslyprovided as standalone elements and were re-written and grouped for clarity purposes.VBA allows a user to build displays that modify themselves based on an event. This eventcan be a mouse click as well as the receiving of a new value in a PI Point.WHAT YOU NEED TO STARTThe VBA scripts have been developed with the following product:PI ProcessBook 3.21

"ONE-CLICK VALUE TREND" VBA SCRIPTINTRODUCTIONThe "One-Click Value Trend" VBA script places a displayed value into a PI ProcessBook trendwhen it is selected. You can access a trend of any value in your display.This VBA scriptreferences a Trend object named PointTrend on the display. In your own displays, you could eithermodify the VBA script to reference a trend with a different name or rename your Trend object toPointTrend:THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHE DISPLAY OPEN EVENTIn the Display Open event we set the time range of the trend when the file gets opened.Private Sub Display Open()' Reset the trend time range to be one day each time display is opened.Call ThisDisplay.PointTrend.SetStartAndEndTime("*-1d", "*")End Sub2

THE DISPLAY CLICK EVENT1. We select the Display Click event:2. And declare some variables:' The PI Server nameDim strPIServername As String' The PI Point name in the selected ValueDim strPITagname As String' The Start Time of the TrendDim strTrendStartTime As String' The End Time of the TrendDim strTrendEndTime As String' StatusDim Success As Boolean' The Symbols collectionDim MySymbols As SelectedSymbols' One SymbolDim MySymbol As Symbol3. Now we get a reference of the selected symbols collection and check if there any areselected :' Set selected symbols object to the selected symbols collection.Set MySymbols ThisDisplay.SelectedSymbols' Check to see how many are selected.If MySymbols.Count 0 Then' If the count is zero, user clicked display background, do nothing.Exit SubEnd If4. As we have the collection of symbols, we loop through it and search for a valuesymbol and modify the trend object accordingly:For Each MySymbol In MySymbols' If symbol object is type pbSymbolValue, it is a value object.If MySymbol.Type pbSymbolValue Then' Get the tagname and trend it.strPITagname MySymbol.GetTagName(1)' Pick up the current trend time range.strTrendStartTime ThisDisplay.PointTrend.StartTimestrTrendEndTime ThisDisplay.PointTrend.EndTime' If selected tag is not the current one in trend, put it there.If Not (PointTrend.GetTagName(1) strPITagname) Then' Remove old point trace from trend.PointTrend.RemoveTrace(1)' Add trace for this tag to trend ( using format \\severname\tagname )PointTrend.AddTrace(strPITagname)' Refresh time range, settingCall PointTrend.SetStartAndEndTime(strTrendStartTime, strTrendEndTime)End If5. In addition, we can use the PI SDK to add some PI Point information to the trendtitle. In order to do this, we have to reference the PI SDK:3

6. Then we can use PI SDK objects:' If you plan to use this script to enhance displaysviewed' in PI ProcessBook, you can use the PI SDK.'' NOTE: You will need to add a reference to the PI SDK libraries'to your PI ProcessBook VBA'project.' Strip out PI Server name ( used in Option 2 only).strPIServername Mid(strPITagname, 3, InStr(3, strPITagname, "\") - 3)' Strip out PI Tag name.strPITagname Right(strPITagname,Len(strPITagname) -InStr(3, strPITagname, "\"))' Set the Trend title to the Descriptor.PointTrend.TrendTitle me).PointAttributes.Item("Descriptor")7. And finally we set the trace scale to "Autorange" and finish the loop:' Refresh trend Y-axis scale.Success PointTrend.SetTraceScale("Autorange", "Autorange")Exit SubEnd IfNext MySymbol4

"ONE-CLICK VALUE AD HOC TREND" VBA SCRIPTINTRODUCTIONThis VBA script automates the "ad hoc trending" functionality of PI ProcessBook. When youclick any value in the display, an ad hoc trend appears.THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHE DISPLAY OPEN EVENTIn the Display Open routine we set the time range of the Display to 1 day when the file gets opened.Private Sub Display Open()' Reset the trend time range to be one day each time display is opened.Call ThisDisplay.PointTrend.SetStartAndEndTime("*-1d", "*")End SubTHE DISPLAY CLICK EVENT1. We select the Display Click procedure:2. And declare some variables:DimDimDimDimpbSymbols As SelectedSymbolspbSymbol As SymbolpbBar As PBCommandBarpbButton As PBCommandBarButton3. Now we get the selected symbols object and check if there are selected symbols atall:5

' Set selected symbols collection object to the' selected symbols currently on ThisDisplay.Set pbSymbols ThisDisplay.SelectedSymbols' Check to see how many are selected.If pbSymbols.Count 0 Then' If the count is zero, user clicked display background, do nothing.Exit SubEnd If4. As we have the collection of symbols, we search for all value symbols:' Look through selected symbols for a value object, trend first one found.For Each pbSymbol In pbSymbols' If symbol object is type 7, by definition its a value object.If pbSymbol.Type pbSymbolValue Then5. Get the Standard Toolbar object:' Grab PI ProcessBook's "Standard Toolbar"Set pbBar Application.CommandBars.Item("Standard Toolbar")6. Get the Trend Display button' Set the button object to the "Trend Display" button within that toolbar.Set pbButton pbBar.Controls.Item("Trend Display")7. And “push” it from code:' Programatically "push" the button.Call pbButton.Execute()8. Time to finish the loop:Exit SubEnd IfNext pbSymbol6

CREATING XYPLOTS PROGRAMMATICALLYINTRODUCTIONThe following VBA script creates several PI ProcessBook objects and populates them with tagsretrieved by a simple PI SDK call. The purpose of this example is to show you how to create displayobjects programmatically instead of drawing them manually. The advantage of the programmaticapproach gets obvious if the number of objects increases.This VBA script was inspired by a customer in training who asked for an option to create XYPlotswhere ten tags compare to each other. If the number of tags to trend is n, you can simply calculatethat the number of XYPlot is n(n-1)/2 so for 10 tags this will be 45 XYPlots to draw.THE GENERAL SETTINGS1. The script uses the PI SDK to retrieve the PointList. In order to do this, we have toreference the PI SDK:2. The Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption Explicit7

3. We define some constants. These constants define the size of the XYPlot symbol, thetime range of the trend, the tag mask and the PI Server.' Heigth of symbolConst cHeigth 600' Width of symbolConst cWidth 600' The timerangefor our symbolsConst strStartTime "Y"Const strEndTime "T"' The taglist we use to build our symbolsConst strWhereClause "Tag 'sin*'"' The PI Server. make sureit is already in the known server list!Const strServer "ANDREASPC"THE COMMAND BUTTON1. To run our VBA script we will use a Command Button:2. And we give it a friendly name of CreateButton (right-click on it when it Build mode,click Properties and change its name):THE CREATEBUTTON CLICK EVENT1. In the VBA environment, select the CreateButton Click procedure:8

2. First we disable the redrawing to reduce the load:' Improve the performance by turning off' redrawing until we have drawn all our symbolsApplication.Redraw False3. And declare some variables:' We are going to create XYplots!Dim MyXYPlot As XYPlot' Some loop variablesDim a, b, i As Long' We want to arrange the plots nicely in a squareDim iConnections As Long' The number of tags weare going to useDim TagMaxNumber1, TagMaxNumber2 As Long' The PI ServerDim MyPIServer As PISDK.Server4. Initialize the PI Server object and connect to it:' Initialize the PI Server objectSet MyPIServer pisdk.Servers.Item(strServer)' Open the connectionCall MyPIServer.Open()5. Create the PointList and initialize it with the tags based on the tag mask:' The point listDim MyPointList As pisdk.PointList' Initialize the point list with all our tags' that correspond to the mask defined aboveSet MyPointList MyPIServer.GetPoints(strWhereClause)6. Get the count, limit it to 15 (to reduce the number of symbols) and calculate how toget them best arranged as a square of symbols:' Get the countTagMaxNumber1 MyPointList.Count' With 15 tags we already get 100 XY plots,' if we don't limit the amount, we will have performance issuesIf TagMaxNumber1 15 ThenMsgBox("Too many tags! Using only first 15 tags.")TagMaxNumber1 15End If' Calculate the connections: n x (n-1)/2iConnections TagMaxNumber1 * (TagMaxNumber1 - 1) / 2' As mentioned, we want to have a nice square of trends,' so we calculate the square root9

TagMaxNumber2 Sqr(iConnections)' Initialize our counteri 07. Now we iterate through all the tags and create an XYPlot symbol:' Get an XY plot for each tag with each tag;-)' from the first to the last tagFor a 1 To TagMaxNumber1' With each other tagFor b (a 1) To TagMaxNumber1' Add an XY plotSet MyXYPlot ThisDisplay.Symbols.Add(pbSymbolXYPlot)8. We cannot simply add a trace to a XYPlot object directly. You have to add tags to thecollection that is part of the XYDefinition object:' The XY definitionDim MyDefinition As XYDefinition' Initialize the XY definitionSet MyDefinition MyXYPlot.GetDefinition' Add the two tagsMyDefinition.Tags.Add("\\" & MyPIServer.Name & "\" & yPointList.Item(a))MyDefinition.Tags.Add("\\" & MyPIServer.Name & "\" & MyPointList.Item(b))' Apply to our XY plotCall MyXYPlot.SetDefinition(MyDefinition)9. So let us move the XYPlot to the appropriate position and adjust its size:' Move it to the right place and the right sizeMyXYPlot.Left -14950 (((i Mod TagMaxNumber2) 1) * (cWidth 5))MyXYPlot.Top 14950 - (((i \ TagMaxNumber2)) * (cHeigth 5))MyXYPlot.Height cHeigthMyXYPlot.Width cWidth10. Adjust the time range and don’t forget to count the XYPlot (in favor of some complexmathematics I simply count the XYPlot to arrange them in a square ;-)):' Set the timeCall MyXYPlot.SetTimeRange(strStartTime, strEndTime)' Count!i i 111. Close the loop and switch on drawing:Next bNext a' Now we turn drawing back onApplication.Redraw TrueThisDisplay.Zoom “FitAll”THE DISPLAY DATAUPDATE EVENT100 XYPlots might be not too easy to check – how about some logic to simplify the task?10

1. Let's use the Display DataUpdate event to analyze all of our XYPlots when theyupdate (You may wonder why we don’t do that when we create them – well, thestatistics are not updated after you set the definition, so you have to wait for thedata update) and declare some variables:' We want to access the XY statistic' this should be done after the DataUpdate' The symbolsDim MySymbol As SymbolDim MyXYPlot As XYPlot2. Again we iterate through all the symbols on the display:' Search for all symbols on the displayFor Each MySymbol In ThisDisplay.Symbols' Is it an XY plot?If MySymbol.Type pbSymbolXYPlot Then' Initialize our XY plotSet MyXYPlot MySymbol3. And access the XY statistics:' The statisticsDim MyXYStat As XYStat' Initialize the statistics' we have only one so don't be too smart ;-)Set MyXYStat MyXYPlot.Stats.Item(1)4. As a simple example we modify the BackgroundColor of the XYPlots to identify theones that have a CorrelationCoefficient 0.5:' Set each XY Plot with CorrelationCoefficient 0.5 to white' Others go greenIf Abs(MyXYStat.CorrelationCoefficient) 0.5 ThenMyXYPlot.BackgroundColor vbWhiteElseMyXYPlot.BackgroundColor vbGreenEnd IfEnd IfNext MySymbol11

“SETVIEWPORT” VBA CODE SNIPPETINTRODUCTIONPI ProcessBook displays can be huge and the amount of information overwhelming. With the help ofVBA we can zoom the view to a certain area to catch the eye of the observer. In this example we willuse a digital tag (CDM158) to drive the visible area.THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHE DISPLAY OPEN EVENTIn the Display Open routine we set the size of the Display and the ViewPort.Private Sub Display Open()' PresetThisDisplay.Width 600ThisDisplay.Height 450ThisDisplay.Zoom 50' Reset the trend time range to be one day each time display is opened.Call ThisDisplay.SetViewPort(15000, -15000, 2000, 3000)End SubTHE VALUE1 DATAUPDATE EVENTAfter we add a Value object to a display we can use the Value1 DataUpdate event for ourexample:Private Sub Value1 DataUpdate()' If you have a big screen, and you want' to Zoom in based on an event.Select Case ThisDisplay.Value1.GetValue(vrDate, vrStatus)Case "Cascade"Call ThisDisplay.SetViewPort(14000, -15000, 1000,Case "Program"Call ThisDisplay.SetViewPort(14000, -13500, 1000,Case "Prog-Auto"Call ThisDisplay.SetViewPort(15000, -13500, 1000,Case "Manual"Call ThisDisplay.SetViewPort(15000, -15000, 1000,Case "Prog-Auto"Call ThisDisplay.SetViewPort(15000, -15000, 1000,Case ElseCall ThisDisplay.SetViewPort(15000, -15000, 2000,End SelectEnd Sub1500)1500)1500)1500)1500)3000)12

“MODIFIED” PROPERTYINTRODUCTIONThe PI ProcessBook Display class exposes a property called Modified. Simply catch theBeforeClose event of the Display and set the Modified property to False. PI ProcessBookwill not ask you to save the changes.This can be handy if your users are allowed to change the display but you neither want them to safethe changes nor bother them with the question.THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHE DISPLAY BEFORECLOSE EVENTIn the Display BeforeClose routine we set the modified property of the Display to false:Private Sub Display BeforeClose(bCancelDefault As Boolean)' Do not save changesThisDisplay.Modified FalseEnd Sub13

PASS THE CONTEXT FROM PARENT TO CHILD(MODULE RELATIVE DISPLAY)INTRODUCTIONIn this example we will play with the concept of a Module-Relative Display (MRD), which consists ofa unique display that can represent data from a list of similar Modules (as opposed to creating onedisplay per Module). Looking at assets in a "top-down" approach is not uncommon and thereforeone might be interested in opening a child display from another display (i.e. the parent). In thisscenario, passing the "module context" (i.e. the Module you were looking at) from the parent displayto the child display might prove useful, such that the user does not have to re-select the desiredModule from the list.To illustrate the functionality we have built two displays: ParentDisplay.PDI with a Microsoft Forms2.0 CommandButton and a Module Relative Trend showing an Alias and ChildDisplay.PDI with aModule Relative Trend showing an Alias. Both displays use the same modules and we will use theMicrosoft Forms 2.0 CommandButton named cmdOpenChildDisplay to open the child display.THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHECMDOPENCHILDDISPLAY CLICK EVENTThe cmdOpenChildDisplay Click gets fired when the user hits the Command button In the Display.Private Sub cmdOpenChildDisplay Click()End Sub1. First we get the path to the current display and remove the filename:' This will hold the absolute path to the display,' exluding fileameDim myPath As String14

' Get the path from this display, excluding filenamemyPath ThisDisplay.PathmyPath Left(myPath, InStrRev(myPath, "\", -1, vbTextCompare))2. Next we get our own object for ThisDisplay:' Get the current displayDim myParentDisplay As DisplaySet myParentDisplay ThisDisplay3. And the context handlers:' The context handlersDim MrdContextHandler As ContextHandlerSet MrdContextHandler Application.ContextHandlers("ModuleContext")Dim AliasContextHandler As ContextHandlerSet AliasContextHandler Application.ContextHandlers("Alias")Dim PropContextHandler As ContextHandlerSet PropContextHandler Application.ContextHandlers("Property")4. And open the child display:' This will be the Child DisplayDim myChildDisplay As Display' Open the child displaySet myChildDisplay Application.Displays.Open(myPath & "ChildDisplay.PDI", True)5. Now we get the context handlers in sync:' Set all three context handlers to have thesame context in Child and lay) liasContextHandler.CurrentContext(myChildDisplay) )PropContextHandler.CurrentContext(myChildDisplay) 15

PASS THE CONTEXT FROM PARENT TO CHILD(ELEMENT RELATIVE DISPLAY)INTRODUCTIONIn this example we will play with the concept of an Element-Relative Display (ERD), which consists ofa unique display that can represent data from a list of similar AF Elements (as opposed to creatingone display per AF Element). Looking at assets in a "top-down" approach is not uncommon andtherefore one might be interested in opening a child display from another display (i.e. the parent). Inthis scenario, passing the "element context" (i.e. the AF Element you were looking at) from theparent display to the child display might prove useful, such that the user does not have to re-selectthe desired element from the list.To illustrate the functionality we have built two displays: ParentDisplayERD.PDI with a MicrosoftForms 2.0 CommandButton and an Element Relative Trend showing an Attribut andChildDisplayERD.PDI with an Element Relative Trend showing an Attribute. Both displays use thesame AF Elements and we will use the Microsoft Forms 2.0 CommandButton namedcmdOpenChildDisplay to open the child display.THE GENERAL SETTINGSThe Option Explicit statement forces the declaration of all variables.' Make sure we define all our variablesOption ExplicitTHECMDOPENCHILDDISPLAY CLICK EVENTThe cmdOpenChildDisplay Click gets fired when the user hits the Command button In the Display.Private Sub cmdOpenChildDisplay Click()End Sub6. First we get the path to the current display and remove the filename:16

' This will hold the absolute path to the display,' exluding fileameDim myPath As String' Get the path from this display, excluding filenamemyPath ThisDisplay.PathmyPath Left(myPath, InStrRev(myPath, "\", -1, vbTextCompare))7. Next we get our own object for ThisDisplay:' Get the current displayDim myParentDisplay As DisplaySet myParentDisplay ThisDisplay8. And the context handler:' The context handlersDim ErdContextHandler As ContextHandlerSet ErdContextHandler Application.ContextHandlers("E")9. And open the child display:' This will be the Child DisplayDim myChildDisplay As Display' Open the ChilddisplaySet myChildDisplay Application.Displays.Open(myPath & "ChildDisplayERD.PDI", True)10. Now we get the context handler in sync:' Set all three context handlers to have thesame context in Child and lay) ote: The code is almost identical to the module context, except that you have only one context(not the one for alias and property), and its name is “E”.17

REVISION HISTORY2006Initial DevNet version by Curt Hertler (Click Value AdHocTrend) and Tom Hosea(Click Value Trend)09-Mar-09AS Conversion to vCampus format09-Mar-09AS Minor changes10-Mar-09AS added XYPlot10-Aug-09SP Minor changes05-May-10AS Minor fixes in the code examples, some updates:- SetViewPort- Modified property- Module Context- Element Context12-May-10AS Minor changes18

2 "ONE-CLICK VALUE TREND" VBA SCRIPT INTRODUCTION The "One-Click Value Trend" VBA script places a displayed value into a PI ProcessBook trend when it is selected. You can access a trend of any value in your display.This VBA script references a Trend object named PointTr

Related Documents:

Updated to include preliminary information on the VBA language from the pre-release version of VBA 7. 3/15/2010 1.0 Major Updated to include information on the VBA language as of VBA 7. 3/15/2012 1.01 Major Updated to include information on the VBA language as of VBA

13.2. Excel and VBA Implementation 248 APPENDIX A VBA Programming 255 A.1 Introduction 255 A.2 A Brief History of VBA 255 A.3 Essential Excel Elements for VBA 256 A.3.1 Excel Cell Reference 257 A.3.2 Excel Defined Names 261 A.3.3 Excel Worksheet Functions 264 A.4 The VBA Development Enviro

We can use VBA in all office versions right from MS-Office 97 to MS-Office 2013 and also with any of the latest versions available. Among VBA, Excel VBA is the most popular one and the reason for using VBA is that we can build very powerful tools in MS Excel using linear programming. Application of VBA

Programming: VBA in MS Office – An Introduction 3 IT Learning Programme 1.4. What is VBA? VBA is a high-level programming language that sits behind the Microsoft Office suite of applications. It is made available, through the built-in VBA Editor in each applicable application, to the end user to create code that can be executed within

VBA4-Using Cell Formulas in VBA Page 3 of 7 O:\COURSES\VBA\Online VBA\VBA4-Using Cell Formulas in VBA.docx 8. While ActiveCell.Value "" is the way to loop as long as there is a value in the current cell. You also might use an offset: While ActiveCell.Offset(0,-1).Value "" will test the column to the left of the current column.

begin using VBA and writing a simple macro. You access VBA through Inventor using the Macro Visual Basic Editor command in the Tools menu, or by pressing Alt-F11. Once the VBA environment is open, the first thing I recommend you do is change some of the VBA settings. In the VBA environment run the Options command from the Tools menu. Change the

VBA The Virginia Bar Association 701 East Franklin Street, Suite 1120 Richmond, VA 23219 (804) 644-0041 FAX: (804) 644-0052 E-mail: thevba@vba.org Web: www.vba.org

Level 4 IS Business Analyst Minimum Standards and Grading Criteria This paper defines the minimum requirements for the knowledge, skills and behaviours defined in the standard, which are required for a pass. It also defines the criteria to be used for awarding the grade for merit or distinction. This paper should be read in conjunction with the Standard and Assessment Plan for the Level 4 IS .