diff options
Diffstat (limited to 'migrationanalysis/src')
-rw-r--r-- | migrationanalysis/src/driver_docs/allstrings.ulf | 4742 | ||||
-rw-r--r-- | migrationanalysis/src/driver_docs/sources/AnalysisDriver.bas | 7278 | ||||
-rw-r--r-- | migrationanalysis/src/driver_docs/sources/CommonMigrationAnalyser.bas | 2224 | ||||
-rw-r--r-- | migrationanalysis/src/driver_docs/sources/word/MigrationAnalyser.cls | 3036 | ||||
-rw-r--r-- | migrationanalysis/src/msokill/msokill.cpp | 2 | ||||
-rw-r--r-- | migrationanalysis/src/wizard/Wizard.frm | 6906 |
6 files changed, 12094 insertions, 12094 deletions
diff --git a/migrationanalysis/src/driver_docs/allstrings.ulf b/migrationanalysis/src/driver_docs/allstrings.ulf index 1185b6ec99b5..c3544bd46193 100644 --- a/migrationanalysis/src/driver_docs/allstrings.ulf +++ b/migrationanalysis/src/driver_docs/allstrings.ulf @@ -19,2374 +19,2374 @@ * *************************************************************/ -[RID_STR_COMMON_PRODUCTNAME]
-en-US = "OpenOffice.org"
-
-[RID_STR_COMMON_PRODUCTVERSION]
-en-US = "3.0"
-
-[RID_STR_COMMON_NEXTPRODUCTVERSION]
-en-US = "3.1"
-
-[RID_STR_COMMON_OLE_CONTROL]
-en-US = "OLE Control"
-
-[RID_STR_COMMON_OLE_FIELD_LINK]
-en-US = "OLE Field Link"
-
-[RID_STR_COMMON_OLE_UNKNOWN]
-en-US = "Unknown Type"
-
-[RID_STR_COMMON_VB_COMPONENT_MODULE]
-en-US = "Module"
-
-[RID_STR_COMMON_VB_COMPONENT_STANDARD]
-en-US = "Standard Module"
-
-[RID_STR_COMMON_VB_COMPONENT_CLASS]
-en-US = "Class Module"
-
-[RID_STR_COMMON_VB_COMPONENT_USER_FORM]
-en-US = "User Form"
-
-[RID_STR_COMMON_VB_COMPONENT_DOCUMENT]
-en-US = "Document"
-
-[RID_STR_COMMON_VB_COMPONENT_ACTIVEX_DESIGNER]
-en-US = "ActiveX Designer"
-
-[RID_STR_COMMON_VB_COMPONENT_UNKNOWN]
-en-US = "Unknown"
-
-[RID_STR_COMMON_YES_OR_NO]
-en-US = "Yes or No"
-
-[RID_STR_COMMON_DATE]
-en-US = "Date"
-
-[RID_STR_COMMON_NUMBER]
-en-US = "Number"
-
-[RID_STR_COMMON_TEXT]
-en-US = "Text"
-
-[RID_STR_COMMON_UNKNOWN]
-en-US = "Unknown"
-
-[RID_STR_COMMON_DEC_TO_EXTERNAL_LIBRARY]
-en-US = "Declaration to external library"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_DOCUMENT]
-en-US = "Document"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_PAGE]
-en-US = "Page"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_WORKBOOK]
-en-US = "WorkBook"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_SHEET]
-en-US = "Sheet"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_PRESENTATION]
-en-US = "Presentation"
-
-[RID_STR_COMMON_RESULTS_LOCATION_TYPE_SLIDE]
-en-US = "Slide"
-
-[RID_STR_COMMON_INVALID_PASSWORD]
-en-US = "Invalid Password"
-
-[RID_STR_COMMON_PASSWORD_SKIPDOC]
-en-US = "Skip Password Protected"
-
-[RID_STR_COMMON_NA]
-en-US = "na"
-
-[RID_STR_COMMON_ATTRIBUTE_BROKEN]
-en-US = "Broken!"
-
-[RID_STR_COMMON_ATTRIBUTE_BUILTIN]
-en-US = "BuiltIn"
-
-[RID_STR_COMMON_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES]
-en-US = "Check document VB-IDE/Tools/References"
-
-[RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT]
-en-US = "Class refs to Me"
-
-[RID_STR_COMMON_ATTRIBUTE_COMPONENT]
-en-US = "Component"
-
-[RID_STR_COMMON_ATTRIBUTE_CONTROLS]
-en-US = "Controls"
-
-[RID_STR_COMMON_ATTRIBUTE_CUSTOM]
-en-US = "Custom"
-
-[RID_STR_COMMON_ATTRIBUTE_DESCRIPTION]
-en-US = "Description"
-
-[RID_STR_COMMON_ATTRIBUTE_GUID]
-en-US = "GUID"
-
-[RID_STR_COMMON_ATTRIBUTE_FILE]
-en-US = "File"
-
-[RID_STR_COMMON_ATTRIBUTE_PROPERTIES]
-en-US = "Properties"
-
-[RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE]
-en-US = "Further macro analysis not possible"
-
-[RID_STR_COMMON_ATTRIBUTE_INCLUDING]
-en-US = "including:"
-
-[RID_STR_COMMON_ATTRIBUTE_INTACT]
-en-US = "Intact"
-
-[RID_STR_COMMON_ATTRIBUTE_ISBROKEN]
-en-US = "IsBroken"
-
-[RID_STR_COMMON_ATTRIBUTE_MAJOR]
-en-US = "Major"
-
-[RID_STR_COMMON_ATTRIBUTE_MINOR]
-en-US = "Minor"
-
-[RID_STR_COMMON_ATTRIBUTE_MISSING]
-en-US = "MISSING"
-
-[RID_STR_COMMON_ATTRIBUTE_NAME]
-en-US = "Name"
-
-[RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES]
-en-US = "Non Portable External References"
-
-[RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT]
-en-US = "External Reference Count"
-
-[RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES]
-en-US = "Number of Lines"
-
-[RID_STR_COMMON_ATTRIBUTE_SIGNATURE]
-en-US = "MD5 Hash"
-
-[RID_STR_COMMON_ATTRIBUTE_PASSWORD]
-en-US = "Password"
-
-[RID_STR_COMMON_ATTRIBUTE_PATH]
-en-US = "Path"
-
-[RID_STR_COMMON_ATTRIBUTE_PROCEDURES]
-en-US = "Procedures"
-
-[RID_STR_COMMON_ATTRIBUTE_PROJECT]
-en-US = "Project"
-
-[RID_STR_COMMON_ATTRIBUTE_TYPE]
-en-US = "Type"
-
-[RID_STR_COMMON_ATTRIBUTE_TYPELIB]
-en-US = "Type Library"
-
-[RID_STR_COMMON_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT]
-en-US = "Unable to access VBProject"
-
-[RID_STR_COMMON_ATTRIBUTE_UNKNOWN]
-en-US = "Unknown"
-
-[RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE]
-en-US = "Control Types"
-
-[RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT]
-en-US = "Control Types Count"
-
-[RID_STR_COMMON_ATTRIBUTE_VALUE]
-en-US = "Value"
-
-[RID_STR_COMMON_ATTRIBUTE_VBPROJECT_PASSWORD]
-en-US = "VBProject Password set"
-
-[RID_STR_COMMON_ISSUE_INFORMATION]
-en-US = "Information"
-
-[RID_STR_COMMON_ISSUE_FORMAT]
-en-US = "Format"
-
-[RID_STR_COMMON_ISSUE_PORTABILITY]
-en-US = "Portability"
-
-[RID_STR_COMMON_ISSUE_VBA_MACROS]
-en-US = "VBA Macros"
-
-[RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES]
-en-US = "Content and Document Properties"
-
-[RID_STR_COMMON_NOTE_DOCUMENT_PROPERTIES_LOST]
-en-US = "this summary property is lost"
-
-[RID_STR_COMMON_SUBISSUE_PROPERTIES]
-en-US = "Properties"
-
-[RID_STR_COMMON_SUBISSUE_REFERENCES]
-en-US = "References"
-
-[RID_STR_COMMON_SUBISSUE_EXTERNAL_REFERENCES_IN_MACROS]
-en-US = "External References in Macro"
-
-[RID_STR_COMMON_SUBISSUE_INVALID_PASSWORD_ENTERED]
-en-US = "Invalid Password Entered"
-
-[RID_STR_COMMON_SUBISSUE_DOCUMENT_PARTS_PROTECTION]
-en-US = "Document Parts Protection"
-
-[RID_STR_COMMON_SUBISSUE_MACRO_PASSWORD_PROTECTION]
-en-US = "Password Protected"
-
-[RID_STR_COMMON_SUBISSUE_PASSWORDS_PROTECTION]
-en-US = "Password Protection"
-
-[RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME]
-en-US = "Object Name"
-
-[RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE]
-en-US = "Object Type"
-
-[RID_STR_COMMON_ATTRIBUTE_SOURCE]
-en-US = "Source"
-
-[RID_STR_COMMON_NOTE_HF_PREPARABLE]
-en-US = "will add additional returns to the header/footer"
-
-[RID_STR_COMMON_PREPARATION_FOLDER]
-en-US = "prepared"
-
-[RID_STR_COMMON_SUBISSUE_DOCUMENT_CUSTOM_PROPERTY]
-en-US = "Document Custom Property"
-
-[RID_STR_COMMON_MACRO_CLASS_COMPLEX]
-en-US = "Complex"
-
-[RID_STR_COMMON_MACRO_CLASS_MEDIUM]
-en-US = "Medium"
-
-[RID_STR_COMMON_MACRO_CLASS_SIMPLE]
-en-US = "Simple"
-
-[RID_STR_COMMON_MACRO_CLASS_NONE]
-en-US = "No Macros"
-
-[RID_STR_COMMON_ISSUE_CLASS_COMPLEX]
-en-US = "Complex"
-
-[RID_STR_COMMON_ISSUE_CLASS_MINOR]
-en-US = "Minor"
-
-[RID_STR_COMMON_ISSUE_CLASS_NONE]
-en-US = "No Issues"
-
-[RID_STR_COMMON_OV_VERSION_STR]
-en-US = "Created by"
-
-[RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_TITLE]
-en-US = "Which documents do you need to migrate?"
-
-[RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_BODY]
-en-US = "<CR>The last modified date is an indicator of the importance of a document. It helps you decide which documents should just be archived to a read only format such as Adobe PDF and which actually need to be migrated to <PRODUCTNAME> where they can continue to be updated and modified."
-
-[RID_STR_COMMON_OV_LEGEND_TITLE]
-en-US = "Legend"
-
-[RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY]
-en-US = "< 3 months: Migrate to <PRODUCTNAME>.<CR>3 - 6 Months: Careful review to see if they should be archived or migrated to <PRODUCTNAME>.<CR>6 - 12 Months: Quick review, either archive or migrate to the read/write <PRODUCTNAME> XML file format.<CR>> 1 Year: Older than 1 year, archive to read-only format such as PDF"
-
-[RID_STR_COMMON_OV_DOC_MACRO_COMMENT_TITLE]
-en-US = "How many documents contain macros?"
-
-[RID_STR_COMMON_OV_DOC_MACRO_COMMENT_BODY]
-en-US = "<CR><PRODUCTNAME> includes <PRODUCTNAME> BASIC, a Basic dialect that is similar to Microsoft's Visual Basic for Application (VBA), but <PRODUCTNAME> uses a different sets of objects to access the underlying Office.<CR>This makes it necessary to migrate the VBA macros into the platform independent <PRODUCTNAME> BASIC. Your local <PRODUCTNAME> Migration partner can help you with these VBA macro migrations."
-
-[RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY]
-en-US = "Complex: Macros using Forms, Controls and external references<CR>Medium: Macros with more than 50 lines of code<CR>Simple: Macros with less than 50 lines of code<CR>None: No macros in the document"
-
-[RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_DAW]
-en-US = "Analysis of document migration issues for documents modified within the last <TOPIC> months"
-
-[RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT]
-en-US = "High level analysis of document migration issues"
-
-[RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_TITLE]
-en-US = "Which documents may have migration issues?"
-
-[RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_BODY]
-en-US = "<CR>Some Microsoft Office documents may not migrate perfectly into <PRODUCTNAME>. These issues are outlined in the <PRODUCTNAME> Migration Guide. <PRODUCTNAME> engineering is working continously to resolve these issues by improving the Microsoft Office filters.<CR>The Document Analysis Wizard has been provided by <PRODUCTNAME> engineering to detect the most important of these migration issues in any Microsoft Office document you wish to specify. These findings are summarised below [refer to the 'List of documents' sheet to see the list of all analyzed documents]."
-
-[RID_STR_COMMON_OV_DOC_ANALYSIS_DAW_LEGEND_BODY]
-en-US = "Complex: More complex migration issues.<CR>Minor: Minor migration issues easily fixed by any user.<CR>None: No issues Migrate to <PRODUCTNAME> without any issues.<CR><CR>Your <PRODUCTNAME> Migration Partners can help you with these more complex migration issues [refer to link above]. For instance they can migrate these documents to custom templates that achieve the same functionality but work well in both Office environments allowing the documents to be freely exchanged."
-
-[RID_STR_COMMON_OV_DOC_ANALYSIS_PAW_LEGEND_BODY]
-en-US = "Complex: More complex migration issues.<CR>Minor: Minor migration issues easily fixed by any user.<CR>None: No issues Migrate to <PRODUCTNAME> without any issues."
-
-[RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE]
-en-US = "Document modification dates"
-
-[RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE]
-en-US = "Document with Macro Migration Issues"
-
-[RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE]
-en-US = "Documents with Document Migration Issues"
-
-[RID_STR_COMMON_PREPARATION_NOTE]
-en-US = "Preparation"
-
-[RID_STR_COMMON_CANNOT_OPEN]
-en-US = "Cannot open - no analysis possible"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW]
-en-US = "Overview"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_COSTS]
-en-US = "Issues Analyzed"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD]
-en-US = "Word Issues"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL]
-en-US = "Excel Issues"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT]
-en-US = "PowerPoint Issues"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS]
-en-US = "Issue Details"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS]
-en-US = "Reference Details"
-
-[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP]
-en-US = "List of documents"
-
-[RID_STR_COMMON_ANALYSIS_STR]
-en-US = "Analysis"
-
-[RID_STR_COMMON_NOTE_PRE]
-en-US = "Note"
-
-[RID_STR_COMMON_NOTE_POST]
-en-US = " on migration"
-
-[RID_STR_COMMON_OLE_EMBEDDED]
-en-US = "Embedded OLE Object"
-
-[RID_STR_COMMON_OLE_LINKED]
-en-US = "Linked OLE Object"
-
-[RID_STR_EXCEL_ISSUE_CHARTS_AND_TABLES]
-en-US = "Charts and Tables"
-
-[RID_STR_EXCEL_ISSUE_FORMAT]
-en-US = "Format"
-
-[RID_STR_EXCEL_ISSUE_FUNCTIONS]
-en-US = "Functions"
-
-[RID_STR_EXCEL_ISSUE_PORTABILITY]
-en-US = "Portability"
-
-[RID_STR_EXCEL_ISSUE_VBA_MACROS]
-en-US = "VBA Macros"
-
-[RID_STR_EXCEL_ISSUE_INFORMATION]
-en-US = "Information"
-
-[RID_STR_EXCEL_SUBISSUE_PIVOT]
-en-US = "Pivot"
-
-[RID_STR_EXCEL_SUBISSUE_ZOOM]
-en-US = "Zoom"
-
-[RID_STR_EXCEL_TRUE]
-en-US = "True"
-
-[RID_STR_EXCEL_FALSE]
-en-US = "False"
-
-[RID_STR_EXCEL_SUBISSUE_MAX_SHEETS_EXCEEDED]
-en-US = "Maximum Sheets Exceeded"
-
-[RID_STR_EXCEL_SUBISSUE_ATTRIBUTES]
-en-US = "Cell Attributes"
-
-[RID_STR_EXCEL_SUBISSUE_EXTERNAL]
-en-US = "External"
-
-[RID_STR_EXCEL_SUBISSUE_SHEET_CHART]
-en-US = "Sheet Chart"
-
-[RID_STR_EXCEL_SUBISSUE_EMBEDDED_CHART]
-en-US = "Embedded Chart"
-
-[RID_STR_EXCEL_SUBISSUE_INVALID_WORKSHEET_NAME]
-en-US = "Invalid Worksheet Name"
-
-[RID_STR_EXCEL_ATTRIBUTE_BADCHARACTER]
-en-US = "'<TOKEN1>' at pos <TOKEN2>"
-
-[RID_STR_EXCEL_ATTRIBUTE_DB_QUERY]
-en-US = "Connection string"
-
-[RID_STR_EXCEL_ATTRIBUTE_NAME]
-en-US = "Name"
-
-[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_PIVOTFIELDS]
-en-US = "Number of PivotFields"
-
-[RID_STR_EXCEL_ATTRIBUTE_TITLE]
-en-US = "Title"
-
-[RID_STR_EXCEL_ATTRIBUTE_TYPE]
-en-US = "Type"
-
-[RID_STR_EXCEL_ATTRIBUTE_PIE]
-en-US = "Pie"
-
-[RID_STR_EXCEL_ATTRIBUTE_SLICES_IN_DIFFERENT_DIRECTION]
-en-US = "Slices in diff. direction"
-
-[RID_STR_EXCEL_ATTRIBUTE_LEGEND_NAME]
-en-US = "Legend Name"
-
-[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_LEGEND_ENTRIES]
-en-US = "Number of Legend Entries"
-
-[RID_STR_EXCEL_ATTRIBUTE_PIVOT_TABLE_NAME]
-en-US = "PivotTable Name"
-
-[RID_STR_EXCEL_ATTRIBUTE_PIVOT_FIELDS_VISIBLE]
-en-US = "PivotFields Visible"
-
-[RID_STR_EXCEL_ATTRIBUTE_PIVOT_FIELDS_NUM]
-en-US = "Number of PivotFields"
-
-[RID_STR_EXCEL_ATTRIBUTE_PRINT_RANGE]
-en-US = "Print Range"
-
-[RID_STR_EXCEL_ATTRIBUTE_DISPLAY_ZOOM]
-en-US = "Display Zoom"
-
-[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_SHEETS]
-en-US = "Number of Sheets"
-
-[RID_STR_EXCEL_ATTRIBUTE_LIST_SOURCE]
-en-US = "ListSource"
-
-[RID_STR_EXCEL_ATTRIBUTE_CUSTOM_FORMULA]
-en-US = "Custom Formula"
-
-[RID_STR_EXCEL_ATTRIBUTE_SET]
-en-US = "Set"
-
-[RID_STR_EXCEL_ATTRIBUTE_LINE_STYLE]
-en-US = "Line Style"
-
-[RID_STR_EXCEL_ATTRIBUTE_DASHED_DOT]
-en-US = "Dashed/Dot"
-
-[RID_STR_EXCEL_ATTRIBUTE_FILL_PATTERN]
-en-US = "Fill Pattern"
-
-[RID_STR_EXCEL_ATTRIBUTE_PATTERNED]
-en-US = "Patterned"
-
-[RID_STR_EXCEL_ATTRIBUTE_FUNCTION_STRING]
-en-US = "Function String"
-
-[RID_STR_EXCEL_ATTRIBUTE_PASSWORD_TO_OPEN]
-en-US = "Password to Open"
-
-[RID_STR_EXCEL_ATTRIBUTE_PASSWORD_TO_MODIFY]
-en-US = "Password to Modify"
-
-[RID_STR_EXCEL_ATTRIBUTE_OBJECT_TYPE]
-en-US = "Object Type"
-
-[RID_STR_EXCEL_ATTRIBUTE_OBJECT_NAME]
-en-US = "Object Name"
-
-[RID_STR_EXCEL_ATTRIBUTE_SOURCE]
-en-US = "Source"
-
-[RID_STR_EXCEL_ATTRIBUTE_VALUE]
-en-US = "Value"
-
-[RID_STR_EXCEL_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT]
-en-US = "Unable to access VBProject"
-
-[RID_STR_EXCEL_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE]
-en-US = "Further macro analysis not possible"
-
-[RID_STR_EXCEL_ATTRIBUTE_VBPROJECT_PASSWORD_SET]
-en-US = "VBProject Password Set"
-
-[RID_STR_EXCEL_ATTRIBUTE_PROJECT]
-en-US = "Project"
-
-[RID_STR_EXCEL_ATTRIBUTE_COMPONENT]
-en-US = "Component"
-
-[RID_STR_EXCEL_ATTRIBUTE_PROCEDURES]
-en-US = "Procedures"
-
-[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_LINES]
-en-US = "Number of Lines"
-
-[RID_STR_EXCEL_ATTRIBUTE_CONTROLS]
-en-US = "Controls"
-
-[RID_STR_EXCEL_ATTRIBUTE_TYPES]
-en-US = "Types"
-
-[RID_STR_EXCEL_ATTRIBUTE_DESCRIPTION]
-en-US = "Description"
-
-[RID_STR_EXCEL_ATTRIBUTE_FILE]
-en-US = "File"
-
-[RID_STR_EXCEL_ATTRIBUTE_PATH]
-en-US = "Path"
-
-[RID_STR_EXCEL_ATTRIBUTE_MISSING]
-en-US = "MISSING"
-
-[RID_STR_EXCEL_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES]
-en-US = "Check document VB-IDE/Tools/References"
-
-[RID_STR_EXCEL_ATTRIBUTE_MAJOR]
-en-US = "Major"
-
-[RID_STR_EXCEL_ATTRIBUTE_MINOR]
-en-US = "Minor"
-
-[RID_STR_EXCEL_ATTRIBUTE_BUILT_IN]
-en-US = "Built In"
-
-[RID_STR_EXCEL_ATTRIBUTE_INTACT]
-en-US = "Intact"
-
-[RID_STR_EXCEL_ATTRIBUTE_TYPELIB]
-en-US = "TypeLib"
-
-[RID_STR_EXCEL_ATTRIBUTE_GUID]
-en-US = "GUID"
-
-[RID_STR_EXCEL_ATTRIBUTE_CUSTOM]
-en-US = "Custom"
-
-[RID_STR_EXCEL_ATTRIBUTE_IS_BROKEN]
-en-US = "Is Broken"
-
-[RID_STR_EXCEL_ATTRIBUTE_BROKEN]
-en-US = "Broken!"
-
-[RID_STR_EXCEL_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES]
-en-US = "Non Portable External References"
-
-[RID_STR_EXCEL_ATTRIBUTE_INCLUDING]
-en-US = "including:"
-
-[RID_STR_EXCEL_ATTRIBUTE_PASSWORD]
-en-US = "Password"
-
-[RID_STR_EXCEL_ENUMERATION_CUSTOM]
-en-US = "Custom"
-
-[RID_STR_EXCEL_ENUMERATION_LIST]
-en-US = "List"
-
-[RID_STR_EXCEL_ENUMERATION_UNKNOWN]
-en-US = "Unknown"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_CONTINUOUS]
-en-US = "Continuous"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DASH]
-en-US = "Dash"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DASHDOT]
-en-US = "DashDot"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DOT]
-en-US = "Dot"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DOUBLE]
-en-US = "Double"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_SLANTDASHDOT]
-en-US = "SlantDashDot"
-
-[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_LINESTYLENONE]
-en-US = "LineStyleNone"
-
-[RID_STR_EXCEL_NOTE_DB_QUERY]
-en-US = "The connection to the database in <PRODUCTNAME> will be lost . The data will appear correctly but can not be updated."
-
-[RID_STR_EXCEL_NOTE_INVALIDWORKSHEETNAME]
-en-US = "The worksheet name contains characters that are not supported by <PRODUCTNAME>. Please rename your sheet and exclude these characters."
-
-[RID_STR_EXCEL_NOTE_ZOOM]
-en-US = "all sheets will have the same zoom irrespective of their Excel View/Zoom setting after migration to <PRODUCTNAME>"
-
-[RID_STR_EXCEL_NOTE_CELL_ATTRIBUTES_3]
-en-US = "this line style is imported as a solid line. Only solid line syles are supported in <PRODUCTNAME>"
-
-[RID_STR_EXCEL_NOTE_CELL_ATTRIBUTES_4]
-en-US = "this fill pattern is imported as a solid gray. Only solid fill patterns are supported in <PRODUCTNAME>"
-
-[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_1]
-en-US = "this function returns platform dependent information specific to Windows and is not imported to <PRODUCTNAME>"
-
-[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_2]
-en-US = "this function returns error codes specific to Excel and is imported in <PRODUCTNAME> as the stub function ErrorType() always returning Err.520"
-
-[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_3]
-en-US = "this is an external function referenced from an Excel spreadsheet. It does not import correctly to <PRODUCTNAME>. The external reference is stripped and the resulting formula always returns #ADDIN?"
-
-[RID_STR_EXCEL_NOTE_DOCUMENT_PROPERTIES_1]
-en-US = "this summary property is lost"
-
-[RID_STR_EXCEL_NOTE_DOCUMENT_PROPERTIES_2]
-en-US = "this custom property is lost"
-
-[RID_STR_EXCEL_NOTE_SHEET_LIMITS_1]
-en-US = "all sheets will be lost in <PRODUCTNAME> that are greater than "
-
-[RID_STR_EXCEL_NOTE_SHEET_LIMITS_2]
-en-US = "all sheets must be moved to a new workbook before migration that are greater than "
-
-[RID_STR_EXCEL_SUBLOCATION_NA]
-en-US = "na"
-
-[RID_STR_EXCEL_SUBISSUE_WORKBOOK_PROTECTION]
-en-US = "Workbook Protection"
-
-[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_SHARING]
-en-US = "Protection Sharing"
-
-[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_STRUCTURE]
-en-US = "Protection Structure"
-
-[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_WINDOWS]
-en-US = "Protection Windows"
-
-[RID_STR_EXCEL_NOTE_PASSWORD_TO_OPEN]
-en-US = "workbook is protected"
-
-[RID_STR_EXCEL_NOTE_DATATABLE]
-en-US = "no simple workaround, could copy the data table and paste below the chart"
-
-[RID_STR_EXCEL_NOTE_XAXISCATEGORY]
-en-US = "only category option supported. Setup your category labels you need on the sheet"
-
-[RID_STR_EXCEL_NOTE_UNSUPPORTEDTYPE1]
-en-US = "following chart types not supported"
-
-[RID_STR_EXCEL_NOTE_UNSUPPORTEDTYPE2]
-en-US = "pie of pie,exploded 3D pie,bar of pie,bubble,filled radar,exploded doughnut"
-
-[RID_STR_EXCEL_NOTE_TRENDLINE]
-en-US = "replace the trend line by drawing a line on the chart. You must click outside the chart when adding the line and drag it onto the chart. Objects created by clicking on the chart will not import"
-
-[RID_STR_EXCEL_NOTE_DATALABELWITHLEGEND]
-en-US = "after import into <PRODUCTNAME>, select Insert->Data Labels->show legend icon with label and the legend key will appear"
-
-[RID_STR_EXCEL_NOTE_LEGENDPOSITION]
-en-US = "only legend to the right is supported on import. Change legend position in <PRODUCTNAME> after import"
-
-[RID_STR_EXCEL_NOTE_TITLEFONT]
-en-US = "title font with different font size is not supported on import, set a sub-title in <PRODUCTNAME>, then change the font size"
-
-[RID_STR_EXCEL_NOTE_SERIESCHARTTYPE]
-en-US = "multiple series with different chart types. SO only supports one chart type for all series. Adjust the chart type to best display the series"
-
-[RID_STR_EXCEL_NOTE_DATASOURCENOTLINKEDTOCELL]
-en-US = "data sources to catalogue or other external sources not supported. Data source must be set to cell or range on the sheet"
-
-[RID_STR_EXCEL_NOTE_CATEGORYANDDATA]
-en-US = "category names must be located above or to the left of the value ranges"
-
-[RID_STR_EXCEL_NOTE_DATASOURCEONDIFFERENTSHEET]
-en-US = "data sources must be located on the same sheet. Paste the data sources onto the same sheet"
-
-[RID_STR_EXCEL_NOTE_CATEGORYLABELMORETHANONECELL]
-en-US = "category labels spanning multiple cells are not supported. Copy all the text to one cell"
-
-[RID_STR_EXCEL_NOTE_COLUMNBAR]
-en-US = "chart 'series in' must match the data source. For data source in single row, set 'series in' = row. For data source in single column, set 'series in' = column"
-
-[RID_STR_EXCEL_NOTE_BORDER]
-en-US = "chart border will not appear in <PRODUCTNAME>, before import,set border to none, draw a rectangle around the border of the chart"
-
-[RID_STR_EXCEL_NOTE_AXISINTERVAL]
-en-US = " y axis interval setting will be changed in <PRODUCTNAME>. Modify axes interval setting in <PRODUCTNAME>, re-set major interval scale"
-
-[RID_STR_EXCEL_ATTRIBUTE_DATATABLE]
-en-US = "Data Table"
-
-[RID_STR_EXCEL_ATTRIBUTE_INVALIDCHARACTER]
-en-US = "Invalid Characters"
-
-[RID_STR_EXCEL_ATTRIBUTE_XAXISCATEGORY]
-en-US = "Chart Axes"
-
-[RID_STR_EXCEL_ATTRIBUTE_TIMESCALE]
-en-US = "time scale/auto"
-
-[RID_STR_EXCEL_ATTRIBUTE_UNSUPPORTEDTYPE]
-en-US = "Unsupported Chart Type"
-
-[RID_STR_EXCEL_ATTRIBUTE_TRENDLINE]
-en-US = "Trendline"
-
-[RID_STR_EXCEL_ATTRIBUTE_DATALABELWITHLEGEND]
-en-US = "Data Label With Legend"
-
-[RID_STR_EXCEL_ATTRIBUTE_LEGENDPOSITION]
-en-US = "Legend Position"
-
-[RID_STR_EXCEL_ATTRIBUTE_TITLEFONT]
-en-US = "Title Font"
-
-[RID_STR_EXCEL_ATTRIBUTE_DIFFERENT]
-en-US = "Different"
-
-[RID_STR_EXCEL_ATTRIBUTE_SERIESCHARTTYPE]
-en-US = "Multiple series chart type"
-
-[RID_STR_EXCEL_ATTRIBUTE_CHANGED]
-en-US = "changed"
-
-[RID_STR_EXCEL_ATTRIBUTE_DATASOURCE]
-en-US = "Data Source"
-
-[RID_STR_EXCEL_ATTRIBUTE_DATASOURCENOTLINKEDTOCELL]
-en-US = "Not Linked To A Cell"
-
-[RID_STR_EXCEL_ATTRIBUTE_CATEGORYANDDATA]
-en-US = "Category And Data"
-
-[RID_STR_EXCEL_ATTRIBUTE_SEPARATE]
-en-US = "Separate"
-
-[RID_STR_EXCEL_ATTRIBUTE_DATASOURCEONDIFFERENTSHEET]
-en-US = "On Different Sheet"
-
-[RID_STR_EXCEL_ATTRIBUTE_CATEGORYLABEL]
-en-US = "Category Label"
-
-[RID_STR_EXCEL_ATTRIBUTE_CATEGORYLABELMORETHANONECELL]
-en-US = "More Than One Cell"
-
-[RID_STR_EXCEL_ATTRIBUTE_COLUMNBAR]
-en-US = "Column/Bar Chart"
-
-[RID_STR_EXCEL_ATTRIBUTE_ONECOLUMNROW]
-en-US = "Data Source With Single Column/ Chart Series In Row"
-
-[RID_STR_EXCEL_ATTRIBUTE_BORDER]
-en-US = "Border"
-
-[RID_STR_EXCEL_ATTRIBUTE_AXISINTERVAL]
-en-US = "Y Axis Interval"
-
-[RID_STR_EXCEL_ATTRIBUTE_AUTO]
-en-US = "Auto"
-
-[RID_STR_EXCEL_ATTRIBUTE_CHARTNAME]
-en-US = "Chart Name"
-
-[RID_STR_EXCEL_SUBISSUE_CHART_COMPLEX]
-en-US = "Chart Issues Complex"
-
-[RID_STR_EXCEL_SUBISSUE_CHART_MINOR]
-en-US = "Chart Issues Minor"
-
-[RID_STR_EXCEL_ATTRIBUTE_NOTRIGHT]
-en-US = "not at right hand side"
-
-[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_CELLS]
-en-US = "number cells effected"
-
-[RID_STR_PP_TRUE]
-en-US = "True"
-
-[RID_STR_PP_FALSE]
-en-US = "False"
-
-[RID_STR_PP_ISSUE_OBJECTS_GRAPHICS_AND_TEXTBOXES]
-en-US = "Objects, Graphics and Textboxes"
-
-[RID_STR_PP_SUBISSUE_COMMENT]
-en-US = "Comment"
-
-[RID_STR_PP_SUBISSUE_MOVIE]
-en-US = "Movie"
-
-[RID_STR_PP_ATTRIBUTE_CONTENT]
-en-US = "Content"
-
-[RID_STR_PP_ATTRIBUTE_LOOP]
-en-US = "Loop"
-
-[RID_STR_PP_ATTRIBUTE_PLAYONENTRY]
-en-US = "PlayOnEntry"
-
-[RID_STR_PP_ATTRIBUTE_REWIND]
-en-US = "Rewind"
-
-[RID_STR_PP_ATTRIBUTE_TYPES]
-en-US = "Types"
-
-[RID_STR_PP_ENUMERATION_VIEW_HANDOUT_MASTER]
-en-US = "View Handout Master"
-
-[RID_STR_PP_ENUMERATION_VIEW_NORMAL]
-en-US = "View Normal"
-
-[RID_STR_PP_ENUMERATION_VIEW_NOTES_MASTER]
-en-US = "View Notes Master"
-
-[RID_STR_PP_ENUMERATION_VIEW_NOTES_PAGE]
-en-US = "View Notes Page"
-
-[RID_STR_PP_ENUMERATION_VIEW_OUTLINE]
-en-US = "View Outline"
-
-[RID_STR_PP_ENUMERATION_VIEW_SLIDE]
-en-US = "View Slide"
-
-[RID_STR_PP_ENUMERATION_VIEW_SLIDE_MASTER]
-en-US = "View Slide Master"
-
-[RID_STR_PP_ENUMERATION_VIEW_SLIDE_SORTER]
-en-US = "View Slide Sorter"
-
-[RID_STR_PP_ENUMERATION_VIEW_TITLE_MASTER]
-en-US = "View Title Master"
-
-[RID_STR_PP_ENUMERATION_UNKNOWN]
-en-US = "Unknown"
-
-[RID_RESXLS_COST_Action_Settings]
-en-US = "Action Settings"
-
-[RID_RESXLS_COST_Add_custom_properties_to_document_Properties_Summary_Comments_field]
-en-US = "Add custom properties to document Properties Summary Comments field."
-
-[RID_RESXLS_COST_Additional_Weighting_Factors]
-en-US = "Additional Weighting Factors"
-
-[RID_RESXLS_COST_All_sheets__256_will_need_to_be_moved_to_a_new_workbook]
-en-US = "All sheets >256 will need to be moved to a new workbook"
-
-[RID_RESXLS_COST_Appearance]
-en-US = "Appearance"
-
-[RID_RESXLS_COST_Application]
-en-US = "Application"
-
-[RID_RESXLS_COST_AutoFilter]
-en-US = "AutoFilter"
-
-[RID_RESXLS_COST_Border_Styles]
-en-US = "Border Styles"
-
-[RID_RESXLS_COST_Cell_Attributes]
-en-US = "Cell Attributes"
-
-[RID_RESXLS_COST_CELL_SPAN_WORKAROUND]
-en-US = "Add extra row below cell. Cut and paste contents running onto 2nd page into new cell."
-
-[RID_RESXLS_COST_Cell_Spanning_Page]
-en-US = "Cell Spanning Page"
-
-[RID_RESXLS_COST_ChangesAndReviewing]
-en-US = "Changes And Reviewing"
-
-[RID_RESXLS_COST_Charts_And_Tables]
-en-US = "Charts And Tables"
-
-[RID_RESXLS_COST_Comment]
-en-US = "Comment"
-
-[RID_RESXLS_COST_Content_And_Document_Properties]
-en-US = "Content And Document Properties"
-
-[RID_RESXLS_COST_ContentAndDocumentProperties]
-en-US = "Content And Document Properties"
-
-[RID_RESXLS_COST_Controls]
-en-US = "Controls"
-
-[RID_RESXLS_COST_Cost]
-en-US = "Cost Comment"
-
-[RID_RESXLS_COST_Cost__In_simple_cases_cut_and_paste_to_new_sheet_3___5_min]
-en-US = "Cost: In simple cases cut and paste to new sheet. 3 - 5 min. May exist functions that refer to these cells. 10+"
-
-[RID_RESXLS_COST_COST_0]
-en-US = "Cost = 0. No work around."
-
-[RID_RESXLS_COST_COST_EMBED_CHART]
-en-US = "Variations in cost can range from 0 - 30 mins. Cost caused by uneven data souce, external data source, unsupported chart types, floating legend position."
-
-[RID_RESXLS_COST_COST_ERROR_TYPE]
-en-US = "Fix up cost can vary depending on the context in which this is used. Cost 3 - 5"
-
-[RID_RESXLS_COST_COST_INFO]
-en-US = "Fix up cost can vary depending on the context in which this is used. Cost 2 - 4"
-
-[RID_RESXLS_COST_COST_INVAL_PASS]
-en-US = "Cost = 0. Rerun analysis with correct password."
-
-[RID_RESXLS_COST_COST_INVALID_WORKSHEET_NAME]
-en-US = "Aufewand: Vergewissern Sie sich nach der Umbenennung, dass alle Makros mit Verweisen auf dieses Arbeitsblatt ebenfalls angepaßt werden. Der Aufwand hängt von der Zahl der Codezeilen ab, die auf den Arbeitsblattnamen verweisen."
-en-US = "Cost: When the worksheet has been renamed, ensure that all macros with a reference to the worksheet are also renamed accordingly. Cost depends on how many lines of code there are that refer to the worksheet name."
-
-[RID_RESXLS_COST_Cost_of_4_min_per_line__takes_no_account_of_complexity_of_code__number_of_comment_lines_and_so_on]
-en-US = "Cost of 4 min per line, takes no account of complexity of code, number of comment lines and so on"
-
-[RID_RESXLS_COST_Cost_per_Issue_or_Factor__min]
-en-US = "Cost per Issue or Factor (min)"
-
-[RID_RESXLS_COST_COST_PIVOT]
-en-US = "Cost = 0. Calc does not support dynamically created charts. No workaround."
-
-[RID_RESXLS_COST_COST_SHEET_CHART]
-en-US = "Variations in cost can range from 0 - 30 mins. Cost caused by uneven data souce, external data source, unsupported chart types, floating legend position."
-
-[RID_RESXLS_COST_Cost_variations_occur_because_of_the_use_of_macros_with_controls]
-en-US = "Cost variations occur because of the use of macros with controls."
-
-[RID_RESXLS_COST_COST_VBA_CONT_TYPE]
-en-US = "Cost = 0. Total number of controls better estimate - this information is useful as an indication of complexity of the Forms."
-
-[RID_RESXLS_COST_COST_VBA_CONTROLS]
-en-US = "Cost = 3 minute per control, this does not take account of issues with Frame controls or the number of these controls that have event handlers that need manually linked to migrated code."
-
-[RID_RESXLS_COST_COST_VBA_FORMS]
-en-US = "Cost = 0. Using total number of controls on forms as better estimate"
-
-[RID_RESXLS_COST_COST_VBA_LOC]
-en-US = "Cost of 4 min per line, takes no account of complexity of code, number of comment lines and so on"
-
-[RID_RESXLS_COST_COST_VBA_PROPS]
-en-US = "Cost = 0 using lines of code as better cost estimate."
-
-[RID_RESXLS_COST_Costs__min]
-en-US = "Costs (min)"
-
-[RID_RESXLS_COST_Custom_Bullet_List]
-en-US = "Custom Bullet List"
-
-[RID_RESXLS_COST_Document_Custom_Properties]
-en-US = "Document Custom Properties"
-
-[RID_RESXLS_COST_Document_Parts_Protection]
-en-US = "Document Parts Protection"
-
-[RID_RESXLS_COST_Embedded_Chart]
-en-US = "Chart Issues Minor"
-
-[RID_RESXLS_COST_embedded_objects]
-en-US = "Cost = 0. Most embedded objects come across. If one does not then this may require some reenginering and is not in the scope of an automated cost calculation."
-
-[RID_RESXLS_COST_Embedded_OLE_Object]
-en-US = "Embedded OLE Object"
-
-[RID_RESXLS_COST_Excel]
-en-US = "Excel"
-
-[RID_RESXLS_COST_Excel_Totals]
-en-US = "Excel Totals"
-
-[RID_RESXLS_COST_External]
-en-US = "External"
-
-[RID_RESXLS_COST_External_References_In_Macro___Module__Class_or_UserForm]
-en-US = "External References In Macro - Module, Class or UserForm"
-
-[RID_RESXLS_COST_Factor_Count]
-en-US = "Factor Count"
-
-[RID_RESXLS_COST_Fields]
-en-US = "Fields"
-
-[RID_RESXLS_COST_Filters]
-en-US = "Filters"
-
-[RID_RESXLS_COST_Fixed_SO7]
-en-US = "Fixed <PRODUCTNAME> <PRODUCTVERSION>"
-
-[RID_RESXLS_COST_Form_Field]
-en-US = "Form Field"
-
-[RID_RESXLS_COST_Format]
-en-US = "Format"
-
-[RID_RESXLS_COST_Functions]
-en-US = "Functions"
-
-[RID_RESXLS_COST_Zoom]
-en-US = "Zoom"
-
-[RID_RESXLS_COST_HEADERFOOTER_WORKAROUND]
-en-US = "Insert carriage returns to resize header/ footer to the size of the graphic."
-
-[RID_RESXLS_COST_Hours_Per_MD]
-en-US = "Hours Per MD ="
-
-[RID_RESXLS_COST_Indexes_And_References]
-en-US = "Indexes And References"
-
-[RID_RESXLS_COST_Invalid_Password_Entered]
-en-US = "Invalid Password Entered"
-
-[RID_RESXLS_COST_Invalid_Worksheet_Name]
-en-US = "Invalid Worksheet Name"
-
-[RID_RESXLS_COST_Issue__18_of_the_24_table_border_styles_do_not_display_correctly]
-en-US = "Issue: 18 of the 24 table border styles do not display correctly."
-
-[RID_RESXLS_COST_Issue__256_sheet_limit_exceeded]
-en-US = "Issue: 256 sheet limit exceeded."
-
-[RID_RESXLS_COST_Issue__32000_row_limit_exceeded]
-en-US = "Issue: 32000 row limit exceeded."
-
-[RID_RESXLS_COST_Issue__A_worksheet_in_the_workbook_has_a_name_with_invalid_characters]
-en-US = "Issue: A worksheet in the workbook has a name with invalid characters."
-
-[RID_RESXLS_COST_Issue__AutoFilter_does_not_function_properly]
-en-US = "Issue: AutoFilter does not function properly."
-
-[RID_RESXLS_COST_Issue__Calls_to_windows_API_functions_are_windows_specific]
-en-US = "Issue: Calls to windows API functions are windows specific."
-
-[RID_RESXLS_COST_Issue__Chart_support_is_limited_in_SO7]
-en-US = "Issue: Chart support is limited in <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Comments_are_lost_on_migration_to_SO7]
-en-US = "Issue: Comments are lost on migration to <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Custom_Properties_are_lost_on_migration]
-en-US = "Issue: Custom Properties are lost on migration"
-
-[RID_RESXLS_COST_Issue__Document_is_password_protected_and_cannot_be_opened_by_SO]
-en-US = "Issue: Document is password protected and cannot be opened by SO."
-
-[RID_RESXLS_COST_Issue__External_functions_not_supported_by_SO7]
-en-US = "Issue: External functions not supported by <PRODUCTNAME>"
-
-[RID_RESXLS_COST_Issue__External_references_are_windows_specific]
-en-US = "Issue: External references are windows specific."
-
-[RID_RESXLS_COST_Issue__Fields_are_imported_but_need_to_have_the_link_to_datasource_reset]
-en-US = "Issue: Fields are imported but need to have the link to data source reset."
-
-[RID_RESXLS_COST_Issue__Graphics___frames_in_header_footer_tend_to_be_misplaced]
-en-US = "Issue: Graphics & frames in header footer tend to be misplaced."
-
-[RID_RESXLS_COST_Issue__Incorrect_password_entered]
-en-US = "Issue: Incorrect password entered. "
-
-[RID_RESXLS_COST_Issue__Information_relating_to_the_data_source_is_lost_in_migration]
-en-US = "Issue: Information relating to the data source is lost in migration."
-
-[RID_RESXLS_COST_Issue__Invalid_password_entered_Rerun_analysis]
-en-US = "Issue: Invalid password entered. Rerun analysis."
-
-[RID_RESXLS_COST_Issue__Lost_during_migration_No_StarOffice_equivalent]
-en-US = "Issue: Lost during migration. No <PRODUCTNAME> equivalent."
-
-[RID_RESXLS_COST_Issue__Macros_from_old_workbook_versions_do_not_import_into_SO7]
-en-US = "Issue: Macros from old workbook versions do not import into SO9."
-
-[RID_RESXLS_COST_Issue__Modules_will_need_porting_to_StarOffice_Basic]
-en-US = "Issue: Modules will need porting to <PRODUCTNAME> Basic."
-
-[RID_RESXLS_COST_Issue__Most_migrate_ok_but_do_not_roundtrip]
-en-US = "Issue: Most migrate ok but do not roundtrip."
-
-[RID_RESXLS_COST_Issue__Movies_are_not_supported_by_SO7]
-en-US = "Issue: Movies are not supported by <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Need_to_set_these_to_be_included_in_TOC_in_SO7]
-en-US = "Issue: Need to set these to be included in TOC in <PRODUCTNAME>"
-
-[RID_RESXLS_COST_Issue__Password_protection_of_comments__tracked_changes_and_forms_is_lost]
-en-US = "Issue: Password protection of comments, tracked changes and forms is lost."
-
-[RID_RESXLS_COST_Issue__Pivot_charts_are_not_supported_by_SO7]
-en-US = "Issue: Pivot charts are not supported by <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Presents_a_cross_platform_interoperability_issue]
-en-US = "Issue: Presents a cross platform interoperability issue."
-
-[RID_RESXLS_COST_Issue__Print_wide_pages_not_supported]
-en-US = "Issue: Print wide pages not supported."
-
-[RID_RESXLS_COST_Issue__Shading_can_be_applied_to_fields_and_to_controls_separately_in_Word]
-en-US = "Issue: Shading can be applied to fields and to controls separately in Word. <PRODUCTNAME> does not differentiate between controls and fields so shading can look different in Writer."
-
-[RID_RESXLS_COST_Issue__Table_imported_as_text_as_no_StarOffice_equivalent]
-en-US = "Issue: Table imported as text as no <PRODUCTNAME> equivalent."
-
-[RID_RESXLS_COST_Issue__Tables_nested_in_tables_are_not_supported_by_SO7]
-en-US = "Issue: Tables nested in tables are not supported by <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Tabs_are_incorrect_after_migration]
-en-US = "Issue: Tabs are incorrect after migration. Certain format types do not migrate to <PRODUCTNAME>."
-
-[RID_RESXLS_COST_Issue__Text_form_fields_roundtrip_as_Fill_In_field]
-en-US = "Issue: Text form fields roundtrip as Fill In field. Field attributes are lost."
-
-[RID_RESXLS_COST_Issue__Unsupported_formatting_set]
-en-US = "Issue: Unsupported formatting set."
-
-[RID_RESXLS_COST_Issue__Unsupported_function_type]
-en-US = "Issue: Unsupported function type. "
-
-[RID_RESXLS_COST_Issue__Userform_controls_will_need_porting_to_StarOffice_Basic]
-en-US = "Issue: Userform controls will need porting to <PRODUCTNAME> Basic."
-
-[RID_RESXLS_COST_Issue__Userforms_controls_will_need_porting_to_StarOffice_Basic]
-en-US = "Issue: Userform controls will need porting to <PRODUCTNAME> Basic."
-
-[RID_RESXLS_COST_Issue__Userforms_will_need_porting_to_StarOffice_Basic]
-en-US = "Issue: Userforms will need porting to <PRODUCTNAME> Basic."
-
-[RID_RESXLS_COST_Issue__VBProject_is_password_protected_Remove_password__rerun_analysis]
-en-US = "Issue: VBProject is password protected. Remove password, rerun analysis."
-
-[RID_RESXLS_COST_Issue__Will_need_refreshing_in_SO7_External_datasources_and_functions_are_not_supported]
-en-US = "Issue: Will need refreshing in <PRODUCTNAME>. External data sources and functions are not supported"
-
-[RID_RESXLS_COST_Issue__Workbook_protection_is_not_supported]
-en-US = "Issue: Workbook protection is not supported"
-
-[RID_RESXLS_COST_Issue__Writer_cannot_correctly_display_cells_spanning_more_than_1_page]
-en-US = "Issue: Writer cannot correctly display cells spanning more than 1 page."
-
-[RID_RESXLS_COST_Issue_Category]
-en-US = "Issue Category"
-
-[RID_RESXLS_COST_Issue_Count]
-en-US = " Issue Count"
-
-[RID_RESXLS_COST_Issue_Type]
-en-US = "Issue Type"
-
-[RID_RESXLS_COST_Linked_OLE_Object]
-en-US = "Linked OLE Object"
-
-[RID_RESXLS_COST_Mail_Merge_Datasource]
-en-US = "Mail Merge Data Source"
-
-[RID_RESXLS_COST_Mail_Merge_Field]
-en-US = "Mail Merge Field"
-
-[RID_RESXLS_COST_Major_Issue]
-en-US = "Complex Issue"
-
-[RID_RESXLS_COST_MAX_SHEETS_WORKAROUND]
-en-US = "Need to move sheets to new workbook. "
-
-[RID_RESXLS_COST_Maximum_Rows_Exceeded]
-en-US = "Maximum Rows Exceeded"
-
-[RID_RESXLS_COST_Maximum_Sheets_Exceeded]
-en-US = "Maximum Sheets Exceeded"
-
-[RID_RESXLS_COST_Migration_Issues_Costs]
-en-US = "Migration Issues Analyzed"
-
-[RID_RESXLS_COST_Movie]
-en-US = "Movie"
-
-[RID_RESXLS_COST_NESTED_TABLE_WORKAROUND]
-en-US = "In word use split cell to create similar layout."
-
-[RID_RESXLS_COST_Nested_Tables]
-en-US = "Nested Tables"
-
-[RID_RESXLS_COST_Not_Planned]
-en-US = "Not Planned"
-
-[RID_RESXLS_COST_Notes_And_Handouts]
-en-US = "Notes And Handouts"
-
-[RID_RESXLS_COST_Number_Of_External_References]
-en-US = "Number Of External References"
-
-[RID_RESXLS_COST_Number_Of_Lines]
-en-US = "Number Of Lines"
-
-[RID_RESXLS_COST_Number_of_Lines_in_Unique_Modules]
-en-US = "Number of Lines in Unique Code Modules"
-
-[RID_RESXLS_COST_Number_of_Modules]
-en-US = "Number of Modules"
-
-[RID_RESXLS_COST_Number_of_Unique_Modules]
-en-US = "Number of Unique Code Modules"
-
-[RID_RESXLS_COST_Numbering_Reference]
-en-US = "Numbering Reference"
-
-[RID_RESXLS_COST_Numbering_Reference_Comment]
-en-US = "Issue: <PRODUCTNAME> can not import references that refer in a numbered list."
-
-[RID_RESXLS_COST_Object_In_Header_Footer]
-en-US = "Object In Header Footer"
-
-[RID_RESXLS_COST_Objects_And_Graphics]
-en-US = "Objects And Graphics"
-
-[RID_RESXLS_COST_Objects_Graphics_And_Frames]
-en-US = "Objects Graphics And Frames"
-
-[RID_RESXLS_COST_Objects_Graphics_And_Textboxes]
-en-US = "Objects Graphics And Textboxes"
-
-[RID_RESXLS_COST_Old_Workbook_Version]
-en-US = "Old Workbook Version"
-
-[RID_RESXLS_COST_OLE_Control]
-en-US = "OLE Control"
-
-[RID_RESXLS_COST_OLECONTR_COST]
-en-US = "Cost variations occur because of the use of macros with controls."
-
-[RID_RESXLS_COST_Page_Setup]
-en-US = "Page Setup"
-
-[RID_RESXLS_COST_Password_Protected]
-en-US = "Password Protected"
-
-[RID_RESXLS_COST_Password_Protection]
-en-US = "Password Protection"
-
-[RID_RESXLS_COST_Pivot]
-en-US = "Pivot Chart"
-
-[RID_RESXLS_COST_Planned_SO8]
-en-US = "Planned"
-
-[RID_RESXLS_COST_Portability]
-en-US = "Portability"
-
-[RID_RESXLS_COST_PowerPoint]
-en-US = "PowerPoint"
-
-[RID_RESXLS_COST_PowerPoint_Totals]
-en-US = "PowerPoint Totals"
-
-[RID_RESXLS_COST_Prepared_Issue_Count]
-en-US = "Prepared Issue Count"
-
-[RID_RESXLS_COST_Prepared_Savings__min]
-en-US = "Prepared Savings (min)"
-
-[RID_RESXLS_COST_Properties___Module__Class_or_UserForm]
-en-US = "Properties - Module, Class or UserForm"
-
-[RID_RESXLS_COST_Remove_password_to_open]
-en-US = "Remove password to open."
-
-[RID_RESXLS_COST_Remove_the_invalid_characters_from_the_worksheet_name]
-en-US = "Remove the invalid characters from the worksheet name."
-
-[RID_RESXLS_COST_Rerun_analysis_with_correct_password]
-en-US = "Rerun analysis with correct password."
-
-[RID_RESXLS_COST_Reset_link_to_Data_Base_having_setup_a_Datasource_in_SO7]
-en-US = "Reset link to database having setup a data source in <PRODUCTNAME>."
-
-[RID_RESXLS_COST_set_cost_factor_if_the_macro_has_to_be_ported_off_Windows]
-en-US = "Cost = 0. Set a cost factor if the macro has to be ported off Windows. "
-
-[RID_RESXLS_COST_Save_workbook_as_a_new_workbook_version]
-en-US = "Save workbook as a new workbook version."
-
-[RID_RESXLS_COST_Setup_Datasource_in_SO7_using_Tools__Datasource]
-en-US = "Setup data source in <PRODUCTNAME> using Tools/Data source"
-
-[RID_RESXLS_COST_Sheet_Chart]
-en-US = "Chart Issues Complex"
-
-[RID_RESXLS_COST_Status]
-en-US = "Status"
-
-[RID_RESXLS_COST_Table_Of_Authorities]
-en-US = "Table Of Authorities"
-
-[RID_RESXLS_COST_Table_Of_Authorities_Field]
-en-US = "Table Of Authorities Field"
-
-[RID_RESXLS_COST_Table_Of_Contents]
-en-US = "Table Of Contents"
-
-[RID_RESXLS_COST_Tables]
-en-US = "Tables"
-
-[RID_RESXLS_COST_TOC_ISSUE_WORKAROUND]
-en-US = "Tab Issues: use fancy format. Numbering incorrect: remove blank lines with heading style used by TOC. Numbering abuts Header: replace leading tabs in Header style used in TOC with spaces."
-
-[RID_RESXLS_COST_Total_Cost___MD]
-en-US = "Total Cost (MD) = "
-
-[RID_RESXLS_COST_User_Error]
-en-US = "User Error"
-
-[RID_RESXLS_COST_User_Forms_Control_Count]
-en-US = "User Forms Control Count"
-
-[RID_RESXLS_COST_User_Forms_Control_Type_Count]
-en-US = "User Forms Control Type Count"
-
-[RID_RESXLS_COST_User_Forms_Count]
-en-US = "User Forms Count"
-
-[RID_RESXLS_COST_VBA_Macros]
-en-US = "VBA Macros"
-
-[RID_RESXLS_COST_Word]
-en-US = "Word"
-
-[RID_RESXLS_COST_Word_Totals]
-en-US = "Word Totals"
-
-[RID_RESXLS_COST_Work_Around]
-en-US = "Work Around"
-
-[RID_RESXLS_COST_Workaround_Remove_protection_before_importing]
-en-US = "Remove protection before importing"
-
-[RID_RESXLS_COST_WorkbookProtection]
-en-US = "WorkbookProtection "
-
-[RID_RESXLS_DP_Accessed]
-en-US = "Accessed"
-
-[RID_RESXLS_DP_All_Analysed_Documents___Properties]
-en-US = "All Analysed Documents - properties"
-
-[RID_RESXLS_DP_Application]
-en-US = "Application"
-
-[RID_RESXLS_DP_Based_on_Template]
-en-US = "Based on Template"
-
-[RID_RESXLS_DP_Costs]
-en-US = "Costs"
-
-[RID_RESXLS_DP_Created]
-en-US = "Created"
-
-[RID_RESXLS_DP_Document_Details]
-en-US = "Document Details"
-
-[RID_RESXLS_DP_Document_Issue_Costs]
-en-US = "Document Migration Costs (min)"
-
-[RID_RESXLS_DP_Document_Migration_Issues]
-en-US = "Document Migration Issues"
-
-[RID_RESXLS_DP_Document_Name]
-en-US = "Document Name"
-
-[RID_RESXLS_DP_Document_Name_and_Path]
-en-US = "Document Name and Path"
-
-[RID_RESXLS_DP_Issues_Complex_count]
-en-US = "Issues Complex Count"
-
-[RID_RESXLS_DP_Last_Saved_By]
-en-US = "Last Saved By"
-
-[RID_RESXLS_DP_Lines_of_Macro_Code]
-en-US = "Lines of Macro Code"
-
-[RID_RESXLS_DP_Macro_Issues]
-en-US = "Macro Migration Issues"
-
-[RID_RESXLS_DP_Macro_Migration_Costs]
-en-US = "Macro Migration Costs (min)"
-
-[RID_RESXLS_DP_Macro_Migration_Issues]
-en-US = "Macro Migration Issues"
-
-[RID_RESXLS_DP_Migration_Issues]
-en-US = "Document Migration Issues"
-
-[RID_RESXLS_DP_Minor_Issues]
-en-US = "Issues Minor Count"
-
-[RID_RESXLS_DP_Modified]
-en-US = "Modified"
-
-[RID_RESXLS_DP_Pages_Sheets_Slides]
-en-US = "Pages, Sheets or Slides Count"
-
-[RID_RESXLS_DP_Prepareable_Issues_Costs]
-en-US = "Prepareable Issues Savings (min)"
-
-[RID_RESXLS_DP_Prepared_Issues]
-en-US = "Prepareable Document Issues"
-
-[RID_RESXLS_DP_Printed]
-en-US = "Printed"
-
-[RID_RESXLS_DP_Revision]
-en-US = "Revision"
-
-[RID_RESXLS_DP_User_Form_Count]
-en-US = "User Form Count"
-
-[RID_RESXLS_ID_All_Documents_with_Issues___Issue_Details]
-en-US = "All Documents with Issues - Issue Details"
-
-[RID_RESXLS_ID_Application]
-en-US = "Application"
-
-[RID_RESXLS_ID_Column__Left]
-en-US = "Column/ Left"
-
-[RID_RESXLS_ID_Document_Name]
-en-US = "Document Name"
-
-[RID_RESXLS_ID_Document_Name_and_Path]
-en-US = "Document Name and Path"
-
-[RID_RESXLS_ID_Issue_Category]
-en-US = "Issue Category"
-
-[RID_RESXLS_ID_Issue_Details]
-en-US = "Issue Details"
-
-[RID_RESXLS_ID_Issue_Type]
-en-US = "Issue Type"
-
-[RID_RESXLS_ID_Line__Row__Top]
-en-US = "Line/ Row/ Top"
-
-[RID_RESXLS_ID_Location]
-en-US = "Location"
-
-[RID_RESXLS_ID_Location_Type]
-en-US = "Location Type"
-
-[RID_RESXLS_OV_3_to_6_months]
-en-US = "3 - 6 months"
-
-[RID_RESXLS_OV_6_to_12_months]
-en-US = "6 - 12 months"
-
-[RID_RESXLS_OV_Complex]
-en-US = "Complex"
-
-[RID_RESXLS_OV_Cost_estimates_for_migration]
-en-US = "Cost estimates for migration of all analyzed documents"
-
-[RID_RESXLS_OV_Costs]
-en-US = "Costs (MD)"
-
-[RID_RESXLS_OV_Docs_with_DocumentMigrationIssues]
-en-US = "Documents with Document Migration Issues (excludes macro issues)"
-
-[RID_RESXLS_OV_Document_Migration_Costs]
-en-US = "Document Migration Costs<CR>( costs based on: issues listed in Issues Analyzed, excludes macros issues )"
-
-[RID_RESXLS_OV_Document_Modification_Dates]
-en-US = "Document Modification Dates"
-
-[RID_RESXLS_OV_Document_Type]
-en-US = "Type"
-
-[RID_RESXLS_OV_Documents_with_Macro_Migration_Issues]
-en-US = "Documents with Macro Migration Issues"
-
-[RID_RESXLS_OV_Excel]
-en-US = "Excel"
-
-[RID_RESXLS_OV_Excel_Costs]
-en-US = "Excel "
-
-[RID_RESXLS_OV_Excel_Spreadsheet]
-en-US = " Spreadsheets (.xls)"
-
-[RID_RESXLS_OV_Excel_Template]
-en-US = " Templates (.xlt)"
-
-[RID_RESXLS_OV_GREATER_THAN_1_year]
-en-US = "> 1 year"
-
-[RID_RESXLS_OV_Last_Modified]
-en-US = "Last Modified"
-
-[RID_RESXLS_OV_LESS_3_months]
-en-US = "< 3 months"
-
-[RID_RESXLS_OV_LESS_THAN3MONTHS]
-en-US = "Templates (.dot)"
-
-[RID_RESXLS_OV_Macro_Migration_Costs]
-en-US = "Manual Macro Migration Costs<CR>( costs based on: number of lines in unique code modules and number of user form controls )"
-
-[RID_RESXLS_OV_Medium]
-en-US = "Medium"
-
-[RID_RESXLS_OV_Minor]
-en-US = "Minor"
-
-[RID_RESXLS_OV_None]
-en-US = "None"
-
-[RID_RESXLS_OV_Number]
-en-US = "Number"
-
-[RID_RESXLS_OV_Number_of_Documents_Analyzed]
-en-US = "Number of Documents Analyzed"
-
-[RID_RESXLS_OV_NumberOfDocs]
-en-US = "Number of docs"
-
-[RID_RESXLS_OV_Potential_savings_macro_conversion]
-en-US = "Potential Savings with Automated Macro Migration of 20 to 60%"
-
-[RID_RESXLS_OV_Potential_savings_prepared_docs]
-en-US = "Potential Savings with Automated Preparation"
-
-[RID_RESXLS_OV_PowerPoint]
-en-US = "PowerPoint"
-
-[RID_RESXLS_OV_PowerPoint_Costs]
-en-US = "PowerPoint "
-
-[RID_RESXLS_OV_PowerPoint_Document]
-en-US = " Presentations (.ppt)"
-
-[RID_RESXLS_OV_PowerPoint_Template]
-en-US = " Templates (.pot)"
-
-[RID_RESXLS_OV_Simple]
-en-US = "Simple"
-
-[RID_RESXLS_OV_Total]
-en-US = "Total"
-
-[RID_RESXLS_OV_Totals]
-en-US = "Totals"
-
-[RID_RESXLS_OV_Word]
-en-US = "Word"
-
-[RID_RESXLS_OV_Word_Costs]
-en-US = "Word "
-
-[RID_RESXLS_OV_Word_Document]
-en-US = "Documents (.doc)"
-
-[RID_RESXLS_OV_Word_Template]
-en-US = "Templates (.dot)"
-
-[RID_RESXLS_PP_Action_Settings]
-en-US = "Action Settings"
-
-[RID_RESXLS_PP_Application]
-en-US = "Application"
-
-[RID_RESXLS_PP_Content___Document_Properties]
-en-US = "Content & Document Properties"
-
-[RID_RESXLS_PP_Document_Name_and_Path]
-en-US = "Document Name and Path"
-
-[RID_RESXLS_PP_Fields]
-en-US = "Fields"
-
-[RID_RESXLS_PP_Format]
-en-US = "Format"
-
-[RID_RESXLS_PP_Notes___Handouts]
-en-US = "Notes & Handouts"
-
-[RID_RESXLS_PP_Objects__Graphics___Textboxes]
-en-US = "Objects, Graphics & Textboxes"
-
-[RID_RESXLS_PP_Portability]
-en-US = "Portability"
-
-[RID_RESXLS_PP_PowerPoint_Documents_with_Issues___Issue_Summary]
-en-US = "PowerPoint Documents with Issues - Issue Summary"
-
-[RID_RESXLS_PP_PowerPoint_Presentation_Name]
-en-US = "PowerPoint Presentation Name"
-
-[RID_RESXLS_PP_VBA_Macros]
-en-US = "VBA Macros"
-
-[RID_RESXLS_RD_All_Documents_with_Macros___Reference_Details]
-en-US = "All Documents with Macros - Reference Details"
-
-[RID_RESXLS_RD_Application]
-en-US = "Application"
-
-[RID_RESXLS_RD_Description]
-en-US = "Description"
-
-[RID_RESXLS_RD_Document_Name]
-en-US = "Document Name"
-
-[RID_RESXLS_RD_Document_Name_and_Path]
-en-US = "Document Name and Path"
-
-[RID_RESXLS_RD_Location]
-en-US = "Location"
-
-[RID_RESXLS_RD_Reference]
-en-US = "Reference"
-
-[RID_RESXLS_RD_Reference_Details]
-en-US = "Reference Details"
-
-[RID_RESXLS_WI_Application]
-en-US = "Application"
-
-[RID_RESXLS_WI_Changes_and_Reviewing]
-en-US = "Changes and Reviewing"
-
-[RID_RESXLS_WI_Content___Document_Properties]
-en-US = "Content & Document Properties"
-
-[RID_RESXLS_WI_Controls]
-en-US = "Controls"
-
-[RID_RESXLS_WI_Document_Name_and_Path]
-en-US = "Document Name and Path"
-
-[RID_RESXLS_WI_Fields]
-en-US = "Fields"
-
-[RID_RESXLS_WI_Format]
-en-US = "Format"
-
-[RID_RESXLS_WI_Index_and_References]
-en-US = "Index and References"
-
-[RID_RESXLS_WI_Objects__Graphics____Frames]
-en-US = "Objects, Graphics & Frames"
-
-[RID_RESXLS_WI_Portability]
-en-US = "Portability"
-
-[RID_RESXLS_WI_Tables]
-en-US = "Tables"
-
-[RID_RESXLS_WI_VBA_Macros]
-en-US = "VBA Macros"
-
-[RID_RESXLS_WI_Word_Document_Name]
-en-US = "Word Document Name"
-
-[RID_RESXLS_WI_Word_Documents_with_Issues___Issue_Summary]
-en-US = "Word Documents with Issues - Issue Summary"
-
-[RID_RESXLS_XL_Application]
-en-US = "Application"
-
-[RID_RESXLS_XL_Changes___Reviewing]
-en-US = "Changes & Reviewing"
-
-[RID_RESXLS_XL_Charts___Tables]
-en-US = "Charts & Tables"
-
-[RID_RESXLS_XL_Excel_Documents_with_Issues___Issue_Summary]
-en-US = "Excel Documents with Issues - Issue Summary"
-
-[RID_RESXLS_XL_Excel_Spreadsheet_Name]
-en-US = "Excel Spreadsheet Name"
-
-[RID_RESXLS_XL_Filters]
-en-US = "Filters"
-
-[RID_RESXLS_XL_Format]
-en-US = "Format"
-
-[RID_RESXLS_XL_Functions]
-en-US = "Functions"
-
-[RID_RESXLS_XL_Objects___Graphics]
-en-US = "Objects & Graphics"
-
-[RID_STR_DVR_XL_EXCEL_DRIVER]
-en-US = "Excel Driver"
-
-[RID_STR_DVR_XL_ISSUES]
-en-US = "2. Issues"
-
-[RID_STR_DVR_XL_PURPOSE]
-en-US = "1. Purpose"
-
-[RID_STR_DVR_XL_READ_README]
-en-US = "If there are any problems running the Wizard please refer to the Readme.doc"
-
-[RID_STR_DVR_XL_THE_MACROS]
-en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of Excel documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool."
-
-[RID_STR_DVR_XL_THIS_DOC]
-en-US = "This document contains VBA macros which collect and analyse Excel documents for known issues when importing into <PRODUCTNAME>"
-
-[RID_STR_DVR_XL_TITLE]
-en-US = "<PRODUCTNAME> Migration Analysis - Excel Driver"
-
-[RID_STR_DVR_PP_TXT2]
-en-US = "This document contains VBA macros which collect and analyse PowerPoint documents for known issues when importing into <PRODUCTNAME>"
-
-[RID_STR_DVR_PP_TXT3]
-en-US = "<PRODUCTNAME> Migration Analysis - PowerPoint Driver"
-
-[RID_STR_DVR_PP_TXT4]
-en-US = "PowerPoint Driver"
-
-[RID_STR_DVR_PP_TXT5]
-en-US = "Purpose"
-
-[RID_STR_DVR_PP_TXT6]
-en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of PowerPoint documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool."
-
-[RID_STR_DVR_PP_TXT7]
-en-US = "Issues"
-
-[RID_STR_DVR_PP_TXT8]
-en-US = "If there are any problems running the Wizard please refer to the Readme.doc"
-
-[RID_STR_WDVR_SOANA]
-en-US = "<PRODUCTNAME> MIGRATION ANALYSIS - WORD DRIVER"
-
-[RID_STR_WDVR_INTRO]
-en-US = "This document contains VBA macros, which collect and analyse Word documents for known issues when importing into <PRODUCTNAME>"
-
-[RID_STR_WDVR_TITLE]
-en-US = "Word Driver"
-
-[RID_STR_WDVR_PURPO]
-en-US = "Purpose"
-
-[RID_STR_WDVR_PARA1]
-en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of Word documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool."
-
-[RID_STR_WDVR_ISSUE]
-en-US = "Issues"
-
-[RID_STR_WDVR_PARA2]
-en-US = "If there are any problems running the Wizard please refer to the Readme.doc"
-
-[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_COMMENTS]
-en-US = "Allow Only Comments"
-
-[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_FORM_FIELDS]
-en-US = "Allow Only FormFields"
-
-[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_REVISIONS]
-en-US = "Allow Only Revisions"
-
-[RID_STR_WORD_ATTRIBUTE_AUTHOR]
-en-US = "Author"
-
-[RID_STR_WORD_ATTRIBUTE_DATASOURCE]
-en-US = "Datasource"
-
-[RID_STR_WORD_ATTRIBUTE_FIELD_TEXT]
-en-US = "Field Text"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_AUTOSIZE]
-en-US = "Autosize"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_ENTRY_MACRO]
-en-US = "Entry macro"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_EXIT_MACRO]
-en-US = "Exit macro"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_FILLIN_ENABLED]
-en-US = "Fill-in enabled"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_GREYED]
-en-US = "FormFields Greyed"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_AUTO_TEXT]
-en-US = "Help Key(F1) [Auto Text]"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_OWN_TEXT]
-en-US = "Help Key(F1) [Own Text]"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_LOCKED]
-en-US = "Locked"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_MAX_LENGTH]
-en-US = "Maximum Length"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_AUTO_TEXT]
-en-US = "Status Bar Help [Auto Text]"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_OWN_TEXT]
-en-US = "Status Bar Help [Own Text]"
-
-[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_TEXT_FORM_FIELD_TYPE]
-en-US = "Text Form Field Type"
-
-[RID_STR_WORD_ATTRIBUTE_FOOTER]
-en-US = "Footer"
-
-[RID_STR_WORD_ATTRIBUTE_HEADER]
-en-US = "Header"
-
-[RID_STR_WORD_ATTRIBUTE_FRAME]
-en-US = "Frame"
-
-[RID_STR_WORD_ATTRIBUTE_GRAPHIC]
-en-US = "Graphic"
-
-[RID_STR_WORD_ATTRIBUTE_OBJECT_HEIGHT_GT_H]
-en-US = "Height Greater Than Header Height"
-
-[RID_STR_WORD_ATTRIBUTE_OBJECT_HEIGHT_GT_F]
-en-US = "Height Greater Than Footer Height"
-
-[RID_STR_WORD_ATTRIBUTE_NUM_OF_GRAPHIC]
-en-US = "Number of Graphics"
-
-[RID_STR_WORD_ATTRIBUTE_OBJECT_LOCATED_BELOW_HEADER]
-en-US = "Located Below Header"
-
-[RID_STR_WORD_ATTRIBUTE_NUM_OF_FRAME]
-en-US = "Number of Frames"
-
-[RID_STR_WORD_ATTRIBUTE_HEADER_EVEN_PAGES]
-en-US = "Even Page(s)"
-
-[RID_STR_WORD_ATTRIBUTE_HEADER_FIRST_PAGE]
-en-US = "First Page"
-
-[RID_STR_WORD_ATTRIBUTE_HEADER_ODD_PAGES]
-en-US = "Odd Page(s)"
-
-[RID_STR_WORD_ATTRIBUTE_HEADER_PAGE_DEFAULT]
-en-US = "Page Default"
-
-[RID_STR_WORD_ATTRIBUTE_GRAPHICTYPE]
-en-US = "Graphic Type"
-
-[RID_STR_WORD_ATTRIBUTE_INLINESHAPE]
-en-US = "Inline Shape"
-
-[RID_STR_WORD_ATTRIBUTE_INNER_TABLE]
-en-US = "InnerTable"
-
-[RID_STR_WORD_ATTRIBUTE_LEADER]
-en-US = "Leader"
-
-[RID_STR_WORD_ATTRIBUTE_LINK]
-en-US = "Link"
-
-[RID_STR_WORD_ATTRIBUTE_LOCATION]
-en-US = "Location"
-
-[RID_STR_WORD_ATTRIBUTE_NUMBER_CUSTOM_PARAGRAPHS]
-en-US = "Number of custom paragraphs"
-
-[RID_STR_WORD_ATTRIBUTE_OUTER_TABLE]
-en-US = "Outer Table"
-
-[RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_MODIFY]
-en-US = "Password to Modify"
-
-[RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_OPEN]
-en-US = "Password to Open"
-
-[RID_STR_WORD_ATTRIBUTE_PROTECTION]
-en-US = "Protection"
-
-[RID_STR_WORD_ATTRIBUTE_SET]
-en-US = "Set"
-
-[RID_STR_WORD_ATTRIBUTE_START_COL]
-en-US = "Start Column"
-
-[RID_STR_WORD_ATTRIBUTE_START_ROW]
-en-US = "Start Row"
-
-[RID_STR_WORD_ATTRIBUTE_TEXT]
-en-US = "Text"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_ISSUE]
-en-US = "Potential problem with TOC Format matching Modern style"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_NOT_MIGRATE_CLEAN]
-en-US = "TOC Format will not migrate cleanly"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_NOT_ROUNDTRIP_CLEAN]
-en-US = "TOC will not roundtrip cleanly due to following settings"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FROM_TEMPLATE_WITH_LEVEL]
-en-US = "Format [FromTemplate] Level"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FROM_TEMPLATE_TAB_DOTS]
-en-US = "Format [FromTemplate] TabLeader [Dots]"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FORMAL_WITH_LEVEL]
-en-US = "Format [Formal] Level"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_CLASSIC_WITH_LEVEL]
-en-US = "Format [Classic] Level"
-
-[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_DISTINCTIVE_WITH_LEVEL]
-en-US = "Format [Distinctive] Level"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_CALCULATION]
-en-US = "Calculation"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_CHECK_BOX]
-en-US = "Check Box Form Field"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_DATE]
-en-US = "Current Date"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_TIME]
-en-US = "Current Time"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DATE]
-en-US = "Date"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE]
-en-US = "Default date"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_EXPRESSION]
-en-US = "Expression"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_NUMBER]
-en-US = "Default number"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TEXT]
-en-US = "Default text"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TIME]
-en-US = "Default time"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_DROP_DOWN]
-en-US = "Drop-Down Form Field"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE]
-en-US = "Date format"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER]
-en-US = "Number format"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TEXT]
-en-US = "Text format"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TIME]
-en-US = "Time format"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_NUMBER]
-en-US = "Number"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_REGULAR]
-en-US = "Regular"
-
-[RID_STR_WORD_ENUMERATION_FORM_FIELD_TEXT]
-en-US = "Text Form Field"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_ASK]
-en-US = "Ask"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER]
-en-US = "Auto Number"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_LEGAL]
-en-US = "Auto Number Legal"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_OUTLINE]
-en-US = "Auto Number Outline"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_FIELD_NAME_NOT_KNOWN]
-en-US = "Field name not known"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_FILL_IN]
-en-US = "Fill In"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_RECORDS]
-en-US = "Merge Records"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_FIELDS]
-en-US = "Merge Fields"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_NEXT]
-en-US = "Next"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_REVISION_NUMBER]
-en-US = "Revision Number"
-
-[RID_STR_WORD_ENUMERATION_MAILMERGE_SEQUENCE]
-en-US = "Sequence"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_CLASSIC]
-en-US = "Classic"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_DISTINCTIVE]
-en-US = "Distinctive"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FANCY]
-en-US = "Fancy"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FORMAL]
-en-US = "Formal"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_MODERN]
-en-US = "Modern"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_SIMPLE]
-en-US = "Simple"
-
-[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FROM_TEMPLATE]
-en-US = "From Template"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_DASHES]
-en-US = "Dashes"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_DOTS]
-en-US = "Dots"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_HEAVY]
-en-US = "Heavy"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_LINES]
-en-US = "Lines"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_MIDDLEDOT]
-en-US = "MiddleDot"
-
-[RID_STR_WORD_ENUMERATION_INDEX_LEADER_SPACES]
-en-US = "Spaces"
-
-[RID_STR_WORD_ENUMERATION_UNKNOWN]
-en-US = "Unknown"
-
-[RID_STR_WORD_FALSE]
-en-US = "False"
-
-[RID_STR_WORD_TRUE]
-en-US = "True"
-
-[RID_STR_WORD_ISSUE_FIELDS]
-en-US = "Fields"
-
-[RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES]
-en-US = "Indexes and References"
-
-[RID_STR_WORD_ISSUE_OBJECTS_GRAPHICS_AND_FRAMES]
-en-US = "Objects, Graphics and Frames"
-
-[RID_STR_WORD_ISSUE_TABLES]
-en-US = "Tables"
-
-[RID_STR_WORD_NOTE_FORM_FIELD_ATTRIBUTES_LOST]
-en-US = "following attribute values lost"
-
-[RID_STR_WORD_NOTE_FORM_FIELD_TYPE_LOST]
-en-US = "Type lost, converted to plain text"
-
-[RID_STR_WORD_NOTE_NESTED_TABLE_WILL_BE_LOST]
-en-US = "The inner table will be lost on roundtrip."
-
-[RID_STR_WORD_NOTE_TOA_FIELD_LOST_ON_ROUNDTRIP]
-en-US = "Field will be lost on roundtrip"
-
-[RID_STR_WORD_NOTE_TOA_MIGRATE_AS_PLAIN_TEXT]
-en-US = "Table will migrate as plain text"
-
-[RID_STR_WORD_SUBISSUE_APPEARANCE]
-en-US = "Appearance"
-
-[RID_STR_WORD_SUBISSUE_COMMENT]
-en-US = "Comment"
-
-[RID_STR_WORD_SUBISSUE_CUSTOM_BULLET_LIST]
-en-US = "Custom bullet list"
-
-[RID_STR_WORD_SUBISSUE_FORM_FIELD]
-en-US = "Form Field"
-
-[RID_STR_WORD_SUBISSUE_MAILMERGE_DATASOURCE]
-en-US = "Mail Merge Datasource"
-
-[RID_STR_WORD_SUBISSUE_MAILMERGE_FIELD]
-en-US = "Mail Merge Field"
-
-[RID_STR_WORD_SUBISSUE_NESTED_TABLES]
-en-US = "Nested Tables"
-
-[RID_STR_WORD_SUBISSUE_OBJECT_IN_HEADER_FOOTER]
-en-US = "Object in Header Footer"
-
-[RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES]
-en-US = "Table of Authorities"
-
-[RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD]
-en-US = "Table of Authorities Field"
-
-[RID_RESXLT_COST_CHART_Radar_AWF]
-en-US = "Radar chart, Radar with symbol"
-
-[RID_RESXLT_COST_CHART_Radar_Comment]
-en-US = "Although <PRODUCTNAME> Net charts appear similar to Excel Radar charts, but they are not equivalent. Radar charts are drawn clockwise whereas Net charts are drawn counter-clockwise."
-
-[RID_RESXLT_COST_CHART_Scattered_AWF]
-en-US = "Scattered chart"
-
-[RID_RESXLT_COST_CHART_Scattered_Comment]
-en-US = "The XY-Chart of <PRODUCTNAME> has the same appearance as the scattered chart in Excel."
-
-[RID_RESXLT_COST_CHART_Bubble_AWF]
-en-US = "Bubble chart"
-
-[RID_RESXLT_COST_CHART_Bubble_Comment]
-en-US = "XY-Chart has similar functionality to a Bubble chart in Excel but a completely different look."
-
-[RID_RESXLT_COST_CHART_BarOfPie_AWF]
-en-US = "Bar of Pie and Pie of Pie charts"
-
-[RID_RESXLT_COST_CHART_BarOfPie_Comment]
-en-US = "<PRODUCTNAME> imports these types of charts as Column charts, which look completely different."
-
-[RID_RESXLT_COST_CHART_FilledRadar_AWF]
-en-US = "Filled Radar chart"
-
-[RID_RESXLT_COST_CHART_FilledRadar_Comment]
-en-US = "This chart type does not have a <PRODUCTNAME> equivalent. Instead, the import filter in <PRODUCTNAME> converts a Filled Radar chart to a Column chart."
-
-[RID_RESXLT_COST_CHART_Surface_AWF]
-en-US = "Surface chart"
-
-[RID_RESXLT_COST_CHART_Surface_Comment]
-en-US = "This chart type does not have a <PRODUCTNAME> equivalent. The imported chart will look completely different than the original chart."
-
-[RID_RESXLT_COST_PIVOT_MultConsRanges_AWF]
-en-US = "Multiple Consolidation Ranges"
-
-[RID_RESXLT_COST_PIVOT_MultConsRanges_Comment]
-en-US = "A Pivot table from Excel can use data from multiple consolidation ranges, Calc does not support this."
-
-[RID_RESXLT_COST_PIVOT_PivotChart_Comment]
-en-US = "A pivot chart is created dynamically in Excel using a pivot table as it's datasource. <PRODUCTNAME> does not support generating charts from dynamically created tables."
-
-[RID_RESXLT_COST_PIVOT_ManSort_AWF]
-en-US = "Manual Sorting"
-
-[RID_RESXLT_COST_PIVOT_ManSort_Comment]
-en-US = "Pivot table users could sort the results manually. Excel preserves the sorting. Calc does not."
-
-[RID_RESXLT_COST_PIVOT_CalcVal_AWF]
-en-US = "Calculated Values"
-
-[RID_RESXLT_COST_PIVOT_CalcVal_Comment]
-en-US = "Excel users can create a formula that writes the results in a new column within the pivot table. Users can use the same type of formula to replace the content of an existing column. Calc does not support this."
-
-[RID_RESXLT_COST_PIVOT_ExternData_AWF]
-en-US = "External Data"
-
-[RID_RESXLT_COST_PIVOT_ExternData_Comment]
-en-US = "A Pivot table from Excel can use data from external sources. Calc does not support this."
-
-[RID_RESXLS_COST_IAR_Numbering_IssueType]
-en-US = "Numbering Order"
-
-[RID_RESXLS_COST_IAR_Numbering_Comment]
-en-US = "<PRODUCTNAME> first calculates numbering located in frames and then the numbering within the text. Word does not separate this."
-
-[RID_RESXLS_COST_IAR_Numbering_WorkAround]
-en-US = "Move the numberings from within the frames into the text body area."
-
-[RID_RESXLS_COST_WorkbookPartProtection_AWF]
-en-US = "Protection for Parts of Workbooks"
-
-[RID_RESXLS_COST_WorkbookPartProtection_Comment]
-en-US = "In Excel users can protect certain parts of workbooks. Workbooks, sheets, charts and ranges can all be individually protected. These do not all migrate to <PRODUCTNAME>."
-
-[RID_RESXLS_COST_WorkbookPartProtection_WorkAround]
-en-US = "Do not protect Excel workbooks"
-
-[RID_RESXLS_COST_FORMAT_TabStop_IssueType]
-en-US = "Tabstop"
-
-[RID_RESXLS_COST_FORMAT_TabStop_Comment]
-en-US = "The minimum tabstop distance in word is shorter than <PRODUCTNAME>. That means that if, in Word, the user tabs a distance shorter than <PRODUCTNAME>'s minimum, that after migration the text spacing will be pushed one tab further."
-
-[RID_RESXLS_COST_GraphicAnchorEndOfPage_IssueType]
-en-US = "Graphic Object Anchor - End of Page"
-
-[RID_RESXLS_COST_GraphicAnchorEndOfPage_Comment]
-en-US = "If a frame or graphic object (not including AutoShapes) is too close to the end of a page it will be pushed to the next page in <PRODUCTNAME>."
-
-[RID_RESXLS_COST_GraphicAnchorLostGraphic_IssueType]
-en-US = "Graphic Object Anchor - Lost Graphic Object"
-
-[RID_RESXLS_COST_GraphicAnchorLostGraphic_Comment]
-en-US = "If a graphic object is anchored off a paragraph (Format Autoshape | Layout | Advanced | Vertical Position = Paragraph) which contains just a blank carriage return, then this can lead to the graphic object being lost in <PRODUCTNAME>."
-
-[RID_RESXLS_COST_TABLE_Leading_IssueType]
-en-US = "Leading"
-
-[RID_RESXLS_COST_TABLE_Leading_Comment]
-en-US = "Leading can cause extra lines in tables. In a table, if the column width is very close to the text, it can lead to a single character being pushed to new line in <PRODUCTNAME>. This is caused by extra leading in <PRODUCTNAME>."
-
-[RID_RESXLS_COST_TABLE_Misplaced_IssueType]
-en-US = "Misplaced"
-
-[RID_RESXLS_COST_TABLE_Misplaced_Comment]
-en-US = "Text wrapping can cause misplaced tables."
-
-[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_IssueType]
-en-US = "Headings Without Numbering"
-
-[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_Comment]
-en-US = "Many users do not use automatic heading or section numbering. They type the numbers in front of the heading manually instead. Word displays the first TAB of the heading in the TOC. <PRODUCTNAME> does not. The TOC will look different."
-
-[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_WorkAround]
-en-US = "Replace the manual numbering with automatic numbering or add spaces between the manual numbers and the text."
-
-[RID_RESXLS_COST_TABLE_AlignmentOfObjects_IssueType]
-en-US = "Horizontal Alignment of Objects"
-
-[RID_RESXLS_COST_TABLE_AlignmentOfObjects_Comment]
-en-US = "Graphics, WordArt or similar objects located in text tables get displayed in the wrong position when the absolute position of the horizontal alignment is defined instead of a relative position."
-
-[RID_RESXLS_COST_TABLE_AlignmentOfObjects_WorkAround]
-en-US = "Adjust the horizontal alignment manually."
-
-[RID_STR_WORD_ATTRIBUTE_COUNT]
-en-US = "Count"
-
-[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_DATEDIF]
-en-US = "<PRODUCTNAME> Calc does not have an equivalent 'DATEDIF' function."
-
-[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_PHONETIC]
-en-US = "<PRODUCTNAME> does not have an equivalent 'PHONETIC' function."
-
-[RID_STR_PP_SUBISSUE_BACKGROUND_NOTE]
-en-US = "Fill style background colors applied to shapes in PowerPoint might be lost after a round trip conversion in <PRODUCTNAME>."
-
-[RID_STR_PP_SUBISSUE_NUMBERING_NOTE]
-en-US = "Only the first paragraph in a numbered sequence can start with "1" in <PRODUCTNAME>. The numbering can only start with "2" or higher in subsequent paragraphs."
-
-[RID_STR_PP_SUBISSUE_HYPERLINK_NOTE]
-en-US = "Unlike PowerPoint, <PRODUCTNAME> does not support multiple text formats in hyperlink text. Instead, <PRODUCTNAME> creates a separate hyperlink for each formatting style in an imported hyperlink."
-
-[RID_STR_PP_SUBISSUE_HYPERLINK_SPLIT_NOTE]
-en-US = "PowerPoint splits the text representation of a hyperlink into several lines when the text box is not wide enough. <PRODUCTNAME> does not split hyperlinks so the hyperlink text might extend out of the text box."
-
-[RID_STR_PP_SUBISSUE_TEMPLATE_NOTE]
-en-US = "<PRODUCTNAME> does not support the PowerPoint 'Title Slide' layout. When you import this layout, most of the subtitle object attributes are converted to hard attributes. PowerPoint 97 users require the multiple master page patch from Microsoft to view 'Title Slide' layouts that are contained in round trip documents."
-
-[RID_STR_PP_SUBISSUE_TABSTOP_NOTE]
-en-US = "Unlike PowerPoint, <PRODUCTNAME> only supports one default tab stop in a document and not one for each text object. If a PowerPoint document uses more than one default tab stop for text objects, <PRODUCTNAME> assigns hard tab stops to these text objects to ensure an identical layout when you import the document. The default tab stops are not reinserted when you save the document in PowerPoint format."
-
-[RID_STR_PP_SUBISSUE_FONTS]
-en-US = "Embedded Fonts"
-
-[RID_STR_PP_SUBISSUE_FONTS_NOTE]
-en-US = "<PRODUCTNAME> doesn't support embedded fonts."
-
-[RID_STR_COMMON_SUBISSUE_TRANSPARENCY_NOTE]
-en-US = "Microsoft Office supports a color attribute that allows you to make a bitmap color transparent without modifying the orginal bitmap. When you import a document with such a bitmap, <PRODUCTNAME> changes the bitmap to match the transparent color. The transparent color attribute is lost."
-
-[RID_STR_COMMON_SUBISSUE_LINE_NOTE]
-en-US = "<PRODUCTNAME> does not support all of the line styles that you can apply to MS Office AutoShapes. As a result, <PRODUCTNAME> replaces double and triple line styles with a single line."
-
-[RID_STR_COMMON_SUBISSUE_GRADIENT_PRESET_NOTE]
-en-US = "<PRODUCTNAME> does not support preset gradient styles."
-
-[RID_STR_COMMON_SUBISSUE_GRADIENT_CORNER_NOTE]
-en-US = "<PRODUCTNAME> does not support the 'from center' gradient style."
-
-[RID_STR_COMMON_SUBISSUE_GRADIENT_CENTER_NOTE]
-en-US = "<PRODUCTNAME> does not support the 'from corner' gradient style."
-
-[RID_RESXLS_COST_DB_Query]
-en-US = "Database Query"
-
-[RID_RESXLS_COST_DB_Query_Comment]
-en-US = "Issue: <PRODUCTNAME> can not import the database query. "
-
-[RID_RESXLS_COST_LineStyle]
-en-US = "Line Style"
-
-[RID_RESXLS_COST_LineStyle_Comment]
-en-US = "Issue: Line style is not supported."
-
-[RID_RESXLS_COST_Numbering]
-en-US = "Numbering"
-
-[RID_RESXLS_COST_Numbering_Comment]
-en-US = "Issue: Text numbering starts with wrong number."
-
-[RID_RESXLS_COST_Template]
-en-US = "Layout 'Title Slide'"
-
-[RID_RESXLS_COST_Template_Comment]
-en-US = "Issue: 'Title Slide' layout is not supported."
-
-[RID_RESXLS_COST_DATEDIF_Note]
-en-US = "Use a date or time function that <PRODUCTNAME> Calc supports."
-
-[RID_RESXLS_COST_Tabstop]
-en-US = "Default Tabulator"
-
-[RID_RESXLS_COST_Tabstop_Comment]
-en-US = "Issue: Different default tabulators are not supported for text objects."
-
-[RID_RESXLS_COST_Transparent]
-en-US = "Transparent Color"
-
-[RID_RESXLS_COST_Transparent_Comment]
-en-US = "Issue: <PRODUCTNAME> does not support the transparent color attribute in bitmaps."
-
-[RID_RESXLS_COST_GradientStyle]
-en-US = "Gradient Style"
-
-[RID_RESXLS_COST_GradientStyle_Comment]
-en-US = "Issue: Unsupported gradient styles used."
-
-[RID_RESXLS_COST_GradientStyle_Note]
-en-US = "Replacing gradient styles by styles that are supported."
-
-[RID_RESXLS_COST_Hyperlink]
-en-US = "Textrange Hyperlinks"
-
-[RID_RESXLS_COST_Hyperlink_Comment]
-en-US = "Issue: Multiple text formatting is not supported in Hyperlinks."
-
-[RID_RESXLS_COST_HyperlinkSplit]
-en-US = "Split Hyperlinks"
-
-[RID_RESXLS_COST_HyperlinkSplit_Comment]
-en-US = "Issue: Hyperlink will not be split onto several lines."
-
-[RID_RESXLS_COST_Background]
-en-US = "Fill Type Background"
-
-[RID_RESXLS_COST_Background_Comment]
-en-US = "Issue: Fillstyle background is not supported."
-
+[RID_STR_COMMON_PRODUCTNAME] +en-US = "OpenOffice.org" + +[RID_STR_COMMON_PRODUCTVERSION] +en-US = "3.0" + +[RID_STR_COMMON_NEXTPRODUCTVERSION] +en-US = "3.1" + +[RID_STR_COMMON_OLE_CONTROL] +en-US = "OLE Control" + +[RID_STR_COMMON_OLE_FIELD_LINK] +en-US = "OLE Field Link" + +[RID_STR_COMMON_OLE_UNKNOWN] +en-US = "Unknown Type" + +[RID_STR_COMMON_VB_COMPONENT_MODULE] +en-US = "Module" + +[RID_STR_COMMON_VB_COMPONENT_STANDARD] +en-US = "Standard Module" + +[RID_STR_COMMON_VB_COMPONENT_CLASS] +en-US = "Class Module" + +[RID_STR_COMMON_VB_COMPONENT_USER_FORM] +en-US = "User Form" + +[RID_STR_COMMON_VB_COMPONENT_DOCUMENT] +en-US = "Document" + +[RID_STR_COMMON_VB_COMPONENT_ACTIVEX_DESIGNER] +en-US = "ActiveX Designer" + +[RID_STR_COMMON_VB_COMPONENT_UNKNOWN] +en-US = "Unknown" + +[RID_STR_COMMON_YES_OR_NO] +en-US = "Yes or No" + +[RID_STR_COMMON_DATE] +en-US = "Date" + +[RID_STR_COMMON_NUMBER] +en-US = "Number" + +[RID_STR_COMMON_TEXT] +en-US = "Text" + +[RID_STR_COMMON_UNKNOWN] +en-US = "Unknown" + +[RID_STR_COMMON_DEC_TO_EXTERNAL_LIBRARY] +en-US = "Declaration to external library" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_DOCUMENT] +en-US = "Document" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_PAGE] +en-US = "Page" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_WORKBOOK] +en-US = "WorkBook" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_SHEET] +en-US = "Sheet" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_PRESENTATION] +en-US = "Presentation" + +[RID_STR_COMMON_RESULTS_LOCATION_TYPE_SLIDE] +en-US = "Slide" + +[RID_STR_COMMON_INVALID_PASSWORD] +en-US = "Invalid Password" + +[RID_STR_COMMON_PASSWORD_SKIPDOC] +en-US = "Skip Password Protected" + +[RID_STR_COMMON_NA] +en-US = "na" + +[RID_STR_COMMON_ATTRIBUTE_BROKEN] +en-US = "Broken!" + +[RID_STR_COMMON_ATTRIBUTE_BUILTIN] +en-US = "BuiltIn" + +[RID_STR_COMMON_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES] +en-US = "Check document VB-IDE/Tools/References" + +[RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT] +en-US = "Class refs to Me" + +[RID_STR_COMMON_ATTRIBUTE_COMPONENT] +en-US = "Component" + +[RID_STR_COMMON_ATTRIBUTE_CONTROLS] +en-US = "Controls" + +[RID_STR_COMMON_ATTRIBUTE_CUSTOM] +en-US = "Custom" + +[RID_STR_COMMON_ATTRIBUTE_DESCRIPTION] +en-US = "Description" + +[RID_STR_COMMON_ATTRIBUTE_GUID] +en-US = "GUID" + +[RID_STR_COMMON_ATTRIBUTE_FILE] +en-US = "File" + +[RID_STR_COMMON_ATTRIBUTE_PROPERTIES] +en-US = "Properties" + +[RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE] +en-US = "Further macro analysis not possible" + +[RID_STR_COMMON_ATTRIBUTE_INCLUDING] +en-US = "including:" + +[RID_STR_COMMON_ATTRIBUTE_INTACT] +en-US = "Intact" + +[RID_STR_COMMON_ATTRIBUTE_ISBROKEN] +en-US = "IsBroken" + +[RID_STR_COMMON_ATTRIBUTE_MAJOR] +en-US = "Major" + +[RID_STR_COMMON_ATTRIBUTE_MINOR] +en-US = "Minor" + +[RID_STR_COMMON_ATTRIBUTE_MISSING] +en-US = "MISSING" + +[RID_STR_COMMON_ATTRIBUTE_NAME] +en-US = "Name" + +[RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES] +en-US = "Non Portable External References" + +[RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT] +en-US = "External Reference Count" + +[RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES] +en-US = "Number of Lines" + +[RID_STR_COMMON_ATTRIBUTE_SIGNATURE] +en-US = "MD5 Hash" + +[RID_STR_COMMON_ATTRIBUTE_PASSWORD] +en-US = "Password" + +[RID_STR_COMMON_ATTRIBUTE_PATH] +en-US = "Path" + +[RID_STR_COMMON_ATTRIBUTE_PROCEDURES] +en-US = "Procedures" + +[RID_STR_COMMON_ATTRIBUTE_PROJECT] +en-US = "Project" + +[RID_STR_COMMON_ATTRIBUTE_TYPE] +en-US = "Type" + +[RID_STR_COMMON_ATTRIBUTE_TYPELIB] +en-US = "Type Library" + +[RID_STR_COMMON_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT] +en-US = "Unable to access VBProject" + +[RID_STR_COMMON_ATTRIBUTE_UNKNOWN] +en-US = "Unknown" + +[RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE] +en-US = "Control Types" + +[RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT] +en-US = "Control Types Count" + +[RID_STR_COMMON_ATTRIBUTE_VALUE] +en-US = "Value" + +[RID_STR_COMMON_ATTRIBUTE_VBPROJECT_PASSWORD] +en-US = "VBProject Password set" + +[RID_STR_COMMON_ISSUE_INFORMATION] +en-US = "Information" + +[RID_STR_COMMON_ISSUE_FORMAT] +en-US = "Format" + +[RID_STR_COMMON_ISSUE_PORTABILITY] +en-US = "Portability" + +[RID_STR_COMMON_ISSUE_VBA_MACROS] +en-US = "VBA Macros" + +[RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES] +en-US = "Content and Document Properties" + +[RID_STR_COMMON_NOTE_DOCUMENT_PROPERTIES_LOST] +en-US = "this summary property is lost" + +[RID_STR_COMMON_SUBISSUE_PROPERTIES] +en-US = "Properties" + +[RID_STR_COMMON_SUBISSUE_REFERENCES] +en-US = "References" + +[RID_STR_COMMON_SUBISSUE_EXTERNAL_REFERENCES_IN_MACROS] +en-US = "External References in Macro" + +[RID_STR_COMMON_SUBISSUE_INVALID_PASSWORD_ENTERED] +en-US = "Invalid Password Entered" + +[RID_STR_COMMON_SUBISSUE_DOCUMENT_PARTS_PROTECTION] +en-US = "Document Parts Protection" + +[RID_STR_COMMON_SUBISSUE_MACRO_PASSWORD_PROTECTION] +en-US = "Password Protected" + +[RID_STR_COMMON_SUBISSUE_PASSWORDS_PROTECTION] +en-US = "Password Protection" + +[RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME] +en-US = "Object Name" + +[RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE] +en-US = "Object Type" + +[RID_STR_COMMON_ATTRIBUTE_SOURCE] +en-US = "Source" + +[RID_STR_COMMON_NOTE_HF_PREPARABLE] +en-US = "will add additional returns to the header/footer" + +[RID_STR_COMMON_PREPARATION_FOLDER] +en-US = "prepared" + +[RID_STR_COMMON_SUBISSUE_DOCUMENT_CUSTOM_PROPERTY] +en-US = "Document Custom Property" + +[RID_STR_COMMON_MACRO_CLASS_COMPLEX] +en-US = "Complex" + +[RID_STR_COMMON_MACRO_CLASS_MEDIUM] +en-US = "Medium" + +[RID_STR_COMMON_MACRO_CLASS_SIMPLE] +en-US = "Simple" + +[RID_STR_COMMON_MACRO_CLASS_NONE] +en-US = "No Macros" + +[RID_STR_COMMON_ISSUE_CLASS_COMPLEX] +en-US = "Complex" + +[RID_STR_COMMON_ISSUE_CLASS_MINOR] +en-US = "Minor" + +[RID_STR_COMMON_ISSUE_CLASS_NONE] +en-US = "No Issues" + +[RID_STR_COMMON_OV_VERSION_STR] +en-US = "Created by" + +[RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_TITLE] +en-US = "Which documents do you need to migrate?" + +[RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_BODY] +en-US = "<CR>The last modified date is an indicator of the importance of a document. It helps you decide which documents should just be archived to a read only format such as Adobe PDF and which actually need to be migrated to <PRODUCTNAME> where they can continue to be updated and modified." + +[RID_STR_COMMON_OV_LEGEND_TITLE] +en-US = "Legend" + +[RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY] +en-US = "< 3 months: Migrate to <PRODUCTNAME>.<CR>3 - 6 Months: Careful review to see if they should be archived or migrated to <PRODUCTNAME>.<CR>6 - 12 Months: Quick review, either archive or migrate to the read/write <PRODUCTNAME> XML file format.<CR>> 1 Year: Older than 1 year, archive to read-only format such as PDF" + +[RID_STR_COMMON_OV_DOC_MACRO_COMMENT_TITLE] +en-US = "How many documents contain macros?" + +[RID_STR_COMMON_OV_DOC_MACRO_COMMENT_BODY] +en-US = "<CR><PRODUCTNAME> includes <PRODUCTNAME> BASIC, a Basic dialect that is similar to Microsoft's Visual Basic for Application (VBA), but <PRODUCTNAME> uses a different sets of objects to access the underlying Office.<CR>This makes it necessary to migrate the VBA macros into the platform independent <PRODUCTNAME> BASIC. Your local <PRODUCTNAME> Migration partner can help you with these VBA macro migrations." + +[RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY] +en-US = "Complex: Macros using Forms, Controls and external references<CR>Medium: Macros with more than 50 lines of code<CR>Simple: Macros with less than 50 lines of code<CR>None: No macros in the document" + +[RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_DAW] +en-US = "Analysis of document migration issues for documents modified within the last <TOPIC> months" + +[RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT] +en-US = "High level analysis of document migration issues" + +[RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_TITLE] +en-US = "Which documents may have migration issues?" + +[RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_BODY] +en-US = "<CR>Some Microsoft Office documents may not migrate perfectly into <PRODUCTNAME>. These issues are outlined in the <PRODUCTNAME> Migration Guide. <PRODUCTNAME> engineering is working continuously to resolve these issues by improving the Microsoft Office filters.<CR>The Document Analysis Wizard has been provided by <PRODUCTNAME> engineering to detect the most important of these migration issues in any Microsoft Office document you wish to specify. These findings are summarised below [refer to the 'List of documents' sheet to see the list of all analyzed documents]." + +[RID_STR_COMMON_OV_DOC_ANALYSIS_DAW_LEGEND_BODY] +en-US = "Complex: More complex migration issues.<CR>Minor: Minor migration issues easily fixed by any user.<CR>None: No issues Migrate to <PRODUCTNAME> without any issues.<CR><CR>Your <PRODUCTNAME> Migration Partners can help you with these more complex migration issues [refer to link above]. For instance they can migrate these documents to custom templates that achieve the same functionality but work well in both Office environments allowing the documents to be freely exchanged." + +[RID_STR_COMMON_OV_DOC_ANALYSIS_PAW_LEGEND_BODY] +en-US = "Complex: More complex migration issues.<CR>Minor: Minor migration issues easily fixed by any user.<CR>None: No issues Migrate to <PRODUCTNAME> without any issues." + +[RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE] +en-US = "Document modification dates" + +[RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE] +en-US = "Document with Macro Migration Issues" + +[RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE] +en-US = "Documents with Document Migration Issues" + +[RID_STR_COMMON_PREPARATION_NOTE] +en-US = "Preparation" + +[RID_STR_COMMON_CANNOT_OPEN] +en-US = "Cannot open - no analysis possible" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW] +en-US = "Overview" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_COSTS] +en-US = "Issues Analyzed" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD] +en-US = "Word Issues" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL] +en-US = "Excel Issues" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT] +en-US = "PowerPoint Issues" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS] +en-US = "Issue Details" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS] +en-US = "Reference Details" + +[RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP] +en-US = "List of documents" + +[RID_STR_COMMON_ANALYSIS_STR] +en-US = "Analysis" + +[RID_STR_COMMON_NOTE_PRE] +en-US = "Note" + +[RID_STR_COMMON_NOTE_POST] +en-US = " on migration" + +[RID_STR_COMMON_OLE_EMBEDDED] +en-US = "Embedded OLE Object" + +[RID_STR_COMMON_OLE_LINKED] +en-US = "Linked OLE Object" + +[RID_STR_EXCEL_ISSUE_CHARTS_AND_TABLES] +en-US = "Charts and Tables" + +[RID_STR_EXCEL_ISSUE_FORMAT] +en-US = "Format" + +[RID_STR_EXCEL_ISSUE_FUNCTIONS] +en-US = "Functions" + +[RID_STR_EXCEL_ISSUE_PORTABILITY] +en-US = "Portability" + +[RID_STR_EXCEL_ISSUE_VBA_MACROS] +en-US = "VBA Macros" + +[RID_STR_EXCEL_ISSUE_INFORMATION] +en-US = "Information" + +[RID_STR_EXCEL_SUBISSUE_PIVOT] +en-US = "Pivot" + +[RID_STR_EXCEL_SUBISSUE_ZOOM] +en-US = "Zoom" + +[RID_STR_EXCEL_TRUE] +en-US = "True" + +[RID_STR_EXCEL_FALSE] +en-US = "False" + +[RID_STR_EXCEL_SUBISSUE_MAX_SHEETS_EXCEEDED] +en-US = "Maximum Sheets Exceeded" + +[RID_STR_EXCEL_SUBISSUE_ATTRIBUTES] +en-US = "Cell Attributes" + +[RID_STR_EXCEL_SUBISSUE_EXTERNAL] +en-US = "External" + +[RID_STR_EXCEL_SUBISSUE_SHEET_CHART] +en-US = "Sheet Chart" + +[RID_STR_EXCEL_SUBISSUE_EMBEDDED_CHART] +en-US = "Embedded Chart" + +[RID_STR_EXCEL_SUBISSUE_INVALID_WORKSHEET_NAME] +en-US = "Invalid Worksheet Name" + +[RID_STR_EXCEL_ATTRIBUTE_BADCHARACTER] +en-US = "'<TOKEN1>' at pos <TOKEN2>" + +[RID_STR_EXCEL_ATTRIBUTE_DB_QUERY] +en-US = "Connection string" + +[RID_STR_EXCEL_ATTRIBUTE_NAME] +en-US = "Name" + +[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_PIVOTFIELDS] +en-US = "Number of PivotFields" + +[RID_STR_EXCEL_ATTRIBUTE_TITLE] +en-US = "Title" + +[RID_STR_EXCEL_ATTRIBUTE_TYPE] +en-US = "Type" + +[RID_STR_EXCEL_ATTRIBUTE_PIE] +en-US = "Pie" + +[RID_STR_EXCEL_ATTRIBUTE_SLICES_IN_DIFFERENT_DIRECTION] +en-US = "Slices in diff. direction" + +[RID_STR_EXCEL_ATTRIBUTE_LEGEND_NAME] +en-US = "Legend Name" + +[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_LEGEND_ENTRIES] +en-US = "Number of Legend Entries" + +[RID_STR_EXCEL_ATTRIBUTE_PIVOT_TABLE_NAME] +en-US = "PivotTable Name" + +[RID_STR_EXCEL_ATTRIBUTE_PIVOT_FIELDS_VISIBLE] +en-US = "PivotFields Visible" + +[RID_STR_EXCEL_ATTRIBUTE_PIVOT_FIELDS_NUM] +en-US = "Number of PivotFields" + +[RID_STR_EXCEL_ATTRIBUTE_PRINT_RANGE] +en-US = "Print Range" + +[RID_STR_EXCEL_ATTRIBUTE_DISPLAY_ZOOM] +en-US = "Display Zoom" + +[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_SHEETS] +en-US = "Number of Sheets" + +[RID_STR_EXCEL_ATTRIBUTE_LIST_SOURCE] +en-US = "ListSource" + +[RID_STR_EXCEL_ATTRIBUTE_CUSTOM_FORMULA] +en-US = "Custom Formula" + +[RID_STR_EXCEL_ATTRIBUTE_SET] +en-US = "Set" + +[RID_STR_EXCEL_ATTRIBUTE_LINE_STYLE] +en-US = "Line Style" + +[RID_STR_EXCEL_ATTRIBUTE_DASHED_DOT] +en-US = "Dashed/Dot" + +[RID_STR_EXCEL_ATTRIBUTE_FILL_PATTERN] +en-US = "Fill Pattern" + +[RID_STR_EXCEL_ATTRIBUTE_PATTERNED] +en-US = "Patterned" + +[RID_STR_EXCEL_ATTRIBUTE_FUNCTION_STRING] +en-US = "Function String" + +[RID_STR_EXCEL_ATTRIBUTE_PASSWORD_TO_OPEN] +en-US = "Password to Open" + +[RID_STR_EXCEL_ATTRIBUTE_PASSWORD_TO_MODIFY] +en-US = "Password to Modify" + +[RID_STR_EXCEL_ATTRIBUTE_OBJECT_TYPE] +en-US = "Object Type" + +[RID_STR_EXCEL_ATTRIBUTE_OBJECT_NAME] +en-US = "Object Name" + +[RID_STR_EXCEL_ATTRIBUTE_SOURCE] +en-US = "Source" + +[RID_STR_EXCEL_ATTRIBUTE_VALUE] +en-US = "Value" + +[RID_STR_EXCEL_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT] +en-US = "Unable to access VBProject" + +[RID_STR_EXCEL_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE] +en-US = "Further macro analysis not possible" + +[RID_STR_EXCEL_ATTRIBUTE_VBPROJECT_PASSWORD_SET] +en-US = "VBProject Password Set" + +[RID_STR_EXCEL_ATTRIBUTE_PROJECT] +en-US = "Project" + +[RID_STR_EXCEL_ATTRIBUTE_COMPONENT] +en-US = "Component" + +[RID_STR_EXCEL_ATTRIBUTE_PROCEDURES] +en-US = "Procedures" + +[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_LINES] +en-US = "Number of Lines" + +[RID_STR_EXCEL_ATTRIBUTE_CONTROLS] +en-US = "Controls" + +[RID_STR_EXCEL_ATTRIBUTE_TYPES] +en-US = "Types" + +[RID_STR_EXCEL_ATTRIBUTE_DESCRIPTION] +en-US = "Description" + +[RID_STR_EXCEL_ATTRIBUTE_FILE] +en-US = "File" + +[RID_STR_EXCEL_ATTRIBUTE_PATH] +en-US = "Path" + +[RID_STR_EXCEL_ATTRIBUTE_MISSING] +en-US = "MISSING" + +[RID_STR_EXCEL_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES] +en-US = "Check document VB-IDE/Tools/References" + +[RID_STR_EXCEL_ATTRIBUTE_MAJOR] +en-US = "Major" + +[RID_STR_EXCEL_ATTRIBUTE_MINOR] +en-US = "Minor" + +[RID_STR_EXCEL_ATTRIBUTE_BUILT_IN] +en-US = "Built In" + +[RID_STR_EXCEL_ATTRIBUTE_INTACT] +en-US = "Intact" + +[RID_STR_EXCEL_ATTRIBUTE_TYPELIB] +en-US = "TypeLib" + +[RID_STR_EXCEL_ATTRIBUTE_GUID] +en-US = "GUID" + +[RID_STR_EXCEL_ATTRIBUTE_CUSTOM] +en-US = "Custom" + +[RID_STR_EXCEL_ATTRIBUTE_IS_BROKEN] +en-US = "Is Broken" + +[RID_STR_EXCEL_ATTRIBUTE_BROKEN] +en-US = "Broken!" + +[RID_STR_EXCEL_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES] +en-US = "Non Portable External References" + +[RID_STR_EXCEL_ATTRIBUTE_INCLUDING] +en-US = "including:" + +[RID_STR_EXCEL_ATTRIBUTE_PASSWORD] +en-US = "Password" + +[RID_STR_EXCEL_ENUMERATION_CUSTOM] +en-US = "Custom" + +[RID_STR_EXCEL_ENUMERATION_LIST] +en-US = "List" + +[RID_STR_EXCEL_ENUMERATION_UNKNOWN] +en-US = "Unknown" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_CONTINUOUS] +en-US = "Continuous" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DASH] +en-US = "Dash" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DASHDOT] +en-US = "DashDot" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DOT] +en-US = "Dot" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_DOUBLE] +en-US = "Double" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_SLANTDASHDOT] +en-US = "SlantDashDot" + +[RID_STR_EXCEL_ENUMERATION_LINE_STYLE_LINESTYLENONE] +en-US = "LineStyleNone" + +[RID_STR_EXCEL_NOTE_DB_QUERY] +en-US = "The connection to the database in <PRODUCTNAME> will be lost . The data will appear correctly but can not be updated." + +[RID_STR_EXCEL_NOTE_INVALIDWORKSHEETNAME] +en-US = "The worksheet name contains characters that are not supported by <PRODUCTNAME>. Please rename your sheet and exclude these characters." + +[RID_STR_EXCEL_NOTE_ZOOM] +en-US = "all sheets will have the same zoom irrespective of their Excel View/Zoom setting after migration to <PRODUCTNAME>" + +[RID_STR_EXCEL_NOTE_CELL_ATTRIBUTES_3] +en-US = "this line style is imported as a solid line. Only solid line syles are supported in <PRODUCTNAME>" + +[RID_STR_EXCEL_NOTE_CELL_ATTRIBUTES_4] +en-US = "this fill pattern is imported as a solid gray. Only solid fill patterns are supported in <PRODUCTNAME>" + +[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_1] +en-US = "this function returns platform dependent information specific to Windows and is not imported to <PRODUCTNAME>" + +[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_2] +en-US = "this function returns error codes specific to Excel and is imported in <PRODUCTNAME> as the stub function ErrorType() always returning Err.520" + +[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_3] +en-US = "this is an external function referenced from an Excel spreadsheet. It does not import correctly to <PRODUCTNAME>. The external reference is stripped and the resulting formula always returns #ADDIN?" + +[RID_STR_EXCEL_NOTE_DOCUMENT_PROPERTIES_1] +en-US = "this summary property is lost" + +[RID_STR_EXCEL_NOTE_DOCUMENT_PROPERTIES_2] +en-US = "this custom property is lost" + +[RID_STR_EXCEL_NOTE_SHEET_LIMITS_1] +en-US = "all sheets will be lost in <PRODUCTNAME> that are greater than " + +[RID_STR_EXCEL_NOTE_SHEET_LIMITS_2] +en-US = "all sheets must be moved to a new workbook before migration that are greater than " + +[RID_STR_EXCEL_SUBLOCATION_NA] +en-US = "na" + +[RID_STR_EXCEL_SUBISSUE_WORKBOOK_PROTECTION] +en-US = "Workbook Protection" + +[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_SHARING] +en-US = "Protection Sharing" + +[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_STRUCTURE] +en-US = "Protection Structure" + +[RID_STR_EXCEL_ATTRIBUTE_PROTECT_TYPE_WINDOWS] +en-US = "Protection Windows" + +[RID_STR_EXCEL_NOTE_PASSWORD_TO_OPEN] +en-US = "workbook is protected" + +[RID_STR_EXCEL_NOTE_DATATABLE] +en-US = "no simple workaround, could copy the data table and paste below the chart" + +[RID_STR_EXCEL_NOTE_XAXISCATEGORY] +en-US = "only category option supported. Setup your category labels you need on the sheet" + +[RID_STR_EXCEL_NOTE_UNSUPPORTEDTYPE1] +en-US = "following chart types not supported" + +[RID_STR_EXCEL_NOTE_UNSUPPORTEDTYPE2] +en-US = "pie of pie,exploded 3D pie,bar of pie,bubble,filled radar,exploded doughnut" + +[RID_STR_EXCEL_NOTE_TRENDLINE] +en-US = "replace the trend line by drawing a line on the chart. You must click outside the chart when adding the line and drag it onto the chart. Objects created by clicking on the chart will not import" + +[RID_STR_EXCEL_NOTE_DATALABELWITHLEGEND] +en-US = "after import into <PRODUCTNAME>, select Insert->Data Labels->show legend icon with label and the legend key will appear" + +[RID_STR_EXCEL_NOTE_LEGENDPOSITION] +en-US = "only legend to the right is supported on import. Change legend position in <PRODUCTNAME> after import" + +[RID_STR_EXCEL_NOTE_TITLEFONT] +en-US = "title font with different font size is not supported on import, set a sub-title in <PRODUCTNAME>, then change the font size" + +[RID_STR_EXCEL_NOTE_SERIESCHARTTYPE] +en-US = "multiple series with different chart types. SO only supports one chart type for all series. Adjust the chart type to best display the series" + +[RID_STR_EXCEL_NOTE_DATASOURCENOTLINKEDTOCELL] +en-US = "data sources to catalogue or other external sources not supported. Data source must be set to cell or range on the sheet" + +[RID_STR_EXCEL_NOTE_CATEGORYANDDATA] +en-US = "category names must be located above or to the left of the value ranges" + +[RID_STR_EXCEL_NOTE_DATASOURCEONDIFFERENTSHEET] +en-US = "data sources must be located on the same sheet. Paste the data sources onto the same sheet" + +[RID_STR_EXCEL_NOTE_CATEGORYLABELMORETHANONECELL] +en-US = "category labels spanning multiple cells are not supported. Copy all the text to one cell" + +[RID_STR_EXCEL_NOTE_COLUMNBAR] +en-US = "chart 'series in' must match the data source. For data source in single row, set 'series in' = row. For data source in single column, set 'series in' = column" + +[RID_STR_EXCEL_NOTE_BORDER] +en-US = "chart border will not appear in <PRODUCTNAME>, before import,set border to none, draw a rectangle around the border of the chart" + +[RID_STR_EXCEL_NOTE_AXISINTERVAL] +en-US = " y axis interval setting will be changed in <PRODUCTNAME>. Modify axes interval setting in <PRODUCTNAME>, re-set major interval scale" + +[RID_STR_EXCEL_ATTRIBUTE_DATATABLE] +en-US = "Data Table" + +[RID_STR_EXCEL_ATTRIBUTE_INVALIDCHARACTER] +en-US = "Invalid Characters" + +[RID_STR_EXCEL_ATTRIBUTE_XAXISCATEGORY] +en-US = "Chart Axes" + +[RID_STR_EXCEL_ATTRIBUTE_TIMESCALE] +en-US = "time scale/auto" + +[RID_STR_EXCEL_ATTRIBUTE_UNSUPPORTEDTYPE] +en-US = "Unsupported Chart Type" + +[RID_STR_EXCEL_ATTRIBUTE_TRENDLINE] +en-US = "Trendline" + +[RID_STR_EXCEL_ATTRIBUTE_DATALABELWITHLEGEND] +en-US = "Data Label With Legend" + +[RID_STR_EXCEL_ATTRIBUTE_LEGENDPOSITION] +en-US = "Legend Position" + +[RID_STR_EXCEL_ATTRIBUTE_TITLEFONT] +en-US = "Title Font" + +[RID_STR_EXCEL_ATTRIBUTE_DIFFERENT] +en-US = "Different" + +[RID_STR_EXCEL_ATTRIBUTE_SERIESCHARTTYPE] +en-US = "Multiple series chart type" + +[RID_STR_EXCEL_ATTRIBUTE_CHANGED] +en-US = "changed" + +[RID_STR_EXCEL_ATTRIBUTE_DATASOURCE] +en-US = "Data Source" + +[RID_STR_EXCEL_ATTRIBUTE_DATASOURCENOTLINKEDTOCELL] +en-US = "Not Linked To A Cell" + +[RID_STR_EXCEL_ATTRIBUTE_CATEGORYANDDATA] +en-US = "Category And Data" + +[RID_STR_EXCEL_ATTRIBUTE_SEPARATE] +en-US = "Separate" + +[RID_STR_EXCEL_ATTRIBUTE_DATASOURCEONDIFFERENTSHEET] +en-US = "On Different Sheet" + +[RID_STR_EXCEL_ATTRIBUTE_CATEGORYLABEL] +en-US = "Category Label" + +[RID_STR_EXCEL_ATTRIBUTE_CATEGORYLABELMORETHANONECELL] +en-US = "More Than One Cell" + +[RID_STR_EXCEL_ATTRIBUTE_COLUMNBAR] +en-US = "Column/Bar Chart" + +[RID_STR_EXCEL_ATTRIBUTE_ONECOLUMNROW] +en-US = "Data Source With Single Column/ Chart Series In Row" + +[RID_STR_EXCEL_ATTRIBUTE_BORDER] +en-US = "Border" + +[RID_STR_EXCEL_ATTRIBUTE_AXISINTERVAL] +en-US = "Y Axis Interval" + +[RID_STR_EXCEL_ATTRIBUTE_AUTO] +en-US = "Auto" + +[RID_STR_EXCEL_ATTRIBUTE_CHARTNAME] +en-US = "Chart Name" + +[RID_STR_EXCEL_SUBISSUE_CHART_COMPLEX] +en-US = "Chart Issues Complex" + +[RID_STR_EXCEL_SUBISSUE_CHART_MINOR] +en-US = "Chart Issues Minor" + +[RID_STR_EXCEL_ATTRIBUTE_NOTRIGHT] +en-US = "not at right hand side" + +[RID_STR_EXCEL_ATTRIBUTE_NUMBER_OF_CELLS] +en-US = "number cells effected" + +[RID_STR_PP_TRUE] +en-US = "True" + +[RID_STR_PP_FALSE] +en-US = "False" + +[RID_STR_PP_ISSUE_OBJECTS_GRAPHICS_AND_TEXTBOXES] +en-US = "Objects, Graphics and Textboxes" + +[RID_STR_PP_SUBISSUE_COMMENT] +en-US = "Comment" + +[RID_STR_PP_SUBISSUE_MOVIE] +en-US = "Movie" + +[RID_STR_PP_ATTRIBUTE_CONTENT] +en-US = "Content" + +[RID_STR_PP_ATTRIBUTE_LOOP] +en-US = "Loop" + +[RID_STR_PP_ATTRIBUTE_PLAYONENTRY] +en-US = "PlayOnEntry" + +[RID_STR_PP_ATTRIBUTE_REWIND] +en-US = "Rewind" + +[RID_STR_PP_ATTRIBUTE_TYPES] +en-US = "Types" + +[RID_STR_PP_ENUMERATION_VIEW_HANDOUT_MASTER] +en-US = "View Handout Master" + +[RID_STR_PP_ENUMERATION_VIEW_NORMAL] +en-US = "View Normal" + +[RID_STR_PP_ENUMERATION_VIEW_NOTES_MASTER] +en-US = "View Notes Master" + +[RID_STR_PP_ENUMERATION_VIEW_NOTES_PAGE] +en-US = "View Notes Page" + +[RID_STR_PP_ENUMERATION_VIEW_OUTLINE] +en-US = "View Outline" + +[RID_STR_PP_ENUMERATION_VIEW_SLIDE] +en-US = "View Slide" + +[RID_STR_PP_ENUMERATION_VIEW_SLIDE_MASTER] +en-US = "View Slide Master" + +[RID_STR_PP_ENUMERATION_VIEW_SLIDE_SORTER] +en-US = "View Slide Sorter" + +[RID_STR_PP_ENUMERATION_VIEW_TITLE_MASTER] +en-US = "View Title Master" + +[RID_STR_PP_ENUMERATION_UNKNOWN] +en-US = "Unknown" + +[RID_RESXLS_COST_Action_Settings] +en-US = "Action Settings" + +[RID_RESXLS_COST_Add_custom_properties_to_document_Properties_Summary_Comments_field] +en-US = "Add custom properties to document Properties Summary Comments field." + +[RID_RESXLS_COST_Additional_Weighting_Factors] +en-US = "Additional Weighting Factors" + +[RID_RESXLS_COST_All_sheets__256_will_need_to_be_moved_to_a_new_workbook] +en-US = "All sheets >256 will need to be moved to a new workbook" + +[RID_RESXLS_COST_Appearance] +en-US = "Appearance" + +[RID_RESXLS_COST_Application] +en-US = "Application" + +[RID_RESXLS_COST_AutoFilter] +en-US = "AutoFilter" + +[RID_RESXLS_COST_Border_Styles] +en-US = "Border Styles" + +[RID_RESXLS_COST_Cell_Attributes] +en-US = "Cell Attributes" + +[RID_RESXLS_COST_CELL_SPAN_WORKAROUND] +en-US = "Add extra row below cell. Cut and paste contents running onto 2nd page into new cell." + +[RID_RESXLS_COST_Cell_Spanning_Page] +en-US = "Cell Spanning Page" + +[RID_RESXLS_COST_ChangesAndReviewing] +en-US = "Changes And Reviewing" + +[RID_RESXLS_COST_Charts_And_Tables] +en-US = "Charts And Tables" + +[RID_RESXLS_COST_Comment] +en-US = "Comment" + +[RID_RESXLS_COST_Content_And_Document_Properties] +en-US = "Content And Document Properties" + +[RID_RESXLS_COST_ContentAndDocumentProperties] +en-US = "Content And Document Properties" + +[RID_RESXLS_COST_Controls] +en-US = "Controls" + +[RID_RESXLS_COST_Cost] +en-US = "Cost Comment" + +[RID_RESXLS_COST_Cost__In_simple_cases_cut_and_paste_to_new_sheet_3___5_min] +en-US = "Cost: In simple cases cut and paste to new sheet. 3 - 5 min. May exist functions that refer to these cells. 10+" + +[RID_RESXLS_COST_COST_0] +en-US = "Cost = 0. No work around." + +[RID_RESXLS_COST_COST_EMBED_CHART] +en-US = "Variations in cost can range from 0 - 30 mins. Cost caused by uneven data souce, external data source, unsupported chart types, floating legend position." + +[RID_RESXLS_COST_COST_ERROR_TYPE] +en-US = "Fix up cost can vary depending on the context in which this is used. Cost 3 - 5" + +[RID_RESXLS_COST_COST_INFO] +en-US = "Fix up cost can vary depending on the context in which this is used. Cost 2 - 4" + +[RID_RESXLS_COST_COST_INVAL_PASS] +en-US = "Cost = 0. Rerun analysis with correct password." + +[RID_RESXLS_COST_COST_INVALID_WORKSHEET_NAME] +en-US = "Aufewand: Vergewissern Sie sich nach der Umbenennung, dass alle Makros mit Verweisen auf dieses Arbeitsblatt ebenfalls angepaßt werden. Der Aufwand hängt von der Zahl der Codezeilen ab, die auf den Arbeitsblattnamen verweisen." +en-US = "Cost: When the worksheet has been renamed, ensure that all macros with a reference to the worksheet are also renamed accordingly. Cost depends on how many lines of code there are that refer to the worksheet name." + +[RID_RESXLS_COST_Cost_of_4_min_per_line__takes_no_account_of_complexity_of_code__number_of_comment_lines_and_so_on] +en-US = "Cost of 4 min per line, takes no account of complexity of code, number of comment lines and so on" + +[RID_RESXLS_COST_Cost_per_Issue_or_Factor__min] +en-US = "Cost per Issue or Factor (min)" + +[RID_RESXLS_COST_COST_PIVOT] +en-US = "Cost = 0. Calc does not support dynamically created charts. No workaround." + +[RID_RESXLS_COST_COST_SHEET_CHART] +en-US = "Variations in cost can range from 0 - 30 mins. Cost caused by uneven data souce, external data source, unsupported chart types, floating legend position." + +[RID_RESXLS_COST_Cost_variations_occur_because_of_the_use_of_macros_with_controls] +en-US = "Cost variations occur because of the use of macros with controls." + +[RID_RESXLS_COST_COST_VBA_CONT_TYPE] +en-US = "Cost = 0. Total number of controls better estimate - this information is useful as an indication of complexity of the Forms." + +[RID_RESXLS_COST_COST_VBA_CONTROLS] +en-US = "Cost = 3 minute per control, this does not take account of issues with Frame controls or the number of these controls that have event handlers that need manually linked to migrated code." + +[RID_RESXLS_COST_COST_VBA_FORMS] +en-US = "Cost = 0. Using total number of controls on forms as better estimate" + +[RID_RESXLS_COST_COST_VBA_LOC] +en-US = "Cost of 4 min per line, takes no account of complexity of code, number of comment lines and so on" + +[RID_RESXLS_COST_COST_VBA_PROPS] +en-US = "Cost = 0 using lines of code as better cost estimate." + +[RID_RESXLS_COST_Costs__min] +en-US = "Costs (min)" + +[RID_RESXLS_COST_Custom_Bullet_List] +en-US = "Custom Bullet List" + +[RID_RESXLS_COST_Document_Custom_Properties] +en-US = "Document Custom Properties" + +[RID_RESXLS_COST_Document_Parts_Protection] +en-US = "Document Parts Protection" + +[RID_RESXLS_COST_Embedded_Chart] +en-US = "Chart Issues Minor" + +[RID_RESXLS_COST_embedded_objects] +en-US = "Cost = 0. Most embedded objects come across. If one does not then this may require some reenginering and is not in the scope of an automated cost calculation." + +[RID_RESXLS_COST_Embedded_OLE_Object] +en-US = "Embedded OLE Object" + +[RID_RESXLS_COST_Excel] +en-US = "Excel" + +[RID_RESXLS_COST_Excel_Totals] +en-US = "Excel Totals" + +[RID_RESXLS_COST_External] +en-US = "External" + +[RID_RESXLS_COST_External_References_In_Macro___Module__Class_or_UserForm] +en-US = "External References In Macro - Module, Class or UserForm" + +[RID_RESXLS_COST_Factor_Count] +en-US = "Factor Count" + +[RID_RESXLS_COST_Fields] +en-US = "Fields" + +[RID_RESXLS_COST_Filters] +en-US = "Filters" + +[RID_RESXLS_COST_Fixed_SO7] +en-US = "Fixed <PRODUCTNAME> <PRODUCTVERSION>" + +[RID_RESXLS_COST_Form_Field] +en-US = "Form Field" + +[RID_RESXLS_COST_Format] +en-US = "Format" + +[RID_RESXLS_COST_Functions] +en-US = "Functions" + +[RID_RESXLS_COST_Zoom] +en-US = "Zoom" + +[RID_RESXLS_COST_HEADERFOOTER_WORKAROUND] +en-US = "Insert carriage returns to resize header/ footer to the size of the graphic." + +[RID_RESXLS_COST_Hours_Per_MD] +en-US = "Hours Per MD =" + +[RID_RESXLS_COST_Indexes_And_References] +en-US = "Indexes And References" + +[RID_RESXLS_COST_Invalid_Password_Entered] +en-US = "Invalid Password Entered" + +[RID_RESXLS_COST_Invalid_Worksheet_Name] +en-US = "Invalid Worksheet Name" + +[RID_RESXLS_COST_Issue__18_of_the_24_table_border_styles_do_not_display_correctly] +en-US = "Issue: 18 of the 24 table border styles do not display correctly." + +[RID_RESXLS_COST_Issue__256_sheet_limit_exceeded] +en-US = "Issue: 256 sheet limit exceeded." + +[RID_RESXLS_COST_Issue__32000_row_limit_exceeded] +en-US = "Issue: 32000 row limit exceeded." + +[RID_RESXLS_COST_Issue__A_worksheet_in_the_workbook_has_a_name_with_invalid_characters] +en-US = "Issue: A worksheet in the workbook has a name with invalid characters." + +[RID_RESXLS_COST_Issue__AutoFilter_does_not_function_properly] +en-US = "Issue: AutoFilter does not function properly." + +[RID_RESXLS_COST_Issue__Calls_to_windows_API_functions_are_windows_specific] +en-US = "Issue: Calls to windows API functions are windows specific." + +[RID_RESXLS_COST_Issue__Chart_support_is_limited_in_SO7] +en-US = "Issue: Chart support is limited in <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Comments_are_lost_on_migration_to_SO7] +en-US = "Issue: Comments are lost on migration to <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Custom_Properties_are_lost_on_migration] +en-US = "Issue: Custom Properties are lost on migration" + +[RID_RESXLS_COST_Issue__Document_is_password_protected_and_cannot_be_opened_by_SO] +en-US = "Issue: Document is password protected and cannot be opened by SO." + +[RID_RESXLS_COST_Issue__External_functions_not_supported_by_SO7] +en-US = "Issue: External functions not supported by <PRODUCTNAME>" + +[RID_RESXLS_COST_Issue__External_references_are_windows_specific] +en-US = "Issue: External references are windows specific." + +[RID_RESXLS_COST_Issue__Fields_are_imported_but_need_to_have_the_link_to_datasource_reset] +en-US = "Issue: Fields are imported but need to have the link to data source reset." + +[RID_RESXLS_COST_Issue__Graphics___frames_in_header_footer_tend_to_be_misplaced] +en-US = "Issue: Graphics & frames in header footer tend to be misplaced." + +[RID_RESXLS_COST_Issue__Incorrect_password_entered] +en-US = "Issue: Incorrect password entered. " + +[RID_RESXLS_COST_Issue__Information_relating_to_the_data_source_is_lost_in_migration] +en-US = "Issue: Information relating to the data source is lost in migration." + +[RID_RESXLS_COST_Issue__Invalid_password_entered_Rerun_analysis] +en-US = "Issue: Invalid password entered. Rerun analysis." + +[RID_RESXLS_COST_Issue__Lost_during_migration_No_StarOffice_equivalent] +en-US = "Issue: Lost during migration. No <PRODUCTNAME> equivalent." + +[RID_RESXLS_COST_Issue__Macros_from_old_workbook_versions_do_not_import_into_SO7] +en-US = "Issue: Macros from old workbook versions do not import into SO9." + +[RID_RESXLS_COST_Issue__Modules_will_need_porting_to_StarOffice_Basic] +en-US = "Issue: Modules will need porting to <PRODUCTNAME> Basic." + +[RID_RESXLS_COST_Issue__Most_migrate_ok_but_do_not_roundtrip] +en-US = "Issue: Most migrate ok but do not roundtrip." + +[RID_RESXLS_COST_Issue__Movies_are_not_supported_by_SO7] +en-US = "Issue: Movies are not supported by <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Need_to_set_these_to_be_included_in_TOC_in_SO7] +en-US = "Issue: Need to set these to be included in TOC in <PRODUCTNAME>" + +[RID_RESXLS_COST_Issue__Password_protection_of_comments__tracked_changes_and_forms_is_lost] +en-US = "Issue: Password protection of comments, tracked changes and forms is lost." + +[RID_RESXLS_COST_Issue__Pivot_charts_are_not_supported_by_SO7] +en-US = "Issue: Pivot charts are not supported by <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Presents_a_cross_platform_interoperability_issue] +en-US = "Issue: Presents a cross platform interoperability issue." + +[RID_RESXLS_COST_Issue__Print_wide_pages_not_supported] +en-US = "Issue: Print wide pages not supported." + +[RID_RESXLS_COST_Issue__Shading_can_be_applied_to_fields_and_to_controls_separately_in_Word] +en-US = "Issue: Shading can be applied to fields and to controls separately in Word. <PRODUCTNAME> does not differentiate between controls and fields so shading can look different in Writer." + +[RID_RESXLS_COST_Issue__Table_imported_as_text_as_no_StarOffice_equivalent] +en-US = "Issue: Table imported as text as no <PRODUCTNAME> equivalent." + +[RID_RESXLS_COST_Issue__Tables_nested_in_tables_are_not_supported_by_SO7] +en-US = "Issue: Tables nested in tables are not supported by <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Tabs_are_incorrect_after_migration] +en-US = "Issue: Tabs are incorrect after migration. Certain format types do not migrate to <PRODUCTNAME>." + +[RID_RESXLS_COST_Issue__Text_form_fields_roundtrip_as_Fill_In_field] +en-US = "Issue: Text form fields roundtrip as Fill In field. Field attributes are lost." + +[RID_RESXLS_COST_Issue__Unsupported_formatting_set] +en-US = "Issue: Unsupported formatting set." + +[RID_RESXLS_COST_Issue__Unsupported_function_type] +en-US = "Issue: Unsupported function type. " + +[RID_RESXLS_COST_Issue__Userform_controls_will_need_porting_to_StarOffice_Basic] +en-US = "Issue: Userform controls will need porting to <PRODUCTNAME> Basic." + +[RID_RESXLS_COST_Issue__Userforms_controls_will_need_porting_to_StarOffice_Basic] +en-US = "Issue: Userform controls will need porting to <PRODUCTNAME> Basic." + +[RID_RESXLS_COST_Issue__Userforms_will_need_porting_to_StarOffice_Basic] +en-US = "Issue: Userforms will need porting to <PRODUCTNAME> Basic." + +[RID_RESXLS_COST_Issue__VBProject_is_password_protected_Remove_password__rerun_analysis] +en-US = "Issue: VBProject is password protected. Remove password, rerun analysis." + +[RID_RESXLS_COST_Issue__Will_need_refreshing_in_SO7_External_datasources_and_functions_are_not_supported] +en-US = "Issue: Will need refreshing in <PRODUCTNAME>. External data sources and functions are not supported" + +[RID_RESXLS_COST_Issue__Workbook_protection_is_not_supported] +en-US = "Issue: Workbook protection is not supported" + +[RID_RESXLS_COST_Issue__Writer_cannot_correctly_display_cells_spanning_more_than_1_page] +en-US = "Issue: Writer cannot correctly display cells spanning more than 1 page." + +[RID_RESXLS_COST_Issue_Category] +en-US = "Issue Category" + +[RID_RESXLS_COST_Issue_Count] +en-US = " Issue Count" + +[RID_RESXLS_COST_Issue_Type] +en-US = "Issue Type" + +[RID_RESXLS_COST_Linked_OLE_Object] +en-US = "Linked OLE Object" + +[RID_RESXLS_COST_Mail_Merge_Datasource] +en-US = "Mail Merge Data Source" + +[RID_RESXLS_COST_Mail_Merge_Field] +en-US = "Mail Merge Field" + +[RID_RESXLS_COST_Major_Issue] +en-US = "Complex Issue" + +[RID_RESXLS_COST_MAX_SHEETS_WORKAROUND] +en-US = "Need to move sheets to new workbook. " + +[RID_RESXLS_COST_Maximum_Rows_Exceeded] +en-US = "Maximum Rows Exceeded" + +[RID_RESXLS_COST_Maximum_Sheets_Exceeded] +en-US = "Maximum Sheets Exceeded" + +[RID_RESXLS_COST_Migration_Issues_Costs] +en-US = "Migration Issues Analyzed" + +[RID_RESXLS_COST_Movie] +en-US = "Movie" + +[RID_RESXLS_COST_NESTED_TABLE_WORKAROUND] +en-US = "In word use split cell to create similar layout." + +[RID_RESXLS_COST_Nested_Tables] +en-US = "Nested Tables" + +[RID_RESXLS_COST_Not_Planned] +en-US = "Not Planned" + +[RID_RESXLS_COST_Notes_And_Handouts] +en-US = "Notes And Handouts" + +[RID_RESXLS_COST_Number_Of_External_References] +en-US = "Number Of External References" + +[RID_RESXLS_COST_Number_Of_Lines] +en-US = "Number Of Lines" + +[RID_RESXLS_COST_Number_of_Lines_in_Unique_Modules] +en-US = "Number of Lines in Unique Code Modules" + +[RID_RESXLS_COST_Number_of_Modules] +en-US = "Number of Modules" + +[RID_RESXLS_COST_Number_of_Unique_Modules] +en-US = "Number of Unique Code Modules" + +[RID_RESXLS_COST_Numbering_Reference] +en-US = "Numbering Reference" + +[RID_RESXLS_COST_Numbering_Reference_Comment] +en-US = "Issue: <PRODUCTNAME> can not import references that refer in a numbered list." + +[RID_RESXLS_COST_Object_In_Header_Footer] +en-US = "Object In Header Footer" + +[RID_RESXLS_COST_Objects_And_Graphics] +en-US = "Objects And Graphics" + +[RID_RESXLS_COST_Objects_Graphics_And_Frames] +en-US = "Objects Graphics And Frames" + +[RID_RESXLS_COST_Objects_Graphics_And_Textboxes] +en-US = "Objects Graphics And Textboxes" + +[RID_RESXLS_COST_Old_Workbook_Version] +en-US = "Old Workbook Version" + +[RID_RESXLS_COST_OLE_Control] +en-US = "OLE Control" + +[RID_RESXLS_COST_OLECONTR_COST] +en-US = "Cost variations occur because of the use of macros with controls." + +[RID_RESXLS_COST_Page_Setup] +en-US = "Page Setup" + +[RID_RESXLS_COST_Password_Protected] +en-US = "Password Protected" + +[RID_RESXLS_COST_Password_Protection] +en-US = "Password Protection" + +[RID_RESXLS_COST_Pivot] +en-US = "Pivot Chart" + +[RID_RESXLS_COST_Planned_SO8] +en-US = "Planned" + +[RID_RESXLS_COST_Portability] +en-US = "Portability" + +[RID_RESXLS_COST_PowerPoint] +en-US = "PowerPoint" + +[RID_RESXLS_COST_PowerPoint_Totals] +en-US = "PowerPoint Totals" + +[RID_RESXLS_COST_Prepared_Issue_Count] +en-US = "Prepared Issue Count" + +[RID_RESXLS_COST_Prepared_Savings__min] +en-US = "Prepared Savings (min)" + +[RID_RESXLS_COST_Properties___Module__Class_or_UserForm] +en-US = "Properties - Module, Class or UserForm" + +[RID_RESXLS_COST_Remove_password_to_open] +en-US = "Remove password to open." + +[RID_RESXLS_COST_Remove_the_invalid_characters_from_the_worksheet_name] +en-US = "Remove the invalid characters from the worksheet name." + +[RID_RESXLS_COST_Rerun_analysis_with_correct_password] +en-US = "Rerun analysis with correct password." + +[RID_RESXLS_COST_Reset_link_to_Data_Base_having_setup_a_Datasource_in_SO7] +en-US = "Reset link to database having setup a data source in <PRODUCTNAME>." + +[RID_RESXLS_COST_set_cost_factor_if_the_macro_has_to_be_ported_off_Windows] +en-US = "Cost = 0. Set a cost factor if the macro has to be ported off Windows. " + +[RID_RESXLS_COST_Save_workbook_as_a_new_workbook_version] +en-US = "Save workbook as a new workbook version." + +[RID_RESXLS_COST_Setup_Datasource_in_SO7_using_Tools__Datasource] +en-US = "Setup data source in <PRODUCTNAME> using Tools/Data source" + +[RID_RESXLS_COST_Sheet_Chart] +en-US = "Chart Issues Complex" + +[RID_RESXLS_COST_Status] +en-US = "Status" + +[RID_RESXLS_COST_Table_Of_Authorities] +en-US = "Table Of Authorities" + +[RID_RESXLS_COST_Table_Of_Authorities_Field] +en-US = "Table Of Authorities Field" + +[RID_RESXLS_COST_Table_Of_Contents] +en-US = "Table Of Contents" + +[RID_RESXLS_COST_Tables] +en-US = "Tables" + +[RID_RESXLS_COST_TOC_ISSUE_WORKAROUND] +en-US = "Tab Issues: use fancy format. Numbering incorrect: remove blank lines with heading style used by TOC. Numbering abuts Header: replace leading tabs in Header style used in TOC with spaces." + +[RID_RESXLS_COST_Total_Cost___MD] +en-US = "Total Cost (MD) = " + +[RID_RESXLS_COST_User_Error] +en-US = "User Error" + +[RID_RESXLS_COST_User_Forms_Control_Count] +en-US = "User Forms Control Count" + +[RID_RESXLS_COST_User_Forms_Control_Type_Count] +en-US = "User Forms Control Type Count" + +[RID_RESXLS_COST_User_Forms_Count] +en-US = "User Forms Count" + +[RID_RESXLS_COST_VBA_Macros] +en-US = "VBA Macros" + +[RID_RESXLS_COST_Word] +en-US = "Word" + +[RID_RESXLS_COST_Word_Totals] +en-US = "Word Totals" + +[RID_RESXLS_COST_Work_Around] +en-US = "Work Around" + +[RID_RESXLS_COST_Workaround_Remove_protection_before_importing] +en-US = "Remove protection before importing" + +[RID_RESXLS_COST_WorkbookProtection] +en-US = "WorkbookProtection " + +[RID_RESXLS_DP_Accessed] +en-US = "Accessed" + +[RID_RESXLS_DP_All_Analysed_Documents___Properties] +en-US = "All Analysed Documents - properties" + +[RID_RESXLS_DP_Application] +en-US = "Application" + +[RID_RESXLS_DP_Based_on_Template] +en-US = "Based on Template" + +[RID_RESXLS_DP_Costs] +en-US = "Costs" + +[RID_RESXLS_DP_Created] +en-US = "Created" + +[RID_RESXLS_DP_Document_Details] +en-US = "Document Details" + +[RID_RESXLS_DP_Document_Issue_Costs] +en-US = "Document Migration Costs (min)" + +[RID_RESXLS_DP_Document_Migration_Issues] +en-US = "Document Migration Issues" + +[RID_RESXLS_DP_Document_Name] +en-US = "Document Name" + +[RID_RESXLS_DP_Document_Name_and_Path] +en-US = "Document Name and Path" + +[RID_RESXLS_DP_Issues_Complex_count] +en-US = "Issues Complex Count" + +[RID_RESXLS_DP_Last_Saved_By] +en-US = "Last Saved By" + +[RID_RESXLS_DP_Lines_of_Macro_Code] +en-US = "Lines of Macro Code" + +[RID_RESXLS_DP_Macro_Issues] +en-US = "Macro Migration Issues" + +[RID_RESXLS_DP_Macro_Migration_Costs] +en-US = "Macro Migration Costs (min)" + +[RID_RESXLS_DP_Macro_Migration_Issues] +en-US = "Macro Migration Issues" + +[RID_RESXLS_DP_Migration_Issues] +en-US = "Document Migration Issues" + +[RID_RESXLS_DP_Minor_Issues] +en-US = "Issues Minor Count" + +[RID_RESXLS_DP_Modified] +en-US = "Modified" + +[RID_RESXLS_DP_Pages_Sheets_Slides] +en-US = "Pages, Sheets or Slides Count" + +[RID_RESXLS_DP_Prepareable_Issues_Costs] +en-US = "Prepareable Issues Savings (min)" + +[RID_RESXLS_DP_Prepared_Issues] +en-US = "Prepareable Document Issues" + +[RID_RESXLS_DP_Printed] +en-US = "Printed" + +[RID_RESXLS_DP_Revision] +en-US = "Revision" + +[RID_RESXLS_DP_User_Form_Count] +en-US = "User Form Count" + +[RID_RESXLS_ID_All_Documents_with_Issues___Issue_Details] +en-US = "All Documents with Issues - Issue Details" + +[RID_RESXLS_ID_Application] +en-US = "Application" + +[RID_RESXLS_ID_Column__Left] +en-US = "Column/ Left" + +[RID_RESXLS_ID_Document_Name] +en-US = "Document Name" + +[RID_RESXLS_ID_Document_Name_and_Path] +en-US = "Document Name and Path" + +[RID_RESXLS_ID_Issue_Category] +en-US = "Issue Category" + +[RID_RESXLS_ID_Issue_Details] +en-US = "Issue Details" + +[RID_RESXLS_ID_Issue_Type] +en-US = "Issue Type" + +[RID_RESXLS_ID_Line__Row__Top] +en-US = "Line/ Row/ Top" + +[RID_RESXLS_ID_Location] +en-US = "Location" + +[RID_RESXLS_ID_Location_Type] +en-US = "Location Type" + +[RID_RESXLS_OV_3_to_6_months] +en-US = "3 - 6 months" + +[RID_RESXLS_OV_6_to_12_months] +en-US = "6 - 12 months" + +[RID_RESXLS_OV_Complex] +en-US = "Complex" + +[RID_RESXLS_OV_Cost_estimates_for_migration] +en-US = "Cost estimates for migration of all analyzed documents" + +[RID_RESXLS_OV_Costs] +en-US = "Costs (MD)" + +[RID_RESXLS_OV_Docs_with_DocumentMigrationIssues] +en-US = "Documents with Document Migration Issues (excludes macro issues)" + +[RID_RESXLS_OV_Document_Migration_Costs] +en-US = "Document Migration Costs<CR>( costs based on: issues listed in Issues Analyzed, excludes macros issues )" + +[RID_RESXLS_OV_Document_Modification_Dates] +en-US = "Document Modification Dates" + +[RID_RESXLS_OV_Document_Type] +en-US = "Type" + +[RID_RESXLS_OV_Documents_with_Macro_Migration_Issues] +en-US = "Documents with Macro Migration Issues" + +[RID_RESXLS_OV_Excel] +en-US = "Excel" + +[RID_RESXLS_OV_Excel_Costs] +en-US = "Excel " + +[RID_RESXLS_OV_Excel_Spreadsheet] +en-US = " Spreadsheets (.xls)" + +[RID_RESXLS_OV_Excel_Template] +en-US = " Templates (.xlt)" + +[RID_RESXLS_OV_GREATER_THAN_1_year] +en-US = "> 1 year" + +[RID_RESXLS_OV_Last_Modified] +en-US = "Last Modified" + +[RID_RESXLS_OV_LESS_3_months] +en-US = "< 3 months" + +[RID_RESXLS_OV_LESS_THAN3MONTHS] +en-US = "Templates (.dot)" + +[RID_RESXLS_OV_Macro_Migration_Costs] +en-US = "Manual Macro Migration Costs<CR>( costs based on: number of lines in unique code modules and number of user form controls )" + +[RID_RESXLS_OV_Medium] +en-US = "Medium" + +[RID_RESXLS_OV_Minor] +en-US = "Minor" + +[RID_RESXLS_OV_None] +en-US = "None" + +[RID_RESXLS_OV_Number] +en-US = "Number" + +[RID_RESXLS_OV_Number_of_Documents_Analyzed] +en-US = "Number of Documents Analyzed" + +[RID_RESXLS_OV_NumberOfDocs] +en-US = "Number of docs" + +[RID_RESXLS_OV_Potential_savings_macro_conversion] +en-US = "Potential Savings with Automated Macro Migration of 20 to 60%" + +[RID_RESXLS_OV_Potential_savings_prepared_docs] +en-US = "Potential Savings with Automated Preparation" + +[RID_RESXLS_OV_PowerPoint] +en-US = "PowerPoint" + +[RID_RESXLS_OV_PowerPoint_Costs] +en-US = "PowerPoint " + +[RID_RESXLS_OV_PowerPoint_Document] +en-US = " Presentations (.ppt)" + +[RID_RESXLS_OV_PowerPoint_Template] +en-US = " Templates (.pot)" + +[RID_RESXLS_OV_Simple] +en-US = "Simple" + +[RID_RESXLS_OV_Total] +en-US = "Total" + +[RID_RESXLS_OV_Totals] +en-US = "Totals" + +[RID_RESXLS_OV_Word] +en-US = "Word" + +[RID_RESXLS_OV_Word_Costs] +en-US = "Word " + +[RID_RESXLS_OV_Word_Document] +en-US = "Documents (.doc)" + +[RID_RESXLS_OV_Word_Template] +en-US = "Templates (.dot)" + +[RID_RESXLS_PP_Action_Settings] +en-US = "Action Settings" + +[RID_RESXLS_PP_Application] +en-US = "Application" + +[RID_RESXLS_PP_Content___Document_Properties] +en-US = "Content & Document Properties" + +[RID_RESXLS_PP_Document_Name_and_Path] +en-US = "Document Name and Path" + +[RID_RESXLS_PP_Fields] +en-US = "Fields" + +[RID_RESXLS_PP_Format] +en-US = "Format" + +[RID_RESXLS_PP_Notes___Handouts] +en-US = "Notes & Handouts" + +[RID_RESXLS_PP_Objects__Graphics___Textboxes] +en-US = "Objects, Graphics & Textboxes" + +[RID_RESXLS_PP_Portability] +en-US = "Portability" + +[RID_RESXLS_PP_PowerPoint_Documents_with_Issues___Issue_Summary] +en-US = "PowerPoint Documents with Issues - Issue Summary" + +[RID_RESXLS_PP_PowerPoint_Presentation_Name] +en-US = "PowerPoint Presentation Name" + +[RID_RESXLS_PP_VBA_Macros] +en-US = "VBA Macros" + +[RID_RESXLS_RD_All_Documents_with_Macros___Reference_Details] +en-US = "All Documents with Macros - Reference Details" + +[RID_RESXLS_RD_Application] +en-US = "Application" + +[RID_RESXLS_RD_Description] +en-US = "Description" + +[RID_RESXLS_RD_Document_Name] +en-US = "Document Name" + +[RID_RESXLS_RD_Document_Name_and_Path] +en-US = "Document Name and Path" + +[RID_RESXLS_RD_Location] +en-US = "Location" + +[RID_RESXLS_RD_Reference] +en-US = "Reference" + +[RID_RESXLS_RD_Reference_Details] +en-US = "Reference Details" + +[RID_RESXLS_WI_Application] +en-US = "Application" + +[RID_RESXLS_WI_Changes_and_Reviewing] +en-US = "Changes and Reviewing" + +[RID_RESXLS_WI_Content___Document_Properties] +en-US = "Content & Document Properties" + +[RID_RESXLS_WI_Controls] +en-US = "Controls" + +[RID_RESXLS_WI_Document_Name_and_Path] +en-US = "Document Name and Path" + +[RID_RESXLS_WI_Fields] +en-US = "Fields" + +[RID_RESXLS_WI_Format] +en-US = "Format" + +[RID_RESXLS_WI_Index_and_References] +en-US = "Index and References" + +[RID_RESXLS_WI_Objects__Graphics____Frames] +en-US = "Objects, Graphics & Frames" + +[RID_RESXLS_WI_Portability] +en-US = "Portability" + +[RID_RESXLS_WI_Tables] +en-US = "Tables" + +[RID_RESXLS_WI_VBA_Macros] +en-US = "VBA Macros" + +[RID_RESXLS_WI_Word_Document_Name] +en-US = "Word Document Name" + +[RID_RESXLS_WI_Word_Documents_with_Issues___Issue_Summary] +en-US = "Word Documents with Issues - Issue Summary" + +[RID_RESXLS_XL_Application] +en-US = "Application" + +[RID_RESXLS_XL_Changes___Reviewing] +en-US = "Changes & Reviewing" + +[RID_RESXLS_XL_Charts___Tables] +en-US = "Charts & Tables" + +[RID_RESXLS_XL_Excel_Documents_with_Issues___Issue_Summary] +en-US = "Excel Documents with Issues - Issue Summary" + +[RID_RESXLS_XL_Excel_Spreadsheet_Name] +en-US = "Excel Spreadsheet Name" + +[RID_RESXLS_XL_Filters] +en-US = "Filters" + +[RID_RESXLS_XL_Format] +en-US = "Format" + +[RID_RESXLS_XL_Functions] +en-US = "Functions" + +[RID_RESXLS_XL_Objects___Graphics] +en-US = "Objects & Graphics" + +[RID_STR_DVR_XL_EXCEL_DRIVER] +en-US = "Excel Driver" + +[RID_STR_DVR_XL_ISSUES] +en-US = "2. Issues" + +[RID_STR_DVR_XL_PURPOSE] +en-US = "1. Purpose" + +[RID_STR_DVR_XL_READ_README] +en-US = "If there are any problems running the Wizard please refer to the Readme.doc" + +[RID_STR_DVR_XL_THE_MACROS] +en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of Excel documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool." + +[RID_STR_DVR_XL_THIS_DOC] +en-US = "This document contains VBA macros which collect and analyse Excel documents for known issues when importing into <PRODUCTNAME>" + +[RID_STR_DVR_XL_TITLE] +en-US = "<PRODUCTNAME> Migration Analysis - Excel Driver" + +[RID_STR_DVR_PP_TXT2] +en-US = "This document contains VBA macros which collect and analyse PowerPoint documents for known issues when importing into <PRODUCTNAME>" + +[RID_STR_DVR_PP_TXT3] +en-US = "<PRODUCTNAME> Migration Analysis - PowerPoint Driver" + +[RID_STR_DVR_PP_TXT4] +en-US = "PowerPoint Driver" + +[RID_STR_DVR_PP_TXT5] +en-US = "Purpose" + +[RID_STR_DVR_PP_TXT6] +en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of PowerPoint documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool." + +[RID_STR_DVR_PP_TXT7] +en-US = "Issues" + +[RID_STR_DVR_PP_TXT8] +en-US = "If there are any problems running the Wizard please refer to the Readme.doc" + +[RID_STR_WDVR_SOANA] +en-US = "<PRODUCTNAME> MIGRATION ANALYSIS - WORD DRIVER" + +[RID_STR_WDVR_INTRO] +en-US = "This document contains VBA macros, which collect and analyse Word documents for known issues when importing into <PRODUCTNAME>" + +[RID_STR_WDVR_TITLE] +en-US = "Word Driver" + +[RID_STR_WDVR_PURPO] +en-US = "Purpose" + +[RID_STR_WDVR_PARA1] +en-US = "The macros in this document are used by the Analysis Wizard to analyze the collection of Word documents you specify using the Wizard. It should not be modified in any way, the Wizard will open and close it as required by the tool." + +[RID_STR_WDVR_ISSUE] +en-US = "Issues" + +[RID_STR_WDVR_PARA2] +en-US = "If there are any problems running the Wizard please refer to the Readme.doc" + +[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_COMMENTS] +en-US = "Allow Only Comments" + +[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_FORM_FIELDS] +en-US = "Allow Only FormFields" + +[RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_REVISIONS] +en-US = "Allow Only Revisions" + +[RID_STR_WORD_ATTRIBUTE_AUTHOR] +en-US = "Author" + +[RID_STR_WORD_ATTRIBUTE_DATASOURCE] +en-US = "Datasource" + +[RID_STR_WORD_ATTRIBUTE_FIELD_TEXT] +en-US = "Field Text" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_AUTOSIZE] +en-US = "Autosize" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_ENTRY_MACRO] +en-US = "Entry macro" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_EXIT_MACRO] +en-US = "Exit macro" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_FILLIN_ENABLED] +en-US = "Fill-in enabled" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_GREYED] +en-US = "FormFields Greyed" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_AUTO_TEXT] +en-US = "Help Key(F1) [Auto Text]" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_OWN_TEXT] +en-US = "Help Key(F1) [Own Text]" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_LOCKED] +en-US = "Locked" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_MAX_LENGTH] +en-US = "Maximum Length" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_AUTO_TEXT] +en-US = "Status Bar Help [Auto Text]" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_OWN_TEXT] +en-US = "Status Bar Help [Own Text]" + +[RID_STR_WORD_ATTRIBUTE_FORM_FIELD_TEXT_FORM_FIELD_TYPE] +en-US = "Text Form Field Type" + +[RID_STR_WORD_ATTRIBUTE_FOOTER] +en-US = "Footer" + +[RID_STR_WORD_ATTRIBUTE_HEADER] +en-US = "Header" + +[RID_STR_WORD_ATTRIBUTE_FRAME] +en-US = "Frame" + +[RID_STR_WORD_ATTRIBUTE_GRAPHIC] +en-US = "Graphic" + +[RID_STR_WORD_ATTRIBUTE_OBJECT_HEIGHT_GT_H] +en-US = "Height Greater Than Header Height" + +[RID_STR_WORD_ATTRIBUTE_OBJECT_HEIGHT_GT_F] +en-US = "Height Greater Than Footer Height" + +[RID_STR_WORD_ATTRIBUTE_NUM_OF_GRAPHIC] +en-US = "Number of Graphics" + +[RID_STR_WORD_ATTRIBUTE_OBJECT_LOCATED_BELOW_HEADER] +en-US = "Located Below Header" + +[RID_STR_WORD_ATTRIBUTE_NUM_OF_FRAME] +en-US = "Number of Frames" + +[RID_STR_WORD_ATTRIBUTE_HEADER_EVEN_PAGES] +en-US = "Even Page(s)" + +[RID_STR_WORD_ATTRIBUTE_HEADER_FIRST_PAGE] +en-US = "First Page" + +[RID_STR_WORD_ATTRIBUTE_HEADER_ODD_PAGES] +en-US = "Odd Page(s)" + +[RID_STR_WORD_ATTRIBUTE_HEADER_PAGE_DEFAULT] +en-US = "Page Default" + +[RID_STR_WORD_ATTRIBUTE_GRAPHICTYPE] +en-US = "Graphic Type" + +[RID_STR_WORD_ATTRIBUTE_INLINESHAPE] +en-US = "Inline Shape" + +[RID_STR_WORD_ATTRIBUTE_INNER_TABLE] +en-US = "InnerTable" + +[RID_STR_WORD_ATTRIBUTE_LEADER] +en-US = "Leader" + +[RID_STR_WORD_ATTRIBUTE_LINK] +en-US = "Link" + +[RID_STR_WORD_ATTRIBUTE_LOCATION] +en-US = "Location" + +[RID_STR_WORD_ATTRIBUTE_NUMBER_CUSTOM_PARAGRAPHS] +en-US = "Number of custom paragraphs" + +[RID_STR_WORD_ATTRIBUTE_OUTER_TABLE] +en-US = "Outer Table" + +[RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_MODIFY] +en-US = "Password to Modify" + +[RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_OPEN] +en-US = "Password to Open" + +[RID_STR_WORD_ATTRIBUTE_PROTECTION] +en-US = "Protection" + +[RID_STR_WORD_ATTRIBUTE_SET] +en-US = "Set" + +[RID_STR_WORD_ATTRIBUTE_START_COL] +en-US = "Start Column" + +[RID_STR_WORD_ATTRIBUTE_START_ROW] +en-US = "Start Row" + +[RID_STR_WORD_ATTRIBUTE_TEXT] +en-US = "Text" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_ISSUE] +en-US = "Potential problem with TOC Format matching Modern style" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_NOT_MIGRATE_CLEAN] +en-US = "TOC Format will not migrate cleanly" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_NOT_ROUNDTRIP_CLEAN] +en-US = "TOC will not roundtrip cleanly due to following settings" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FROM_TEMPLATE_WITH_LEVEL] +en-US = "Format [FromTemplate] Level" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FROM_TEMPLATE_TAB_DOTS] +en-US = "Format [FromTemplate] TabLeader [Dots]" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_FORMAL_WITH_LEVEL] +en-US = "Format [Formal] Level" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_CLASSIC_WITH_LEVEL] +en-US = "Format [Classic] Level" + +[RID_STR_WORD_ATTRIBUTE_TOC_FORMAT_DISTINCTIVE_WITH_LEVEL] +en-US = "Format [Distinctive] Level" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_CALCULATION] +en-US = "Calculation" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_CHECK_BOX] +en-US = "Check Box Form Field" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_DATE] +en-US = "Current Date" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_TIME] +en-US = "Current Time" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DATE] +en-US = "Date" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE] +en-US = "Default date" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_EXPRESSION] +en-US = "Expression" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_NUMBER] +en-US = "Default number" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TEXT] +en-US = "Default text" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TIME] +en-US = "Default time" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_DROP_DOWN] +en-US = "Drop-Down Form Field" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE] +en-US = "Date format" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER] +en-US = "Number format" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TEXT] +en-US = "Text format" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TIME] +en-US = "Time format" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_NUMBER] +en-US = "Number" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_REGULAR] +en-US = "Regular" + +[RID_STR_WORD_ENUMERATION_FORM_FIELD_TEXT] +en-US = "Text Form Field" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_ASK] +en-US = "Ask" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER] +en-US = "Auto Number" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_LEGAL] +en-US = "Auto Number Legal" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_OUTLINE] +en-US = "Auto Number Outline" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_FIELD_NAME_NOT_KNOWN] +en-US = "Field name not known" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_FILL_IN] +en-US = "Fill In" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_RECORDS] +en-US = "Merge Records" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_FIELDS] +en-US = "Merge Fields" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_NEXT] +en-US = "Next" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_REVISION_NUMBER] +en-US = "Revision Number" + +[RID_STR_WORD_ENUMERATION_MAILMERGE_SEQUENCE] +en-US = "Sequence" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_CLASSIC] +en-US = "Classic" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_DISTINCTIVE] +en-US = "Distinctive" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FANCY] +en-US = "Fancy" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FORMAL] +en-US = "Formal" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_MODERN] +en-US = "Modern" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_SIMPLE] +en-US = "Simple" + +[RID_STR_WORD_ENUMERATION_INDEX_TABLES_FROM_TEMPLATE] +en-US = "From Template" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_DASHES] +en-US = "Dashes" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_DOTS] +en-US = "Dots" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_HEAVY] +en-US = "Heavy" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_LINES] +en-US = "Lines" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_MIDDLEDOT] +en-US = "MiddleDot" + +[RID_STR_WORD_ENUMERATION_INDEX_LEADER_SPACES] +en-US = "Spaces" + +[RID_STR_WORD_ENUMERATION_UNKNOWN] +en-US = "Unknown" + +[RID_STR_WORD_FALSE] +en-US = "False" + +[RID_STR_WORD_TRUE] +en-US = "True" + +[RID_STR_WORD_ISSUE_FIELDS] +en-US = "Fields" + +[RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES] +en-US = "Indexes and References" + +[RID_STR_WORD_ISSUE_OBJECTS_GRAPHICS_AND_FRAMES] +en-US = "Objects, Graphics and Frames" + +[RID_STR_WORD_ISSUE_TABLES] +en-US = "Tables" + +[RID_STR_WORD_NOTE_FORM_FIELD_ATTRIBUTES_LOST] +en-US = "following attribute values lost" + +[RID_STR_WORD_NOTE_FORM_FIELD_TYPE_LOST] +en-US = "Type lost, converted to plain text" + +[RID_STR_WORD_NOTE_NESTED_TABLE_WILL_BE_LOST] +en-US = "The inner table will be lost on roundtrip." + +[RID_STR_WORD_NOTE_TOA_FIELD_LOST_ON_ROUNDTRIP] +en-US = "Field will be lost on roundtrip" + +[RID_STR_WORD_NOTE_TOA_MIGRATE_AS_PLAIN_TEXT] +en-US = "Table will migrate as plain text" + +[RID_STR_WORD_SUBISSUE_APPEARANCE] +en-US = "Appearance" + +[RID_STR_WORD_SUBISSUE_COMMENT] +en-US = "Comment" + +[RID_STR_WORD_SUBISSUE_CUSTOM_BULLET_LIST] +en-US = "Custom bullet list" + +[RID_STR_WORD_SUBISSUE_FORM_FIELD] +en-US = "Form Field" + +[RID_STR_WORD_SUBISSUE_MAILMERGE_DATASOURCE] +en-US = "Mail Merge Datasource" + +[RID_STR_WORD_SUBISSUE_MAILMERGE_FIELD] +en-US = "Mail Merge Field" + +[RID_STR_WORD_SUBISSUE_NESTED_TABLES] +en-US = "Nested Tables" + +[RID_STR_WORD_SUBISSUE_OBJECT_IN_HEADER_FOOTER] +en-US = "Object in Header Footer" + +[RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES] +en-US = "Table of Authorities" + +[RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD] +en-US = "Table of Authorities Field" + +[RID_RESXLT_COST_CHART_Radar_AWF] +en-US = "Radar chart, Radar with symbol" + +[RID_RESXLT_COST_CHART_Radar_Comment] +en-US = "Although <PRODUCTNAME> Net charts appear similar to Excel Radar charts, but they are not equivalent. Radar charts are drawn clockwise whereas Net charts are drawn counter-clockwise." + +[RID_RESXLT_COST_CHART_Scattered_AWF] +en-US = "Scattered chart" + +[RID_RESXLT_COST_CHART_Scattered_Comment] +en-US = "The XY-Chart of <PRODUCTNAME> has the same appearance as the scattered chart in Excel." + +[RID_RESXLT_COST_CHART_Bubble_AWF] +en-US = "Bubble chart" + +[RID_RESXLT_COST_CHART_Bubble_Comment] +en-US = "XY-Chart has similar functionality to a Bubble chart in Excel but a completely different look." + +[RID_RESXLT_COST_CHART_BarOfPie_AWF] +en-US = "Bar of Pie and Pie of Pie charts" + +[RID_RESXLT_COST_CHART_BarOfPie_Comment] +en-US = "<PRODUCTNAME> imports these types of charts as Column charts, which look completely different." + +[RID_RESXLT_COST_CHART_FilledRadar_AWF] +en-US = "Filled Radar chart" + +[RID_RESXLT_COST_CHART_FilledRadar_Comment] +en-US = "This chart type does not have a <PRODUCTNAME> equivalent. Instead, the import filter in <PRODUCTNAME> converts a Filled Radar chart to a Column chart." + +[RID_RESXLT_COST_CHART_Surface_AWF] +en-US = "Surface chart" + +[RID_RESXLT_COST_CHART_Surface_Comment] +en-US = "This chart type does not have a <PRODUCTNAME> equivalent. The imported chart will look completely different than the original chart." + +[RID_RESXLT_COST_PIVOT_MultConsRanges_AWF] +en-US = "Multiple Consolidation Ranges" + +[RID_RESXLT_COST_PIVOT_MultConsRanges_Comment] +en-US = "A Pivot table from Excel can use data from multiple consolidation ranges, Calc does not support this." + +[RID_RESXLT_COST_PIVOT_PivotChart_Comment] +en-US = "A pivot chart is created dynamically in Excel using a pivot table as it's datasource. <PRODUCTNAME> does not support generating charts from dynamically created tables." + +[RID_RESXLT_COST_PIVOT_ManSort_AWF] +en-US = "Manual Sorting" + +[RID_RESXLT_COST_PIVOT_ManSort_Comment] +en-US = "Pivot table users could sort the results manually. Excel preserves the sorting. Calc does not." + +[RID_RESXLT_COST_PIVOT_CalcVal_AWF] +en-US = "Calculated Values" + +[RID_RESXLT_COST_PIVOT_CalcVal_Comment] +en-US = "Excel users can create a formula that writes the results in a new column within the pivot table. Users can use the same type of formula to replace the content of an existing column. Calc does not support this." + +[RID_RESXLT_COST_PIVOT_ExternData_AWF] +en-US = "External Data" + +[RID_RESXLT_COST_PIVOT_ExternData_Comment] +en-US = "A Pivot table from Excel can use data from external sources. Calc does not support this." + +[RID_RESXLS_COST_IAR_Numbering_IssueType] +en-US = "Numbering Order" + +[RID_RESXLS_COST_IAR_Numbering_Comment] +en-US = "<PRODUCTNAME> first calculates numbering located in frames and then the numbering within the text. Word does not separate this." + +[RID_RESXLS_COST_IAR_Numbering_WorkAround] +en-US = "Move the numberings from within the frames into the text body area." + +[RID_RESXLS_COST_WorkbookPartProtection_AWF] +en-US = "Protection for Parts of Workbooks" + +[RID_RESXLS_COST_WorkbookPartProtection_Comment] +en-US = "In Excel users can protect certain parts of workbooks. Workbooks, sheets, charts and ranges can all be individually protected. These do not all migrate to <PRODUCTNAME>." + +[RID_RESXLS_COST_WorkbookPartProtection_WorkAround] +en-US = "Do not protect Excel workbooks" + +[RID_RESXLS_COST_FORMAT_TabStop_IssueType] +en-US = "Tabstop" + +[RID_RESXLS_COST_FORMAT_TabStop_Comment] +en-US = "The minimum tabstop distance in word is shorter than <PRODUCTNAME>. That means that if, in Word, the user tabs a distance shorter than <PRODUCTNAME>'s minimum, that after migration the text spacing will be pushed one tab further." + +[RID_RESXLS_COST_GraphicAnchorEndOfPage_IssueType] +en-US = "Graphic Object Anchor - End of Page" + +[RID_RESXLS_COST_GraphicAnchorEndOfPage_Comment] +en-US = "If a frame or graphic object (not including AutoShapes) is too close to the end of a page it will be pushed to the next page in <PRODUCTNAME>." + +[RID_RESXLS_COST_GraphicAnchorLostGraphic_IssueType] +en-US = "Graphic Object Anchor - Lost Graphic Object" + +[RID_RESXLS_COST_GraphicAnchorLostGraphic_Comment] +en-US = "If a graphic object is anchored off a paragraph (Format Autoshape | Layout | Advanced | Vertical Position = Paragraph) which contains just a blank carriage return, then this can lead to the graphic object being lost in <PRODUCTNAME>." + +[RID_RESXLS_COST_TABLE_Leading_IssueType] +en-US = "Leading" + +[RID_RESXLS_COST_TABLE_Leading_Comment] +en-US = "Leading can cause extra lines in tables. In a table, if the column width is very close to the text, it can lead to a single character being pushed to new line in <PRODUCTNAME>. This is caused by extra leading in <PRODUCTNAME>." + +[RID_RESXLS_COST_TABLE_Misplaced_IssueType] +en-US = "Misplaced" + +[RID_RESXLS_COST_TABLE_Misplaced_Comment] +en-US = "Text wrapping can cause misplaced tables." + +[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_IssueType] +en-US = "Headings Without Numbering" + +[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_Comment] +en-US = "Many users do not use automatic heading or section numbering. They type the numbers in front of the heading manually instead. Word displays the first TAB of the heading in the TOC. <PRODUCTNAME> does not. The TOC will look different." + +[RID_RESXLS_COST_TOC_HeadlinesWithoutNum_WorkAround] +en-US = "Replace the manual numbering with automatic numbering or add spaces between the manual numbers and the text." + +[RID_RESXLS_COST_TABLE_AlignmentOfObjects_IssueType] +en-US = "Horizontal Alignment of Objects" + +[RID_RESXLS_COST_TABLE_AlignmentOfObjects_Comment] +en-US = "Graphics, WordArt or similar objects located in text tables get displayed in the wrong position when the absolute position of the horizontal alignment is defined instead of a relative position." + +[RID_RESXLS_COST_TABLE_AlignmentOfObjects_WorkAround] +en-US = "Adjust the horizontal alignment manually." + +[RID_STR_WORD_ATTRIBUTE_COUNT] +en-US = "Count" + +[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_DATEDIF] +en-US = "<PRODUCTNAME> Calc does not have an equivalent 'DATEDIF' function." + +[RID_STR_EXCEL_NOTE_CELL_FUNCTIONS_PHONETIC] +en-US = "<PRODUCTNAME> does not have an equivalent 'PHONETIC' function." + +[RID_STR_PP_SUBISSUE_BACKGROUND_NOTE] +en-US = "Fill style background colors applied to shapes in PowerPoint might be lost after a round trip conversion in <PRODUCTNAME>." + +[RID_STR_PP_SUBISSUE_NUMBERING_NOTE] +en-US = "Only the first paragraph in a numbered sequence can start with "1" in <PRODUCTNAME>. The numbering can only start with "2" or higher in subsequent paragraphs." + +[RID_STR_PP_SUBISSUE_HYPERLINK_NOTE] +en-US = "Unlike PowerPoint, <PRODUCTNAME> does not support multiple text formats in hyperlink text. Instead, <PRODUCTNAME> creates a separate hyperlink for each formatting style in an imported hyperlink." + +[RID_STR_PP_SUBISSUE_HYPERLINK_SPLIT_NOTE] +en-US = "PowerPoint splits the text representation of a hyperlink into several lines when the text box is not wide enough. <PRODUCTNAME> does not split hyperlinks so the hyperlink text might extend out of the text box." + +[RID_STR_PP_SUBISSUE_TEMPLATE_NOTE] +en-US = "<PRODUCTNAME> does not support the PowerPoint 'Title Slide' layout. When you import this layout, most of the subtitle object attributes are converted to hard attributes. PowerPoint 97 users require the multiple master page patch from Microsoft to view 'Title Slide' layouts that are contained in round trip documents." + +[RID_STR_PP_SUBISSUE_TABSTOP_NOTE] +en-US = "Unlike PowerPoint, <PRODUCTNAME> only supports one default tab stop in a document and not one for each text object. If a PowerPoint document uses more than one default tab stop for text objects, <PRODUCTNAME> assigns hard tab stops to these text objects to ensure an identical layout when you import the document. The default tab stops are not reinserted when you save the document in PowerPoint format." + +[RID_STR_PP_SUBISSUE_FONTS] +en-US = "Embedded Fonts" + +[RID_STR_PP_SUBISSUE_FONTS_NOTE] +en-US = "<PRODUCTNAME> doesn't support embedded fonts." + +[RID_STR_COMMON_SUBISSUE_TRANSPARENCY_NOTE] +en-US = "Microsoft Office supports a color attribute that allows you to make a bitmap color transparent without modifying the original bitmap. When you import a document with such a bitmap, <PRODUCTNAME> changes the bitmap to match the transparent color. The transparent color attribute is lost." + +[RID_STR_COMMON_SUBISSUE_LINE_NOTE] +en-US = "<PRODUCTNAME> does not support all of the line styles that you can apply to MS Office AutoShapes. As a result, <PRODUCTNAME> replaces double and triple line styles with a single line." + +[RID_STR_COMMON_SUBISSUE_GRADIENT_PRESET_NOTE] +en-US = "<PRODUCTNAME> does not support preset gradient styles." + +[RID_STR_COMMON_SUBISSUE_GRADIENT_CORNER_NOTE] +en-US = "<PRODUCTNAME> does not support the 'from center' gradient style." + +[RID_STR_COMMON_SUBISSUE_GRADIENT_CENTER_NOTE] +en-US = "<PRODUCTNAME> does not support the 'from corner' gradient style." + +[RID_RESXLS_COST_DB_Query] +en-US = "Database Query" + +[RID_RESXLS_COST_DB_Query_Comment] +en-US = "Issue: <PRODUCTNAME> can not import the database query. " + +[RID_RESXLS_COST_LineStyle] +en-US = "Line Style" + +[RID_RESXLS_COST_LineStyle_Comment] +en-US = "Issue: Line style is not supported." + +[RID_RESXLS_COST_Numbering] +en-US = "Numbering" + +[RID_RESXLS_COST_Numbering_Comment] +en-US = "Issue: Text numbering starts with wrong number." + +[RID_RESXLS_COST_Template] +en-US = "Layout 'Title Slide'" + +[RID_RESXLS_COST_Template_Comment] +en-US = "Issue: 'Title Slide' layout is not supported." + +[RID_RESXLS_COST_DATEDIF_Note] +en-US = "Use a date or time function that <PRODUCTNAME> Calc supports." + +[RID_RESXLS_COST_Tabstop] +en-US = "Default Tabulator" + +[RID_RESXLS_COST_Tabstop_Comment] +en-US = "Issue: Different default tabulators are not supported for text objects." + +[RID_RESXLS_COST_Transparent] +en-US = "Transparent Color" + +[RID_RESXLS_COST_Transparent_Comment] +en-US = "Issue: <PRODUCTNAME> does not support the transparent color attribute in bitmaps." + +[RID_RESXLS_COST_GradientStyle] +en-US = "Gradient Style" + +[RID_RESXLS_COST_GradientStyle_Comment] +en-US = "Issue: Unsupported gradient styles used." + +[RID_RESXLS_COST_GradientStyle_Note] +en-US = "Replacing gradient styles by styles that are supported." + +[RID_RESXLS_COST_Hyperlink] +en-US = "Textrange Hyperlinks" + +[RID_RESXLS_COST_Hyperlink_Comment] +en-US = "Issue: Multiple text formatting is not supported in Hyperlinks." + +[RID_RESXLS_COST_HyperlinkSplit] +en-US = "Split Hyperlinks" + +[RID_RESXLS_COST_HyperlinkSplit_Comment] +en-US = "Issue: Hyperlink will not be split onto several lines." + +[RID_RESXLS_COST_Background] +en-US = "Fill Type Background" + +[RID_RESXLS_COST_Background_Comment] +en-US = "Issue: Fillstyle background is not supported." + diff --git a/migrationanalysis/src/driver_docs/sources/AnalysisDriver.bas b/migrationanalysis/src/driver_docs/sources/AnalysisDriver.bas index 33da66dbe7d4..701fa285a29d 100644 --- a/migrationanalysis/src/driver_docs/sources/AnalysisDriver.bas +++ b/migrationanalysis/src/driver_docs/sources/AnalysisDriver.bas @@ -1,3639 +1,3639 @@ -Attribute VB_Name = "AnalysisDriver"
-'*************************************************************************
-'
-' Licensed to the Apache Software Foundation (ASF) under one
-' or more contributor license agreements. See the NOTICE file
-' distributed with this work for additional information
-' regarding copyright ownership. The ASF licenses this file
-' to you under the Apache License, Version 2.0 (the
-' "License"); you may not use this file except in compliance
-' with the License. You may obtain a copy of the License at
-'
-' http://www.apache.org/licenses/LICENSE-2.0
-'
-' Unless required by applicable law or agreed to in writing,
-' software distributed under the License is distributed on an
-' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-' KIND, either express or implied. See the License for the
-' specific language governing permissions and limitations
-' under the License.
-'
-'*************************************************************************
-Option Explicit
-
-' Declare Public variables.
-Public Type ShortItemId
- cb As Long
- abID As Byte
-End Type
-
-Public Type ITEMIDLIST
- mkid As ShortItemId
-End Type
-
-Public Declare Function FindWindow Lib "user32" Alias _
- "FindWindowA" (ByVal lpClassName As String, _
- ByVal lpWindowName As Long) As Long
-
-Private Declare Function GetTickCount Lib "kernel32" () As Long
-
-'This function saves the passed value to the file,
-'under the section and key names specified.
-'If the ini file, lpFileName, does not exist, it is created.
-'If the section, lpSectionName, does not exist, it is created.
-'If the key name, lpKeyName, does not exist, it is created.
-'If the key name exists, it's value, lpString, is replaced.
-Private Declare Function WritePrivateProfileString Lib "kernel32" _
- Alias "WritePrivateProfileStringA" _
- (ByVal lpSectionName As String, _
- ByVal lpKeyName As Any, _
- ByVal lpString As Any, _
- ByVal lpFileName As String) As Long
-
-Private Declare Function GetPrivateProfileString Lib "kernel32" _
- Alias "GetPrivateProfileStringA" _
- (ByVal lpSectionName As String, _
- ByVal lpKeyName As Any, _
- ByVal lpDefault As String, _
- ByVal lpReturnedString As String, _
- ByVal nSize As Long, _
- ByVal lpFileName As String) As Long
-
-Private Declare Function UrlEscape Lib "shlwapi" _
- Alias "UrlEscapeA" _
- (ByVal pszURL As String, _
- ByVal pszEscaped As String, _
- pcchEscaped As Long, _
- ByVal dwFlags As Long) As Long
-
-Public Declare Function SHGetPathFromIDList Lib "shell32.dll" _
- (ByVal pidl As Long, ByVal pszPath As String) As Long
-
-Public Declare Function SHGetSpecialFolderLocation Lib _
- "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder _
- As Long, pidl As ITEMIDLIST) As Long
-
-Public Const LOCALE_ILANGUAGE As Long = &H1 'language id
-Public Const LOCALE_SLANGUAGE As Long = &H2 'localized name of lang
-Public Const LOCALE_SENGLANGUAGE As Long = &H1001 'English name of lang
-Public Const LOCALE_SABBREVLANGNAME As Long = &H3 'abbreviated lang name
-Public Const LOCALE_SNATIVELANGNAME As Long = &H4 'native name of lang
-Public Const LOCALE_ICOUNTRY As Long = &H5 'country code
-Public Const LOCALE_SCOUNTRY As Long = &H6 'localized name of country
-Public Const LOCALE_SENGCOUNTRY As Long = &H1002 'English name of country
-Public Const LOCALE_SABBREVCTRYNAME As Long = &H7 'abbreviated country name
-Public Const LOCALE_SNATIVECTRYNAME As Long = &H8 'native name of country
-Public Const LOCALE_SINTLSYMBOL As Long = &H15 'intl monetary symbol
-Public Const LOCALE_IDEFAULTLANGUAGE As Long = &H9 'def language id
-Public Const LOCALE_IDEFAULTCOUNTRY As Long = &HA 'def country code
-Public Const LOCALE_IDEFAULTCODEPAGE As Long = &HB 'def oem code page
-Public Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004 'def ansi code page
-Public Const LOCALE_IDEFAULTMACCODEPAGE As Long = &H1011 'def mac code page
-
-Public Const LOCALE_IMEASURE As Long = &HD '0 = metric, 1 = US
-Public Const LOCALE_SSHORTDATE As Long = &H1F 'short date format string
-
-'#if(WINVER >= &H0400)
-Public Const LOCALE_SISO639LANGNAME As Long = &H59 'ISO abbreviated language name
-Public Const LOCALE_SISO3166CTRYNAME As Long = &H5A 'ISO abbreviated country name
-'#endif /* WINVER >= as long = &H0400 */
-
-'#if(WINVER >= &H0500)
-Public Const LOCALE_SNATIVECURRNAME As Long = &H1008 'native name of currency
-Public Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012 'default ebcdic code page
-Public Const LOCALE_SSORTNAME As Long = &H1013 'sort name
-'#endif /* WINVER >= &H0500 */
-
-Public Declare Function GetSystemDefaultLangID Lib "kernel32" () As Long
-Public Declare Function GetUserDefaultLangID Lib "kernel32" () As Long
-
-Public Declare Function GetLocaleInfo Lib "kernel32" _
- Alias "GetLocaleInfoA" _
- (ByVal Locale As Long, _
- ByVal LCType As Long, _
- ByVal lpLCData As String, _
- ByVal cchData As Long) As Long
-
-
-Public Const CWIZARD = "analysis"
-
-Const CROWOFFSET = 2
-Const CDOCPROP_PAW_ROWOFFSET = 3
-Private mDocPropRowOffset As Long
-
-Const CNUMBERDOC_ALL = "All"
-Const CTOTAL_DOCS_ANALYZED = "TotalDocsAnalysed"
-Const CNUMDAYS_IN_MONTH = 30
-Const CMAX_LIMIT = 10000
-
-Const CISSUE_DETDOCNAME = 1
-Const CISSUE_DETDOCAPPLICATION = CISSUE_DETDOCNAME + 1
-Const CISSUE_DETTYPE = CISSUE_DETDOCAPPLICATION + 1
-Const CISSUE_DETSUBTYPE = CISSUE_DETTYPE + 1
-Const CISSUE_DETLOCATION = CISSUE_DETSUBTYPE + 1
-Const CISSUE_DETSUBLOCATION = CISSUE_DETLOCATION + 1
-Const CISSUE_DETLINE = CISSUE_DETSUBLOCATION + 1
-Const CISSUE_DETCOLUMN = CISSUE_DETLINE + 1
-Const CISSUE_DETATTRIBUTES = CISSUE_DETCOLUMN + 1
-Const CISSUE_DETNAMEANDPATH = CISSUE_DETATTRIBUTES + 1
-
-Const CREF_DETDOCNAME = 1
-Const CREF_DETDOCAPPLICATION = CREF_DETDOCNAME + 1
-Const CREF_DETREFERENCE = CREF_DETDOCAPPLICATION + 1
-Const CREF_DETDESCRIPTION = CREF_DETREFERENCE + 1
-Const CREF_DETLOCATION = CREF_DETDESCRIPTION + 1
-Const CREF_DETATTRIBUTES = CREF_DETLOCATION + 1
-Const CREF_DETNAMEANDPATH = CREF_DETATTRIBUTES + 1
-
-Const CINPUT_DIR = "indir"
-Const COUTPUT_DIR = "outdir"
-Const CRESULTS_FILE = "resultsfile"
-Const CLOG_FILE = "logfile"
-Const CRESULTS_TEMPLATE = "resultstemplate"
-Const CRESULTS_EXIST = "resultsexist"
-Const COVERWRITE_FILE = "overwritefile"
-Const CNEW_RESULTS_FILE = "newresultsfile"
-Const CINCLUDE_SUBDIRS = "includesubdirs"
-Const CDEBUG_LEVEL = "debuglevel"
-Const COUTPUT_TYPE = "outputtype"
-Const COUTPUT_TYPE_XLS = "xls"
-Const COUTPUT_TYPE_XML = "xml"
-Const COUTPUT_TYPE_BOTH = "both"
-Const COVERVIEW_TITLE_LABEL = "OV_Document_Analysis_Overview_lbl"
-Const CDEFAULT_PASSWORD = "defaultpassword"
-Const CVERSION = "version"
-Const CTITLE = "title"
-Const CDOPREPARE = "prepare"
-Const CISSUES_LIMIT = "issuesmonthlimit"
-Const CSINGLE_FILE = "singlefile"
-Const CFILE_LIST = "filelist"
-Const CSTAT_FILE = "statfilename"
-Const C_ABORT_ANALYSIS = "abortanalysis"
-Const C_DOCS_LESS_3_MONTH = "DocumentsYoungerThan3Month"
-Const C_DOCS_LESS_6_MONTH = "DocumentsYoungerThan6Month"
-Const C_DOCS_LESS_12_MONTH = "DocumentsYoungerThan12Month"
-Const C_DOCS_MORE_12_MONTH = "DocumentsOlderThan12Month"
-
-Private Const C_ANALYSIS As String = "Analysis"
-Private Const C_LAST_CHECKPOINT As String = "LastCheckpoint"
-Private Const C_NEXT_FILE As String = "NextFile"
-Private Const C_MAX_CHECK_INI As String = "FilesBeforeSave"
-Private Const C_MAX_WAIT_BEFORE_WRITE_INI As String = "SecondsBeforeSave"
-Private Const C_MAX_RANGE_PROCESS_TIME_INI As String = "ExcelMaxRangeProcessTime"
-Private Const C_ERROR_HANDLING_DOC As String = "_ERROR_HANDLING_DOC_"
-Private Const C_MAX_CHECK As Long = 100
-Private Const C_MAX_WAIT_BEFORE_WRITE As Long = 300 ' sec
-Private Const C_MAX_RANGE_PROCESS_TIME As Integer = 30 'sec
-
-Private Const C_STAT_STARTING As Integer = 1
-Private Const C_STAT_DONE As Integer = 2
-Private Const C_STAT_FINISHED As Integer = 3
-
-Private Type DocumentCount
- numDocsAnalyzed As Long
- numDocsAnalyzedWithIssues As Long
- numMinorIssues As Long
- numComplexIssues As Long
- numMacroIssues As Long
- numPreparableIssues As Long
- totalMacroCosts As Long
- totalDocIssuesCosts As Long
- totalPreparableIssuesCosts As Long
-End Type
-
-Private Type DocModificationDates
- lessThanThreemonths As Long
- threeToSixmonths As Long
- sixToTwelvemonths As Long
- greaterThanOneYear As Long
-End Type
-
-Private Type DocMacroClassifications
- None As Long
- Simple As Long
- Medium As Long
- complex As Long
-End Type
-
-Private Type DocIssueClassifications
- None As Long
- Minor As Long
- complex As Long
-End Type
-
-Const CCOST_COL_OFFSET = -1
-
-Private mLogFilePath As String
-Private mDocIndex As String
-Private mDebugLevel As Long
-Private mIniFilePath As String
-Private mUserFormTypesDict As Scripting.Dictionary
-Private mIssuesDict As Scripting.Dictionary
-Private mMacroDict As Scripting.Dictionary
-Private mPreparedIssuesDict As Scripting.Dictionary
-Private mIssuesClassificationDict As Scripting.Dictionary
-Private mIssuesCostDict As Scripting.Dictionary
-Private mIssuesLimit As Date
-
-Public Const CWORD_DRIVER_FILE = "_OOoDocAnalysisWordDriver.doc"
-Public Const CEXCEL_DRIVER_FILE = "_OOoDocAnalysisExcelDriver.xls"
-Public Const CPP_DRIVER_FILE = "_OOoDocAnalysisPPTDriver.ppt"
-Public Const CWORD_DRIVER_FILE_TEMP = "~$OoDocAnalysisWordDriver.doc"
-Public Const CEXCEL_DRIVER_FILE_TEMP = "~$OoDocAnalysisExcelDriver.xls"
-Public Const CPP_DRIVER_FILE_TEMP = "~$OoDocAnalysisPPTDriver.ppt"
-
-'Doc Properties Offsets - used in WriteDocProperties and GetPreparableFilesFromDocProps
-Const CDOCINFONAME = 1
-Const CDOCINFOAPPLICATION = CDOCINFONAME + 1
-
-Const CDOCINFOISSUE_CLASS = CDOCINFOAPPLICATION + 1
-Const CDOCINFOCOMPLEXISSUES = CDOCINFOISSUE_CLASS + 1
-Const CDOCINFOMINORISSUES = CDOCINFOCOMPLEXISSUES + 1
-Const CDOCINFOPREPAREDISSUES = CDOCINFOMINORISSUES + 1
-
-Const CDOCINFOMACRO_CLASS = CDOCINFOPREPAREDISSUES + 1
-Const CDOCINFOMACRO_USERFORMS = CDOCINFOMACRO_CLASS + 1
-Const CDOCINFOMACRO_LINESOFCODE = CDOCINFOMACRO_USERFORMS + 1
-
-Const CDOCINFODOCISSUECOSTS = CDOCINFOMACRO_LINESOFCODE + 1
-Const CDOCINFOPREPARABLEISSUECOSTS = CDOCINFODOCISSUECOSTS + 1
-Const CDOCINFOMACROISSUECOSTS = CDOCINFOPREPARABLEISSUECOSTS + 1
-
-Const CDOCINFONUMBERPAGES = CDOCINFOMACROISSUECOSTS + 1
-Const CDOCINFOCREATED = CDOCINFONUMBERPAGES + 1
-Const CDOCINFOLASTMODIFIED = CDOCINFOCREATED + 1
-Const CDOCINFOLASTACCESSED = CDOCINFOLASTMODIFIED + 1
-Const CDOCINFOLASTPRINTED = CDOCINFOLASTACCESSED + 1
-Const CDOCINFOLASTSAVEDBY = CDOCINFOLASTPRINTED + 1
-Const CDOCINFOREVISION = CDOCINFOLASTSAVEDBY + 1
-Const CDOCINFOTEMPLATE = CDOCINFOREVISION + 1
-Const CDOCINFONAMEANDPATH = CDOCINFOTEMPLATE + 1
-
-'Overview shapes
-Const COV_DOC_MOD_DATES_CHART = "Chart 21"
-Const COV_DOC_MACRO_CHART = "Chart 22"
-Const COV_DOC_ANALYSIS_CHART = "Chart 23"
-
-Const COV_DOC_MOD_DATES_COMMENT_TXB = "Text Box 25"
-Const COV_DOC_MOD_DATES_LEGEND_TXB = "Text Box 12"
-
-Const COV_DOC_MACRO_COMMENT_TXB = "Text Box 26"
-Const COV_DOC_MACRO_LEGEND_TXB = "Text Box 16"
-
-Const COV_DOC_ANALYSIS_COMMENT_TXB = "Text Box 27"
-Const COV_DOC_ANALYSIS_LEGEND_DAW_TXB = "Text Box 28"
-Const COV_DOC_ANALYSIS_LEGEND_PAW_TXB = "Text Box 18"
-
-Const COV_HIGH_LEVEL_ANALYSIS_RANGE = "OV_High_Level_Analysis_Range"
-Const COV_COST_RANGE = "OV_Cost_Range"
-
-'Sheet labels
-Const COV_HIGH_LEVEL_ANALYSIS_LBL = "OV_High_level_analysis_lbl"
-Const COV_DP_PREPISSUES_COL_LBL = "DocProperties_PreparedIssues_Column"
-Const COV_COSTS_PREPISSUE_COUNT_COL_LBL = "Costs_PreparedIssueCount_Column"
-Const CDP_DAW_HIDDEN_COLS_LBL = "DP_DAW_HIDDEN_COLS_RANGE"
-Const CDP_DAW_HIDDEN_COLS2_LBL = "DP_DAW_HIDDEN_COLS_RANGE2"
-Const CDP_DAW_HIDDEN_ROW_LBL = "DP_DAW_HIDDEN_ROW_RANGE"
-
-Const COV_DAW_SETUP_SHEETS_RUN_LBL = "OV_DAW_SETUP_SHEETS_RUN"
-Const COV_PAW_SETUP_SHEETS_RUN_LBL = "OV_PAW_SETUP_SHEETS_RUN"
-Const COV_Internal_Attributes_Cols_LBL = "OV_Internal_Attributes_Cols"
-
-Const CR_STR = "<CR>"
-Const CR_TOPIC = "<TOPIC>"
-Const CR_PRODUCT = "<PRODUCT>"
-
-Const CLEGEND_FONT_SIZE = 8
-Const CCOMMENTS_FONT_SIZE = 10
-
-Dim mTstart As Single
-Dim mTend As Single
-Public gExcelMaxRangeProcessTime As Integer
-
-Sub AnalyseDirectory()
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AnalyseDirectory"
-
- Dim iniFilePath As String
- Dim startDir As String
- Dim fileList As String
- Dim storeToDir As String
- Dim resultsFile As String
- Dim resultsTemplate As String
- Dim statFileName As String
- Dim bOverwriteResultsFile As Boolean
- Dim bNewResultsFile As Boolean
- Dim outputType As String
- Dim singleFile As String
- Dim nTimeNeeded As Long
- Dim nIncrementFileCounter As Long
- Dim nMaxWaitBeforeWrite As Long
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
-
- SetAppToMinimized
-
- If InDocPreparation Then
- mDocPropRowOffset = CDOCPROP_PAW_ROWOFFSET
- Else
- mDocPropRowOffset = CROWOFFSET
- End If
-
- 'Get Wizard input variables
- SetupWizardVariables fileList, storeToDir, resultsFile, _
- mLogFilePath, resultsTemplate, bOverwriteResultsFile, bNewResultsFile, _
- statFileName, mDebugLevel, outputType, singleFile
-
- startDir = ProfileGetItem("Analysis", CINPUT_DIR, "", mIniFilePath)
-
- nIncrementFileCounter = CLng(ProfileGetItem("Analysis", _
- C_MAX_CHECK_INI, C_MAX_CHECK, mIniFilePath))
- nMaxWaitBeforeWrite = CLng(ProfileGetItem("Analysis", _
- C_MAX_WAIT_BEFORE_WRITE_INI, C_MAX_WAIT_BEFORE_WRITE, mIniFilePath))
- gExcelMaxRangeProcessTime = CInt(ProfileGetItem("Analysis", _
- C_MAX_RANGE_PROCESS_TIME_INI, C_MAX_RANGE_PROCESS_TIME, mIniFilePath))
- LocalizeResources
-
- 'Setup File List
- 'For Prepare - get list from results spreadsheet with docs analysis found as preparable
- 'If no results spreadsheet then just try to prepare all the docs - run over full analysis list
- Dim myFiles As Collection
- Set myFiles = New Collection
- Dim sAnalysisOrPrep As String
- If InDocPreparation And CheckDoPrepare Then
- sAnalysisOrPrep = "Prepared"
- If fso.FileExists(storeToDir & "\" & resultsFile) Then
- If Not GetPrepareFilesToAnalyze(storeToDir & "\" & resultsFile, myFiles, fso) Then
- SetPrepareToNone
- WriteDebug currentFunctionName & ": No files to analyse!"
- GoTo FinalExit 'No files to prepare - exit
- End If
- Else
- If Not GetFilesToAnalyze(fileList, singleFile, myFiles) Then
- SetPrepareToNone
- WriteDebug currentFunctionName & ": No files to analyse! Filelist (" & fileList & ") empty?"
- GoTo FinalExit 'No files to prepare - exit
- End If
- End If
- Else
- sAnalysisOrPrep = "Analyzed"
- If Not GetFilesToAnalyze(fileList, singleFile, myFiles) Then
- WriteDebug currentFunctionName & ": No files to analyse! Filelist (" & fileList & ") empty?"
- GoTo FinalExit
- End If
- End If
-
- Dim index As Long
- Dim numFiles As Long
- Dim nextSave As Long
- Dim startIndex As Long
- Dim bResultsWaiting As Boolean
- Dim AnalysedDocs As Collection
- Dim startDate As Date
- Dim currentDate As Date
-
- Set AnalysedDocs = New Collection
- numFiles = myFiles.count
- bResultsWaiting = False
-
- If (singleFile <> "") Then
- ' No recovery handling for single file analysis and the value in the
- ' ini file should be used for bNewResultsFile
- startIndex = 1
- Else
- bNewResultsFile = bNewResultsFile And GetIndexValues(startIndex, nextSave, myFiles)
- End If
-
- startDate = Now()
-
- ' Analyse all files
- For index = startIndex To numFiles
- Set mIssuesClassificationDict = New Scripting.Dictionary
- mIssuesClassificationDict.CompareMode = TextCompare
- Set mIssuesCostDict = New Scripting.Dictionary
- 'mIssuesCostDict.CompareMode = TextCompare
-
- Set mUserFormTypesDict = New Scripting.Dictionary
- Set mIssuesDict = New Scripting.Dictionary
- Set mMacroDict = New Scripting.Dictionary
- Set mPreparedIssuesDict = New Scripting.Dictionary
-
- 'Write to Application log
- Dim myAnalyser As MigrationAnalyser
- Set myAnalyser = New MigrationAnalyser
-
- If (CheckForAbort) Then GoTo FinalExit
-
- 'Log Analysis
- WriteToStatFile statFileName, C_STAT_STARTING, myFiles.item(index), fso
- WriteToLog "Analyzing", myFiles.item(index)
- WriteToIni C_NEXT_FILE, myFiles.item(index)
- mDocIndex = index
-
- 'Do Analysis
- myAnalyser.DoAnalyse myFiles.item(index), mUserFormTypesDict, startDir, storeToDir, fso
-
- AnalysedDocs.Add myAnalyser.Results
- bResultsWaiting = True
-
- WriteToLog sAnalysisOrPrep, index & "of" & numFiles & _
- " " & getAppSpecificApplicationName & " Documents"
- WriteToLog "Analyzing", "Done"
- WriteToLog sAnalysisOrPrep & "Doc" & index, myFiles.item(index)
- Set myAnalyser = Nothing
-
- If (CheckForAbort) Then GoTo FinalExit
-
- 'No need to output results spreadsheet, just doing prepare
- If CheckDoPrepare Then GoTo CONTINUE_FOR
-
- nTimeNeeded = val(DateDiff("s", startDate, Now()))
- If ((nTimeNeeded > nMaxWaitBeforeWrite) Or _
- (index >= nextSave)) Then
- If WriteResults(storeToDir, resultsFile, resultsTemplate, _
- bOverwriteResultsFile, bNewResultsFile, _
- outputType, AnalysedDocs, fso) Then
- nextSave = index + C_MAX_CHECK
- bResultsWaiting = False
- Set AnalysedDocs = New Collection
- WriteToIni C_LAST_CHECKPOINT, myFiles.item(index)
- startDate = Now()
- Else
- 'write error
- End If
- End If
- WriteToStatFile statFileName, C_STAT_DONE, myFiles.item(index), fso
-CONTINUE_FOR:
- Next index
-
- If (bResultsWaiting) Then
- If WriteResults(storeToDir, resultsFile, resultsTemplate, _
- bOverwriteResultsFile, bNewResultsFile, _
- outputType, AnalysedDocs, fso) Then
- WriteToIni C_LAST_CHECKPOINT, myFiles.item(index - 1)
- Else
- 'write error
- End If
- End If
- WriteToStatFile statFileName, C_STAT_FINISHED, "", fso
-
-FinalExit:
-
- Set fso = Nothing
- Set myFiles = Nothing
- Set mIssuesClassificationDict = Nothing
- Set mIssuesCostDict = Nothing
- Set mUserFormTypesDict = Nothing
- Set mIssuesDict = Nothing
- Set mMacroDict = Nothing
- Set mPreparedIssuesDict = Nothing
-
- Set AnalysedDocs = Nothing
-
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Function WriteResults(storeToDir As String, resultsFile As String, resultsTemplate As String, _
- bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, _
- outputType As String, AnalysedDocs As Collection, _
- fso As FileSystemObject) As Boolean
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteResults"
-
- If InDocPreparation Then
- If outputType = COUTPUT_TYPE_XML Or outputType = COUTPUT_TYPE_BOTH Then
- WriteXMLOutput storeToDir, resultsFile, _
- bOverwriteResultsFile, bNewResultsFile, AnalysedDocs, fso
- End If
- End If
-
- If outputType = COUTPUT_TYPE_XLS Or outputType = COUTPUT_TYPE_BOTH Then
- WriteXLSOutput storeToDir, resultsFile, fso.GetAbsolutePathName(resultsTemplate), _
- bOverwriteResultsFile, bNewResultsFile, AnalysedDocs, fso
- End If
-
- WriteResults = True
- bNewResultsFile = False
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteResults = False
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetFilesToAnalyze_old(startDir As String, bIncludeSubdirs As Boolean, _
- myFiles As Collection) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetFilesToAnalyze"
- Dim fso As New FileSystemObject
- Dim theResultsFile As String
- theResultsFile = ProfileGetItem("Analysis", CINPUT_DIR, "c:\", mIniFilePath) & "\" & ProfileGetItem("Analysis", CRESULTS_FILE, "", mIniFilePath)
-
- GetFilesToAnalyze = False
-
- Dim searchTypes As Collection
- Set searchTypes = New Collection
- SetupSearchTypes searchTypes
- If searchTypes.count = 0 Then
- GoTo FinalExit
- End If
-
- Dim myDocFiles As CollectedFiles
- Set myDocFiles = New CollectedFiles
- With myDocFiles
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CWORD_DRIVER_FILE)
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CEXCEL_DRIVER_FILE)
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CPP_DRIVER_FILE)
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CWORD_DRIVER_FILE_TEMP)
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CEXCEL_DRIVER_FILE_TEMP)
- .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CPP_DRIVER_FILE_TEMP)
- .BannedList.Add theResultsFile
- End With
- myDocFiles.Search rootDir:=startDir, FileSpecs:=searchTypes, _
- IncludeSubdirs:=bIncludeSubdirs
-
- If getAppSpecificApplicationName = CAPPNAME_WORD Then
- Set myFiles = myDocFiles.WordFiles
- ElseIf getAppSpecificApplicationName = CAPPNAME_EXCEL Then
- Set myFiles = myDocFiles.ExcelFiles
- ElseIf getAppSpecificApplicationName = CAPPNAME_POWERPOINT Then
- Set myFiles = myDocFiles.PowerPointFiles
- Else
- WriteDebug currentFunctionName & " : invalid application " & getAppSpecificApplicationName
- GoTo FinalExit
- End If
-
- GetFilesToAnalyze = True
-
-FinalExit:
- Set searchTypes = Nothing
- Set myDocFiles = Nothing
-
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetFilesToAnalyze(fileList As String, startFile As String, _
- myFiles As Collection) As Boolean
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetFilesToAnalyze"
-
- Dim fso As New FileSystemObject
- Dim fileContent As TextStream
- Dim fileName As String
-
- GetFilesToAnalyze = False
-
- If (startFile = "") Then
- If (fso.FileExists(fileList)) Then
- Set fileContent = fso.OpenTextFile(fileList, ForReading, False, TristateTrue)
- While (Not fileContent.AtEndOfStream)
- fileName = fileContent.ReadLine
- fileName = Trim(fileName)
- If (fileName <> "") Then
- myFiles.Add (fileName)
- End If
- Wend
- fileContent.Close
- End If
- Else
- myFiles.Add (startFile)
- End If
-
- If (myFiles.count <> 0) Then GetFilesToAnalyze = True
-
-FinalExit:
- Set fileContent = Nothing
- Set fso = Nothing
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetPrepareFilesToAnalyze(resultsFilePath As String, myFiles As Collection, _
- fso As FileSystemObject) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetPrepareFilesToAnalyze"
-
- GetPrepareFilesToAnalyze = False
-
- If Not fso.FileExists(resultsFilePath) Then
- WriteDebug currentFunctionName & ": results file does not exist : " & resultsFilePath
- GoTo FinalExit
- End If
-
- 'Open results spreadsheet
- Dim xl As Excel.Application
- If getAppSpecificApplicationName = CAPPNAME_EXCEL Then
- Set xl = Application
- xl.Visible = True
- Else
- Set xl = GetExcelInstance
- xl.Visible = False
- End If
- Dim logWb As WorkBook
- Set logWb = xl.Workbooks.Open(resultsFilePath)
-
- Dim wsDocProp As Worksheet
- Set wsDocProp = logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP)
-
- Dim startRow As Long
- Dim endRow As Long
- startRow = mDocPropRowOffset + 1
- endRow = GetWorkbookNameValueAsLong(logWb, CTOTAL_DOCS_ANALYZED) + mDocPropRowOffset
-
- GetPreparableFilesFromDocProps wsDocProp, startRow, endRow, fso, myFiles
-
- GetPrepareFilesToAnalyze = (myFiles.count > 0)
-
-FinalExit:
- Set wsDocProp = Nothing
- If Not logWb Is Nothing Then logWb.Close
- Set logWb = Nothing
-
- If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then
- If Not xl Is Nothing Then
- If xl.Workbooks.count = 0 Then
- xl.Quit
- End If
- End If
- End If
- Set xl = Nothing
-
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetPreparableFilesFromDocProps(wsDocProp As Worksheet, startRow As Long, _
- endRow As Long, fso As FileSystemObject, myFiles As Collection) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetPreparableFilesFromDocProps"
- GetPreparableFilesFromDocProps = False
-
- Dim index As Long
- Dim fileName As String
- Dim fileExt As String
- Dim docExt As String
- Dim templateExt As String
-
- docExt = getAppSpecificDocExt
- templateExt = getAppSpecificTemplateExt
-
- For index = startRow To endRow
- If GetWorksheetCellValueAsLong(wsDocProp, index, CDOCINFOPREPAREDISSUES) > 0 Then
- fileName = GetWorksheetCellValueAsString(wsDocProp, index, CDOCINFONAME)
- fileExt = "." & fso.GetExtensionName(fileName)
- 'Don't have to worry about search types - just looking at existing results
- 'so just check both legal extensions for this application
- If fileExt = docExt Or fileExt = templateExt Then
- myFiles.Add GetWorksheetCellValueAsString(wsDocProp, index, CDOCINFONAMEANDPATH)
- End If
- End If
- Next index
-
- GetPreparableFilesFromDocProps = myFiles.count > 0
-FinalExit:
- Exit Function
-
-HandleErrors:
- GetPreparableFilesFromDocProps = False
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub OpenXLSResultFile(resultsFile As String, _
- resultsTemplate As String, _
- bNewResultsFile As Boolean, _
- excelApp As Excel.Application, _
- resultSheet As Excel.WorkBook)
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OpenXLSResultFile"
-
- If getAppSpecificApplicationName = CAPPNAME_EXCEL Then
- Set excelApp = Application
- excelApp.Visible = True
- Else
- Set excelApp = GetExcelInstance
- excelApp.Visible = False
- End If
-
- If bNewResultsFile Then
- Set resultSheet = excelApp.Workbooks.Add(Template:=resultsTemplate)
- Localize_WorkBook resultSheet
- Else
- Set resultSheet = excelApp.Workbooks.Open(resultsFile)
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- excelApp.DisplayAlerts = False
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub CloseXLSResultFile(excelApp As Excel.Application, _
- resultSheet As Excel.WorkBook)
-
- On Error Resume Next
-
- If Not resultSheet Is Nothing Then resultSheet.Close
- Set resultSheet = Nothing
-
- If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then
- If Not excelApp Is Nothing Then
- excelApp.Visible = True
- If excelApp.Workbooks.count = 0 Then
- excelApp.Quit
- End If
- End If
- End If
- Set excelApp = Nothing
-
- Exit Sub
-End Sub
-
-Sub WriteXLSOutput(storeToDir As String, resultsFile As String, resultsTemplate As String, _
- bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, AnalysedDocs As Collection, _
- fso As Scripting.FileSystemObject)
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXLSOutput"
-
- Dim offsetDocPropRow As Long
- Dim offsetDocIssuesRow As Long
- Dim offsetDocIssueDetailsRow As Long
- Dim offsetDocRefDetailsRow As Long
-
- Const COVERVIEW_SHEET_IDX = 1
- Const CDOCLIST_SHEET_IDX = 2
- Const CISSUES_ANALYSED_SHEET = 3
- Const CISSUE_DETAILS_SHEET = 4
- Const CWORD_ISSUES_SHEET = 5
- Const CEXCEL_ISSUES_SHEET = 6
- Const CPOWERPOINT_ISSUES_SHEET = 7
- Const CREFERENCE_ISSUES_SHEET = 8
-
- 'Begin writing stats to excel
- Dim xl As Excel.Application
- If getAppSpecificApplicationName = CAPPNAME_EXCEL Then
- Set xl = Application
- xl.Visible = True
- Else
- Set xl = GetExcelInstance
- xl.Visible = False
- End If
-
- Dim logWb As WorkBook
-
- If bNewResultsFile Then
- Set logWb = xl.Workbooks.Add(Template:=resultsTemplate)
- Localize_WorkBook logWb
- Else
- Set logWb = xl.Workbooks.Open(storeToDir & "\" & resultsFile)
- End If
-
- SetupAnalysisResultsVariables logWb, offsetDocPropRow, _
- offsetDocIssuesRow, offsetDocIssueDetailsRow, offsetDocRefDetailsRow
-
- ' Iterate through results and write info
- Dim aAnalysis As DocumentAnalysis
- Dim row As Long
- Dim docCounts As DocumentCount
- Dim templateCounts As DocumentCount
-
- Dim issuesRow As Long
- Dim issueDetailsRow As Long
- Dim refDetailsRow As Long
-
- Dim wsOverview As Worksheet
- Dim wsCosts As Worksheet
- Dim wsPgStats As Worksheet
- Dim wsIssues As Worksheet
- Dim wsIssueDetails As Worksheet
- Dim wsRefDetails As Worksheet
-
- Set wsOverview = logWb.Sheets(COVERVIEW_SHEET_IDX)
- Set wsPgStats = logWb.Sheets(CDOCLIST_SHEET_IDX)
-
- 'Some localized names might be longer than 31 chars, excel doesn't
- 'allow such names!
- On Error Resume Next
- wsOverview.name = RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW
- wsPgStats.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP
- On Error GoTo HandleErrors
-
- If InDocPreparation Then
- Set wsCosts = logWb.Sheets(CISSUES_ANALYSED_SHEET)
- Dim appName As String
- appName = getAppSpecificApplicationName
- Select Case appName
- Case "Word"
- Set wsIssues = logWb.Worksheets(CWORD_ISSUES_SHEET)
- Case "Excel"
- Set wsIssues = logWb.Worksheets(CEXCEL_ISSUES_SHEET)
- Case "PowerPoint"
- Set wsIssues = logWb.Worksheets(CPOWERPOINT_ISSUES_SHEET)
- Case Default
- Err.Raise Number:=-1, Description:="BadAppName"
- End Select
- Set wsIssueDetails = logWb.Sheets(CISSUE_DETAILS_SHEET)
- Set wsRefDetails = logWb.Sheets(CREFERENCE_ISSUES_SHEET)
- issuesRow = 1 + CROWOFFSET + offsetDocIssuesRow
- issueDetailsRow = 1 + CROWOFFSET + offsetDocIssueDetailsRow
- refDetailsRow = 1 + CROWOFFSET + offsetDocRefDetailsRow
- ' localize PAW worksheets
- Dim wsWordIssues As Worksheet
- Dim wsExcelIssues As Worksheet
- Dim wsPowerPointIssues As Worksheet
- Set wsWordIssues = logWb.Worksheets(CWORD_ISSUES_SHEET)
- Set wsExcelIssues = logWb.Worksheets(CEXCEL_ISSUES_SHEET)
- Set wsPowerPointIssues = logWb.Worksheets(CPOWERPOINT_ISSUES_SHEET)
-
- On Error Resume Next
- wsCosts.name = RID_STR_COMMON_RESULTS_SHEET_NAME_COSTS
- wsIssueDetails.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS
- wsRefDetails.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS
- wsWordIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD
- wsExcelIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL
- wsPowerPointIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT
- On Error GoTo HandleErrors
- End If
-
- Dim fileName As String
- Dim macroClasses As DocMacroClassifications
- Dim issueClasses As DocIssueClassifications
-
- For row = 1 To AnalysedDocs.count 'Need Row count - so not using Eor Each
- Set aAnalysis = AnalysedDocs.item(row)
- fileName = fso.GetFileName(aAnalysis.name)
-
- If InDocPreparation Then
- issuesRow = WriteDocIssues(wsIssues, issuesRow, aAnalysis, fileName)
- issueDetailsRow = _
- ProcessIssuesAndWriteDocIssueDetails(logWb, wsIssueDetails, issueDetailsRow, aAnalysis, fileName)
- refDetailsRow = _
- WriteDocRefDetails(wsRefDetails, refDetailsRow, aAnalysis, fileName)
- aAnalysis.MacroCosts = getMacroIssueCosts(logWb, aAnalysis)
- WriteDocProperties wsPgStats, row + offsetDocPropRow, aAnalysis, fileName
- Else
- ProcessIssuesForDAW logWb, aAnalysis, fileName
- WriteDocProperties wsPgStats, row + offsetDocPropRow, aAnalysis, fileName
- End If
-
- UpdateAllCounts aAnalysis, docCounts, templateCounts, macroClasses, issueClasses, fso
-
- Set aAnalysis = Nothing
- Next row
-
- ' We change the font used for text box shapes here for the japanese
- ' version, because office 2000 sometimes displays squares instead of
- ' chars
- Dim langStr As String
- Dim userLCID As Long
- Dim textSize As Long
- Dim fontName As String
-
- userLCID = GetUserDefaultLangID()
- langStr = GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME)
-
- If (langStr = "ja") Then
- WriteDebug currentFunctionName & " : Setting font to MS PGothic for 'ja' locale"
- fontName = "MS PGothic"
- textSize = 10
- Else
- fontName = "Arial"
- textSize = CLEGEND_FONT_SIZE
- End If
-
- 'DAW - PAW switches
- If InDocPreparation Then
- SaveAnalysisResultsVariables logWb, issueDetailsRow - (1 + CROWOFFSET), _
- refDetailsRow - (1 + CROWOFFSET)
-
- WriteOverview logWb, docCounts, templateCounts, macroClasses, issueClasses
-
- SetupPAWResultsSpreadsheet logWb, fontName, textSize
- WriteIssueCounts logWb
- Else
- WriteOverview logWb, docCounts, templateCounts, macroClasses, issueClasses
-
- 'StartTiming
- SetupDAWResultsSpreadsheet logWb, fontName, textSize
- 'EndTiming "SetupDAWResultsSpreadsheet"
- End If
-
- SetupPrintRanges logWb, row, issuesRow, issueDetailsRow, refDetailsRow
-
- If resultsFile <> "" Then
- 'Overwrite existing results file without prompting
- If bOverwriteResultsFile Or (Not bNewResultsFile) Then
- xl.DisplayAlerts = False
- End If
-
- logWb.SaveAs fileName:=storeToDir & "\" & resultsFile
- xl.DisplayAlerts = True
- End If
-
-FinalExit:
- If Not xl Is Nothing Then
- xl.Visible = True
- End If
-
- Set wsOverview = Nothing
- Set wsPgStats = Nothing
-
- If InDocPreparation Then
- Set wsCosts = Nothing
- Set wsIssues = Nothing
- Set wsIssueDetails = Nothing
- Set wsRefDetails = Nothing
- End If
-
- If Not logWb Is Nothing Then logWb.Close
- Set logWb = Nothing
-
- If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then
- If Not xl Is Nothing Then
- If xl.Workbooks.count = 0 Then
- xl.Quit
- End If
- End If
- End If
- Set xl = Nothing
-
- Exit Sub
-
-HandleErrors:
- xl.DisplayAlerts = False
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Public Sub StartTiming()
- mTstart = 0
- mTend = 0
- mTstart = GetTickCount()
-End Sub
-Public Sub EndTiming(what As String)
- mTend = GetTickCount()
- WriteDebug "Timing: " & what & ": " & (FormatNumber((mTend - mTstart) / 1000, 0) & " seconds")
- mTstart = 0
- mTend = 0
-End Sub
-Sub WriteIssueCounts(logWb As WorkBook)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteIssueCounts"
-
- Dim Str As String
- Dim str1 As String
- Dim val1 As Long
- Dim count As Long
- Dim vKeyArray As Variant
- Dim vItemArray As Variant
- Dim vPrepKeyArray As Variant
- Dim vPrepItemArray As Variant
-
- vKeyArray = mIssuesDict.Keys
- vItemArray = mIssuesDict.Items
-
- vPrepKeyArray = mPreparedIssuesDict.Keys
- vPrepItemArray = mPreparedIssuesDict.Items
-
- 'Write Issue Counts across all Documents
- For count = 0 To mIssuesDict.count - 1
- str1 = vKeyArray(count)
- val1 = CInt(vItemArray(count))
- logWb.Names(str1).RefersToRange.Cells(1, 1) = _
- logWb.Names(str1).RefersToRange.Cells(1, 1).value + vItemArray(count)
- 'DEBUG: str = str & "Key: " & str1 & " Value: " & val1 & vbLf
- Next count
-
- 'Write Prepared Issues Counts across all Documents
- For count = 0 To mPreparedIssuesDict.count - 1
- str1 = vPrepKeyArray(count)
- val1 = CInt(vPrepItemArray(count))
- AddVariantToWorkbookNameValue logWb, str1, vPrepItemArray(count)
- 'DEBUG: str = str & "Key: " & str1 & " Value: " & val1 & vbLf
- Next count
-
- 'User Form control type count across all analyzed documents of this type
- str1 = getAppSpecificApplicationName & "_" & _
- CSTR_ISSUE_VBA_MACROS & "_" & _
- CSTR_SUBISSUE_PROPERTIES & "_" & _
- CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROLTYPE_COUNT
- SetWorkbookNameValueToLong logWb, str1, mUserFormTypesDict.count
-
- 'Add list of User Form controls and counts to ...USERFORMS_CONTROLTYPE_COUNT field
- If mUserFormTypesDict.count > 0 Then
- vKeyArray = mUserFormTypesDict.Keys
- vItemArray = mUserFormTypesDict.Items
-
- Str = RID_STR_COMMON_ATTRIBUTE_CONTROLS & ": "
- For count = 0 To mUserFormTypesDict.count - 1
- Str = Str & vbLf & vKeyArray(count) & " " & vItemArray(count)
- Next count
- WriteUserFromControlTypesComment logWb, str1, Str
- End If
- 'DEBUG: MsgBox str & vbLf & mIssuesDict.count
-
- WriteUniqueModuleCount logWb
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : logging costs : " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub WriteUniqueModuleCount(logWb As WorkBook)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteUniqueModuleCount"
-
- Dim strLabel As String
- Dim uniqueLineCount As Long
- Dim uniqueModuleCount As Long
- Dim count As Long
- Dim vItemArray As Variant
-
- vItemArray = mMacroDict.Items
-
- 'Write Issues Costs
- uniqueLineCount = 0
- For count = 0 To mMacroDict.count - 1
- uniqueLineCount = uniqueLineCount + CInt(vItemArray(count))
- Next count
- uniqueModuleCount = mMacroDict.count
-
-
- strLabel = getAppSpecificApplicationName & "_" & _
- CSTR_ISSUE_VBA_MACROS & "_" & _
- CSTR_SUBISSUE_PROPERTIES & "_" & _
- CSTR_SUBISSUE_VBA_MACROS_UNIQUE_MODULE_COUNT
- SetWorkbookNameValueToLong logWb, strLabel, uniqueModuleCount
-
- strLabel = getAppSpecificApplicationName & "_" & _
- CSTR_ISSUE_VBA_MACROS & "_" & _
- CSTR_SUBISSUE_PROPERTIES & "_" & _
- CSTR_SUBISSUE_VBA_MACROS_UNIQUE_LINE_COUNT
- SetWorkbookNameValueToLong logWb, strLabel, uniqueLineCount
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : logging Unique Module/ Line Counts : " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteUserFromControlTypesComment(logWb As WorkBook, name As String, comment As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteUserFromControlTypesComment"
-
- On Error Resume Next 'Ignore error if trying to add comment again - would happen on append to results
- logWb.Names(name).RefersToRange.Cells(1, 1).AddComment
-
- On Error GoTo HandleErrors
- logWb.Names(name).RefersToRange.Cells(1, 1).comment.Text Text:=comment
- 'Autosize not supported - Office 2000
- 'logWb.Names(name).RefersToRange.Cells(1, 1).comment.AutoSize = True
- logWb.Names(name).RefersToRange.Cells(1, 1).comment.Visible = False
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : name : " & name & _
- " : comment : " & comment & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub UpdateAllCounts(aAnalysis As DocumentAnalysis, counts As DocumentCount, templateCounts As DocumentCount, _
- macroClasses As DocMacroClassifications, issueClasses As DocIssueClassifications, _
- fso As FileSystemObject)
- Const CMODDATE_LESS3MONTHS = 91
- Const CMODDATE_LESS6MONTHS = 182
- Const CMODDATE_LESS12MONTHS = 365
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "UpdateAllCounts"
- 'DocIssue Classification occurs in setDocOverallIssueClassification under
- ' ProcessIssuesAndWriteDocIssueDetails when all DocIssues are being traversed.
- 'MacroClass for the Doc is setup at the end of the Analyze_Macros in DoAnalysis
- 'Mod Dates are determined in SetDocProperties in DoAnalysis
-
- 'DocMacroClassifications
- Select Case aAnalysis.MacroOverallClass
- Case enMacroComplex
- macroClasses.complex = macroClasses.complex + 1
- Case enMacroMedium
- macroClasses.Medium = macroClasses.Medium + 1
- Case enMacroSimple
- macroClasses.Simple = macroClasses.Simple + 1
- Case Else
- macroClasses.None = macroClasses.None + 1
- End Select
-
- 'DocIssueClassifications
- aAnalysis.BelowIssuesLimit = True
- Select Case aAnalysis.DocOverallIssueClass
- Case enComplex
- issueClasses.complex = issueClasses.complex + 1
- Case enMinor
- issueClasses.Minor = issueClasses.Minor + 1
- Case Else
- issueClasses.None = issueClasses.None + 1
- End Select
-
- 'DocumentCounts
- Dim extStr As String
- extStr = "." & LCase(fso.GetExtensionName(aAnalysis.name))
- If extStr = getAppSpecificDocExt Then
- UpdateDocCounts counts, aAnalysis
- ElseIf extStr = getAppSpecificTemplateExt Then
- UpdateDocCounts templateCounts, aAnalysis
- Else
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & _
- ": unhandled file extesnion " & extStr & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub UpdateDocCounts(counts As DocumentCount, aAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "UpdateDocCounts"
-
- counts.numDocsAnalyzed = counts.numDocsAnalyzed + 1
- If aAnalysis.IssuesCount > 0 Then 'During Analysis incremented
- counts.numDocsAnalyzedWithIssues = counts.numDocsAnalyzedWithIssues + 1
-
- If aAnalysis.BelowIssuesLimit Then
- counts.numMinorIssues = _
- counts.numMinorIssues + aAnalysis.MinorIssuesCount
- 'MinorIssuesCount incemented as all DocIssues are being traversed are being written out - ProcessIssuesAndWriteDocIssueDetails
- counts.numComplexIssues = counts.numComplexIssues + aAnalysis.ComplexIssuesCount 'Calculated
- counts.totalDocIssuesCosts = counts.totalDocIssuesCosts + _
- aAnalysis.DocIssuesCosts
- counts.totalPreparableIssuesCosts = counts.totalPreparableIssuesCosts + _
- aAnalysis.PreparableIssuesCosts
- End If
-
- counts.numMacroIssues = counts.numMacroIssues + aAnalysis.MacroIssuesCount 'During Analysis incremented
- counts.totalMacroCosts = counts.totalMacroCosts + aAnalysis.MacroCosts
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-
-Sub WriteDocProperties(wsPgStats As Worksheet, row As Long, aAnalysis As DocumentAnalysis, _
- fileName As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteDocProperties"
-
- Dim rowIndex As Long
- rowIndex = row + mDocPropRowOffset
-
- If aAnalysis.Application = RID_STR_COMMON_CANNOT_OPEN Then
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name
-
- GoTo FinalExit
- End If
-
- If InDocPreparation Then
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application
-
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFODOCISSUECOSTS, aAnalysis.DocIssuesCosts
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOPREPARABLEISSUECOSTS, aAnalysis.PreparableIssuesCosts
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACROISSUECOSTS, aAnalysis.MacroCosts
-
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOISSUE_CLASS, _
- getDocOverallIssueClassificationAsString(aAnalysis.DocOverallIssueClass)
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOCOMPLEXISSUES, aAnalysis.ComplexIssuesCount
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMINORISSUES, aAnalysis.MinorIssuesCount
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOPREPAREDISSUES, aAnalysis.PreparableIssuesCount
-
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOMACRO_CLASS, _
- getDocOverallMacroClassAsString(aAnalysis.MacroOverallClass)
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACRO_USERFORMS, aAnalysis.MacroNumUserForms
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACRO_LINESOFCODE, aAnalysis.MacroTotalNumLines
-
- SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFONUMBERPAGES, aAnalysis.PageCount
- SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOCREATED, CheckDate(aAnalysis.Created)
- SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTMODIFIED, CheckDate(aAnalysis.Modified)
- SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTACCESSED, CheckDate(aAnalysis.Accessed)
- SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTPRINTED, CheckDate(aAnalysis.Printed)
-
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOLASTSAVEDBY, aAnalysis.SavedBy
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOREVISION, aAnalysis.Revision
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOTEMPLATE, aAnalysis.Template
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name
- Else
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOISSUE_CLASS, _
- getDocOverallIssueClassificationAsString(aAnalysis.DocOverallIssueClass)
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOMACRO_CLASS, _
- getDocOverallMacroClassAsString(aAnalysis.MacroOverallClass)
- SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTMODIFIED, CheckDate(aAnalysis.Modified)
- SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Function CheckDate(myDate As Date) As Variant
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckDate"
-
- Dim lowerNTDateLimit As Date
- If Not IsDate(myDate) Then
- CheckDate = RID_STR_COMMON_NA
- Exit Function
- End If
-
- lowerNTDateLimit = DateSerial(1980, 1, 1)
- CheckDate = IIf(myDate < lowerNTDateLimit, RID_STR_COMMON_NA, myDate)
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : date " & myDate & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function WriteDocIssues(wsIssues As Worksheet, row As Long, _
- aAnalysis As DocumentAnalysis, fileName As String) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteDocIssues"
-
- Const CNAME = 1
- Const CAPPLICATION = CNAME + 1
- Const CISSUE_COLUMNOFFSET = CAPPLICATION
-
- If aAnalysis.IssuesCount = 0 Then
- WriteDocIssues = row
- Exit Function
- End If
- SetWorksheetCellValueToString wsIssues, row, CNAME, fileName
- SetWorksheetCellValueToString wsIssues, row, CAPPLICATION, aAnalysis.Application
-
- Dim index As Integer
- For index = 1 To aAnalysis.TotalIssueTypes
- If aAnalysis.IssuesCountArray(index) > 0 Then
- SetWorksheetCellValueToString wsIssues, row, CISSUE_COLUMNOFFSET + index, aAnalysis.IssuesCountArray(index)
- End If
- Next index
- SetWorksheetCellValueToString wsIssues, row, CISSUE_COLUMNOFFSET + aAnalysis.TotalIssueTypes + 1, aAnalysis.name
-
- WriteDocIssues = row + 1
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Sub ProcessIssuesForDAW(logWb As WorkBook, aAnalysis As DocumentAnalysis, fileName As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "ProcessIssuesForDAW"
-
- Dim myIssue As IssueInfo
- Dim issueClass As EnumDocOverallIssueClass
-
- Dim index As Integer
- For index = 1 To aAnalysis.Issues.count
- Set myIssue = aAnalysis.Issues(index)
-
- If Not isMacroIssue(myIssue) Then
- issueClass = getDocIssueClassification(logWb, myIssue)
- CountDocIssuesForDoc issueClass, aAnalysis
- SetOverallDocIssueClassification issueClass, aAnalysis
- End If
-
- Set myIssue = Nothing
- Next index
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Function ProcessIssuesAndWriteDocIssueDetails(logWb As WorkBook, wsIssueDetails As Worksheet, DetailsRow As Long, _
- aAnalysis As DocumentAnalysis, fileName As String) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "ProcessIssueAndWriteDocIssueDetails"
-
- Dim myIssue As IssueInfo
- Dim rowIndex As Long
- Dim issueClass As EnumDocOverallIssueClass
- Dim issueCost As Long
-
- rowIndex = DetailsRow
-
- Dim index As Integer
- For index = 1 To aAnalysis.Issues.count
- Set myIssue = aAnalysis.Issues(index)
-
- ' Process Document Issues and Costs for the Document
- ' Will be output to List of Documents sheet by WriteDocProperties( )
- If Not isMacroIssue(myIssue) Then
- issueClass = getDocIssueClassification(logWb, myIssue)
- CountDocIssuesForDoc issueClass, aAnalysis
- SetOverallDocIssueClassification issueClass, aAnalysis
- issueCost = getDocIssueCost(logWb, aAnalysis, myIssue)
- aAnalysis.DocIssuesCosts = aAnalysis.DocIssuesCosts + issueCost
- If myIssue.Preparable Then
- aAnalysis.PreparableIssuesCosts = aAnalysis.PreparableIssuesCosts + issueCost
- End If
- End If
-
- 'Collate Issue and Factor counts across all Documents
- 'Will be output to the Issues Analyzed sheet by WriteIssueCounts( )
- CollateIssueAndFactorCountsAcrossAllDocs aAnalysis, myIssue, fileName
-
- OutputCommonIssueDetails wsIssueDetails, rowIndex, aAnalysis, myIssue, fileName
- OutputCommonIssueAttributes wsIssueDetails, rowIndex, myIssue
- rowIndex = rowIndex + 1
- Set myIssue = Nothing
- Next index
-
- ProcessIssuesAndWriteDocIssueDetails = rowIndex
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function getDocIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis, myIssue As IssueInfo) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "getDocIssueCost"
-
- Dim issueKey As String
- Dim ret As Long
- ret = 0
-
- issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML
-
- ret = getIssueValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, issueKey, 1, CCOST_COL_OFFSET)
-
-FinalExit:
- getDocIssueCost = ret
- Exit Function
-
-HandleErrors:
- ret = 0
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Function getMacroIssueCosts(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long
- 'Error handling not required
- getMacroIssueCosts = getVBAMacroIssueCost(logWb, aAnalysis) '+ getMacroExtRefIssueCost(logWb, aAnalysis)
- 'NOTE: Currently not counting External Refs as Macro Cost
- 'could be added if porting off Windows
-
-End Function
-
-Function getVBAMacroIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long
- Const CMACRO_ROW_OFFSET_UNIQUE_LINES_COST = 4
- Const CMACRO_ROW_OFFSET_USER_FORMS_COUNT_COST = 5
- Const CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_COUNT_COST = 6
- Const CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_TYPE_COUNT_COST = 7
-
- Const CMACRO_NUM_OF_LINES_FACTOR_KEY = "_UniqueLineCount"
- Const CMACRO_USER_FORMS_COUNT_FACTOR_KEY = "_UserFormsCount"
- Const CMACRO_USER_FORMS_CONTROL_COUNT_FACTOR_KEY = "_UserFormsControlCount"
- Const CMACRO_USER_FORMS_CONTROL_TYPE_COUNT_FACTOR_KEY = "_UserFormsControlTypeCount"
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "getVBAMacroIssueCost"
-
- Dim baseIssueKey As String
- Dim ret As Long
- ret = 0
-
- If Not aAnalysis.HasMacros Then GoTo FinalExit
-
- 'Fetch VBA Macro Cost Factors - if required
- baseIssueKey = getAppSpecificApplicationName & "_" & CSTR_ISSUE_VBA_MACROS & "_" & CSTR_SUBISSUE_PROPERTIES
-
- 'Num Lines - Costing taken from "Lines in Unique Modules"
- If aAnalysis.MacroTotalNumLines > 0 Then
- ret = ret + aAnalysis.MacroTotalNumLines * _
- getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _
- baseIssueKey & CMACRO_NUM_OF_LINES_FACTOR_KEY, baseIssueKey, _
- CMACRO_ROW_OFFSET_UNIQUE_LINES_COST, CCOST_COL_OFFSET)
- End If
- 'User Forms Count
- If aAnalysis.MacroNumUserForms > 0 Then
- ret = ret + aAnalysis.MacroNumUserForms * _
- getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _
- baseIssueKey & CMACRO_USER_FORMS_COUNT_FACTOR_KEY, baseIssueKey, _
- CMACRO_ROW_OFFSET_USER_FORMS_COUNT_COST, CCOST_COL_OFFSET)
- End If
- 'User Forms Control Count
- If aAnalysis.MacroNumUserFormControls > 0 Then
- ret = ret + aAnalysis.MacroNumUserFormControls * _
- getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _
- baseIssueKey & CMACRO_USER_FORMS_CONTROL_COUNT_FACTOR_KEY, baseIssueKey, _
- CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_COUNT_COST, CCOST_COL_OFFSET)
- End If
- 'User Forms Control Type Count
- If aAnalysis.MacroNumUserFormControlTypes > 0 Then
- ret = ret + aAnalysis.MacroNumUserFormControlTypes * getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _
- baseIssueKey & CMACRO_USER_FORMS_CONTROL_TYPE_COUNT_FACTOR_KEY, baseIssueKey, CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_TYPE_COUNT_COST, CCOST_COL_OFFSET)
- End If
-
-
-FinalExit:
- getVBAMacroIssueCost = ret
- Exit Function
-
-HandleErrors:
- ret = 0
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Function getMacroExtRefIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long
- Const CMACRO_ROW_OFFSET_NUM_EXTERNAL_REFS_COST = 2
- Const CMACRO_NUM_EXTERNAL_REFS_FACTOR_KEY = "_ExternalRefs"
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "getMacroExtRefIssueCost"
- Dim baseIssueKey As String
- Dim ret As Long
- ret = 0
-
- If aAnalysis.MacroNumExternalRefs <= 0 Then GoTo FinalExit
-
- 'Fetch External Ref Cost Factors
- baseIssueKey = getAppSpecificApplicationName & "_" & CSTR_ISSUE_PORTABILITY & "_" & _
- CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO
- ret = ret + aAnalysis.MacroNumExternalRefs * _
- getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _
- baseIssueKey & CMACRO_NUM_EXTERNAL_REFS_FACTOR_KEY, baseIssueKey, _
- CMACRO_ROW_OFFSET_NUM_EXTERNAL_REFS_COST, CCOST_COL_OFFSET)
-
-FinalExit:
- getMacroExtRefIssueCost = ret
- Exit Function
-
-HandleErrors:
- ret = 0
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Function getIssueValueFromXLSorDict(logWb As WorkBook, aAnalysis As DocumentAnalysis, dict As Scripting.Dictionary, _
- key As String, row As Long, column As Long) As Long
- 'Error handling not required
- getIssueValueFromXLSorDict = getValueFromXLSorDict(logWb, aAnalysis, dict, key, key, row, column)
-End Function
-
-Function getValueFromXLSorDict(logWb As WorkBook, aAnalysis As DocumentAnalysis, dict As Scripting.Dictionary, _
- dictKey As String, xlsKey As String, row As Long, column As Long) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "getValueFromXLSorDict"
-
- Dim ret As Long
- ret = 0
-
- If dict.Exists(dictKey) Then
- ret = dict.item(dictKey)
- Else
- On Error Resume Next
- ret = logWb.Names(xlsKey).RefersToRange.Cells(row, column).value
- 'Log as error missing key
- If Err.Number <> 0 Then
- WriteDebug currentFunctionName & _
- " : Issue Cost Key - " & xlsKey & ": label missing from results.xlt Costs sheet, check sheet and add/ check spelling label" & Err.Number & " " & Err.Description & " " & Err.Source
- WriteDebug currentFunctionName & " : dictKey " & dictKey & " : xlsKey " & xlsKey & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- ret = 0
- End If
- On Error GoTo HandleErrors
- dict.Add dictKey, ret
- End If
-
-FinalExit:
- getValueFromXLSorDict = ret
- Exit Function
-
-HandleErrors:
- ret = 0
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Function isMacroIssue(myIssue As IssueInfo)
- 'Error handling not required
- isMacroIssue = False
-
- If myIssue.IssueTypeXML = CSTR_ISSUE_VBA_MACROS Or _
- (myIssue.IssueTypeXML = CSTR_ISSUE_PORTABILITY And _
- myIssue.SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO) Then
- isMacroIssue = True
- End If
-End Function
-Sub CountDocIssuesForDoc(issueClass As EnumDocOverallIssueClass, aAnalysis As DocumentAnalysis)
- 'Error handling not required
-
- If issueClass = enMinor Then
- aAnalysis.MinorIssuesCount = aAnalysis.MinorIssuesCount + 1
- End If
- ' Macro issues are counted during analysis
- ' Complex issues is calculated from: mIssues.count - mMinorIssuesCount - mMacroIssuesCount
-End Sub
-Sub SetOverallDocIssueClassification(issueClass As EnumDocOverallIssueClass, aAnalysis As DocumentAnalysis)
- 'Error handling not required
-
- If aAnalysis.DocOverallIssueClass = enComplex Then Exit Sub
-
- If issueClass = enComplex Then
- aAnalysis.DocOverallIssueClass = enComplex
- Else
- aAnalysis.DocOverallIssueClass = enMinor
- End If
-End Sub
-Function getDocIssueClassification(logWb As WorkBook, myIssue As IssueInfo) As EnumDocOverallIssueClass
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "getDocIssueClassification"
- Dim issueKey As String
- Dim bRet As Boolean
- bRet = False
- getDocIssueClassification = enMinor
-
- issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML
- If mIssuesClassificationDict.Exists(issueKey) Then
- bRet = mIssuesClassificationDict.item(issueKey)
- Else
- On Error Resume Next
- bRet = logWb.Names(issueKey).RefersToRange.Cells(1, 0).value
- 'Log as error missing key
- If Err.Number <> 0 Then
- WriteDebug currentFunctionName & _
- " : Issue Cost Key - " & issueKey & ": label missing from results.xlt Costs sheet, check sheet and add/ check spelling label" & Err.Number & " " & Err.Description & " " & Err.Source
- bRet = False
- End If
- On Error GoTo HandleErrors
- mIssuesClassificationDict.Add issueKey, bRet
- End If
-
-
-FinalExit:
- If bRet Then
- getDocIssueClassification = enComplex
- End If
- Exit Function
-
-HandleErrors:
- bRet = False
- WriteDebug currentFunctionName & " : issueKey " & issueKey & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function getDocOverallIssueClassificationAsString(docIssueClass As EnumDocOverallIssueClass) As String
- Dim Str As String
- 'Error handling not required
-
- Select Case docIssueClass
- Case enComplex
- Str = RID_STR_COMMON_ISSUE_CLASS_COMPLEX
- Case enMinor
- Str = RID_STR_COMMON_ISSUE_CLASS_MINOR
- Case Else
- Str = RID_STR_COMMON_ISSUE_CLASS_NONE
- End Select
-
- getDocOverallIssueClassificationAsString = Str
-End Function
-
-Public Function getDocOverallMacroClassAsString(docMacroClass As EnumDocOverallMacroClass) As String
- Dim Str As String
- 'Error handling not required
-
- Select Case docMacroClass
- Case enMacroComplex
- Str = RID_STR_COMMON_MACRO_CLASS_COMPLEX
- Case enMacroMedium
- Str = RID_STR_COMMON_MACRO_CLASS_MEDIUM
- Case enMacroSimple
- Str = RID_STR_COMMON_MACRO_CLASS_SIMPLE
- Case Else
- Str = RID_STR_COMMON_MACRO_CLASS_NONE
- End Select
-
- getDocOverallMacroClassAsString = Str
-End Function
-
-Function WriteDocRefDetails(wsRefDetails As Worksheet, DetailsRow As Long, _
- aAnalysis As DocumentAnalysis, fileName As String) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteDocRefDetails"
-
- Dim myIssue As IssueInfo
- Dim rowIndex As Long
- rowIndex = DetailsRow
-
- Dim index As Integer
-
- 'Output References for Docs with Macros
- If aAnalysis.HasMacros And (aAnalysis.References.count > 0) Then
- For index = 1 To aAnalysis.References.count
- Set myIssue = aAnalysis.References(index)
- OutputReferenceAttributes wsRefDetails, rowIndex, aAnalysis, myIssue, fileName
- rowIndex = rowIndex + 1
- Set myIssue = Nothing
- Next index
- End If
-
- WriteDocRefDetails = rowIndex
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : path " & aAnalysis.name & ": " & _
- " : row " & DetailsRow & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Sub OutputReferenceAttributes(wsIssueDetails As Worksheet, rowIndex As Long, _
- aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputReferenceAttributes"
-
- Dim strAttributes As String
-
- With myIssue
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDOCNAME, fileName
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDOCAPPLICATION, aAnalysis.Application
-
- strAttributes = .Values(RID_STR_COMMON_ATTRIBUTE_MAJOR) & "." & .Values(RID_STR_COMMON_ATTRIBUTE_MINOR)
- strAttributes = IIf(strAttributes = "0.0" Or strAttributes = ".", .Values(RID_STR_COMMON_ATTRIBUTE_NAME), _
- .Values(RID_STR_COMMON_ATTRIBUTE_NAME) & " " & .Values(RID_STR_COMMON_ATTRIBUTE_MAJOR) & _
- "." & .Values(RID_STR_COMMON_ATTRIBUTE_MINOR))
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETREFERENCE, strAttributes
-
- If .Values(RID_STR_COMMON_ATTRIBUTE_TYPE) = RID_STR_COMMON_ATTRIBUTE_PROJECT Then
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDESCRIPTION, RID_STR_COMMON_ATTRIBUTE_PROJECT
- Else
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDESCRIPTION, _
- IIf(.Values(RID_STR_COMMON_ATTRIBUTE_DESCRIPTION) <> "", .Values(RID_STR_COMMON_ATTRIBUTE_DESCRIPTION), RID_STR_COMMON_NA)
- End If
-
-
- If .Values(RID_STR_COMMON_ATTRIBUTE_ISBROKEN) <> RID_STR_COMMON_ATTRIBUTE_BROKEN Then
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETLOCATION, _
- .Values(RID_STR_COMMON_ATTRIBUTE_FILE)
- Else
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETLOCATION, _
- RID_STR_COMMON_NA
- End If
-
- 'Reference Details
- strAttributes = RID_STR_COMMON_ATTRIBUTE_TYPE & ": " & .Values(RID_STR_COMMON_ATTRIBUTE_TYPE) & vbLf
- strAttributes = strAttributes & RID_STR_COMMON_ATTRIBUTE_PROPERTIES & ": " & _
- .Values(RID_STR_COMMON_ATTRIBUTE_BUILTIN) & " " & .Values(RID_STR_COMMON_ATTRIBUTE_ISBROKEN)
- strAttributes = IIf(.Values(RID_STR_COMMON_ATTRIBUTE_GUID) <> "", _
- strAttributes & vbLf & RID_STR_COMMON_ATTRIBUTE_GUID & ": " & .Values(RID_STR_COMMON_ATTRIBUTE_GUID), _
- strAttributes)
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETATTRIBUTES, strAttributes
-
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETNAMEANDPATH, aAnalysis.name
- End With
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : path " & aAnalysis.name & ": " & _
- " : rowIndex " & rowIndex & ": " & _
- " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub OutputCommonIssueAttributes(wsIssueDetails As Worksheet, rowIndex As Long, _
- myIssue As IssueInfo)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputCommonIssueAttributes"
-
- Dim index As Integer
- Dim strAttributes As String
-
- strAttributes = ""
- For index = 1 To myIssue.Attributes.count
- strAttributes = strAttributes & myIssue.Attributes(index) & " - " & _
- myIssue.Values(index)
- strAttributes = strAttributes & IIf(index <> myIssue.Attributes.count, vbLf, "")
-
- Next index
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETATTRIBUTES, strAttributes
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : rowIndex " & rowIndex & ": " & _
- " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-'Store issue cost and factor costs across all documents
-Sub CollateIssueAndFactorCountsAcrossAllDocs(aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String)
- Const CSTR_USER_FORM = "User Form"
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CollateIssueAndFactorCountsAcrossAllDocs"
-
- 'Don't want to cost ISSUE_INFORMATION issues
- If myIssue.IssueTypeXML = CSTR_ISSUE_INFORMATION Then Exit Sub
-
- Dim issueKey As String
- issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML
-
- 'Store costing metrics for Issue
- AddIssueAndOneToDict issueKey
-
- 'Store prepeared issue for costing metrics
- If myIssue.Preparable Then
- AddPreparedIssueAndOneToDict issueKey & "_Prepared"
- End If
-
- 'Additional costing Factors output for VB macros
- If (myIssue.IssueTypeXML = CSTR_ISSUE_VBA_MACROS) And _
- (myIssue.SubTypeXML <> CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION) Then
-
- 'Unique Macro Module and Line count
- AddMacroModuleHashToMacroDict myIssue
-
- 'Line count
- AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_NUMLINES, myIssue, _
- RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES
-
- 'User From info
- If myIssue.SubLocation = CSTR_USER_FORM Then
- AddIssueAndOneToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_USERFORMS_COUNT
-
- AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROL_COUNT, myIssue, _
- RID_STR_COMMON_ATTRIBUTE_CONTROLS
- End If
- 'Additional costing Factors output for External References
- ElseIf (myIssue.IssueTypeXML = CSTR_ISSUE_PORTABILITY And _
- myIssue.SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO) Then
-
- AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO_COUNT, myIssue, _
- RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : path " & aAnalysis.name & ": " & _
- " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub OutputCommonIssueDetails(wsIssueDetails As Worksheet, rowIndex As Long, _
- aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String)
- Const CSTR_USER_FORM = "User Form"
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputCommonIssueDetails"
-
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETDOCNAME, fileName
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETDOCAPPLICATION, aAnalysis.Application
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETTYPE, myIssue.IssueType
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETSUBTYPE, myIssue.SubType
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETLOCATION, myIssue.Location
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETSUBLOCATION, _
- IIf(myIssue.SubLocation = "", RID_STR_COMMON_NA, myIssue.SubLocation)
- SetWorksheetCellValueToVariant wsIssueDetails, rowIndex, CISSUE_DETLINE, _
- IIf(myIssue.Line = -1, RID_STR_COMMON_NA, myIssue.Line)
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETCOLUMN, _
- IIf(myIssue.column = "", RID_STR_COMMON_NA, myIssue.column)
- SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETNAMEANDPATH, aAnalysis.name
-
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : path " & aAnalysis.name & ": " & _
- " : rowIndex " & rowIndex & ": " & _
- " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub AddIssueAndBoolValToDict(issueKey As String, issue As IssueInfo, valKey As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddIssueAndBoolValToDict"
-
- If mIssuesDict.Exists(issueKey) Then
- mIssuesDict.item(issueKey) = mIssuesDict.item(issueKey) + _
- IIf(issue.Values(valKey) > 0, 1, 0)
- Else
- mIssuesDict.Add issueKey, IIf(issue.Values(valKey) > 0, 1, 0)
- End If
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : issueKey " & issueKey & ": " & _
- " : valKey " & valKey & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub AddIssueAndValToDict(issueKey As String, issue As IssueInfo, valKey As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddIssueAndValToDict"
-
- If mIssuesDict.Exists(issueKey) Then
- mIssuesDict.item(issueKey) = mIssuesDict.item(issueKey) + issue.Values(valKey)
- Else
- mIssuesDict.Add issueKey, issue.Values(valKey)
- End If
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : issueKey " & issueKey & ": " & _
- " : valKey " & valKey & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub AddMacroModuleHashToMacroDict(issue As IssueInfo)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- Dim issueKey As String
- Dim issueVal As String
- currentFunctionName = "AddMacroModuleHashToMacroDict"
-
- issueKey = issue.Values(RID_STR_COMMON_ATTRIBUTE_SIGNATURE)
- If issueKey = RID_STR_COMMON_NA Then Exit Sub
-
- If Not mMacroDict.Exists(issueKey) Then
- mMacroDict.Add issueKey, issue.Values(RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES)
- End If
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : issueKey " & issueKey & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub AddIssueAndOneToDict(key As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddIssueAndOneToDict"
-
- If mIssuesDict.Exists(key) Then
- mIssuesDict.item(key) = mIssuesDict.item(key) + 1
- Else
- mIssuesDict.Add key, 1
- End If
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : key " & key & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub AddPreparedIssueAndOneToDict(key As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddPreparedIssueAndOneToDict"
-
- If mPreparedIssuesDict.Exists(key) Then
- mPreparedIssuesDict.item(key) = mPreparedIssuesDict.item(key) + 1
- Else
- mPreparedIssuesDict.Add key, 1
- End If
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : key " & key & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Function GetExcelInstance() As Excel.Application
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetExcelInstance"
-
- Dim xl As Excel.Application
- On Error Resume Next
- 'Try and get an existing instance
- Set xl = GetObject(, "Excel.Application")
- If Err.Number = 429 Then
- Set xl = CreateObject("Excel.Application")
- ElseIf Err.Number <> 0 Then
- Set xl = Nothing
- MsgBox "Error: " & Err.Description
- Exit Function
- End If
- Set GetExcelInstance = xl
- Set xl = Nothing
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub WriteOverview(logWb As WorkBook, DocCount As DocumentCount, templateCount As DocumentCount, _
- macroClasses As DocMacroClassifications, issueClasses As DocIssueClassifications)
- Const COV_ISSUECLASS_COMPLEX = "MAW_ISSUECLASS_COMPLEX"
- Const COV_ISSUECLASS_MINOR = "MAW_ISSUECLASS_MINOR"
- Const COV_ISSUECLASS_NONE = "MAW_ISSUECLASS_NONE"
-
- Const COV_MACROCLASS_COMPLEX = "MAW_MACROCLASS_COMPLEX"
- Const COV_MACROCLASS_MEDIUM = "MAW_MACROCLASS_MEDIUM"
- Const COV_MACROCLASS_SIMPLE = "MAW_MACROCLASS_SIMPLE"
- Const COV_MACROCLASS_NONE = "MAW_MACROCLASS_NONE"
-
- Const COV_ISSUECOUNT_COMPLEX = "MAW_ISSUECOUNT_COMPLEX"
- Const COV_ISSUECOUNT_MINOR = "MAW_ISSUECOUNT_MINOR"
-
- Const COV_MODDATES_LESS3MONTHS = "MAW_MODDATES_LESS3MONTHS"
- Const COV_MODDATES_3TO6MONTHS = "MAW_MODDATES_3TO6MONTHS"
- Const COV_MODDATES_6TO12MONTHS = "MAW_MODDATES_6TO12MONTHS"
- Const COV_MODDATES_MORE12MONTHS = "MAW_MODDATES_MORE12MONTHS"
-
- Const COV_DOC_MIGRATION_COSTS = "Document_Migration_Costs"
- Const COV_DOC_PREPARABLE_COSTS = "Document_Migration_Preparable_Costs"
- Const COV_MACRO_MIGRATION_COSTS = "Macro_Migration_Costs"
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteOverview"
-
- Dim appName As String
- appName = getAppSpecificApplicationName
-
- 'OV - Title
- SetWorkbookNameValueToString logWb, COVERVIEW_TITLE_LABEL, GetTitle
- SetWorkbookNameValueToVariant logWb, "AnalysisDate", Now
- SetWorkbookNameValueToString logWb, "AnalysisVersion", _
- RID_STR_COMMON_OV_VERSION_STR & ": " & GetTitle & " " & GetVersion
-
- 'OV - Number of Documents Analyzed
- AddLongToWorkbookNameValue logWb, CNUMBERDOC_ALL & getAppSpecificDocExt, DocCount.numDocsAnalyzed
- AddLongToWorkbookNameValue logWb, CNUMBERDOC_ALL & getAppSpecificTemplateExt, templateCount.numDocsAnalyzed
-
- 'OV - Documents with Document Migration Issues (excludes macro issues)
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_COMPLEX, issueClasses.complex
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_MINOR, issueClasses.Minor
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_NONE, issueClasses.None
-
- 'OV - Documents with Macro Migration Issues
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_COMPLEX, macroClasses.complex
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_MEDIUM, macroClasses.Medium
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_SIMPLE, macroClasses.Simple
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_NONE, macroClasses.None
-
- 'OV - Document Modification Dates
- Dim modDates As DocModificationDates
- Call GetDocModificationDates(modDates)
-
- SetWorkbookNameValueToLong logWb, COV_MODDATES_LESS3MONTHS, modDates.lessThanThreemonths
- SetWorkbookNameValueToLong logWb, COV_MODDATES_3TO6MONTHS, modDates.threeToSixmonths
- SetWorkbookNameValueToLong logWb, COV_MODDATES_6TO12MONTHS, modDates.sixToTwelvemonths
- SetWorkbookNameValueToLong logWb, COV_MODDATES_MORE12MONTHS, modDates.greaterThanOneYear
-
-
- If InDocPreparation Then
- 'OV - Document Migration Issues(excludes macro issues)
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECOUNT_COMPLEX, _
- DocCount.numComplexIssues + templateCount.numComplexIssues
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECOUNT_MINOR, _
- DocCount.numMinorIssues + templateCount.numMinorIssues
-
- 'OV - Document Migration Costs
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_DOC_MIGRATION_COSTS, _
- DocCount.totalDocIssuesCosts + templateCount.totalDocIssuesCosts
-
- 'OV - Document Migration Preparable Costs
- AddLongToWorkbookNameValue logWb, COV_DOC_PREPARABLE_COSTS, _
- DocCount.totalPreparableIssuesCosts + templateCount.totalPreparableIssuesCosts
-
- 'OV - Macro Migration Costs
- AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACRO_MIGRATION_COSTS, _
- DocCount.totalMacroCosts + templateCount.totalMacroCosts
- End If
-
- 'OV - Internal Attributes
- AddLongToWorkbookNameValue logWb, appName & "_" & "TotalDocsAnalysedWithIssues", _
- DocCount.numDocsAnalyzedWithIssues + templateCount.numDocsAnalyzedWithIssues
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : Problem writing overview: " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupDAWResultsSpreadsheet(logWb As WorkBook, fontName As String, fontSize As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupDAWResultsSpreadsheet"
- Dim bSetupRun As Boolean
- bSetupRun = CBool(GetWorkbookNameValueAsLong(logWb, COV_DAW_SETUP_SHEETS_RUN_LBL))
-
- If bSetupRun Then Exit Sub
-
- 'Setup Text Boxes
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_COMMENT_TXB, _
- RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_BODY, _
- CCOMMENTS_FONT_SIZE, fontName
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_LEGEND_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY, fontSize, fontName
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_COMMENT_TXB, _
- RID_STR_COMMON_OV_DOC_MACRO_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_MACRO_COMMENT_BODY, _
- CCOMMENTS_FONT_SIZE, fontName
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_LEGEND_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY, fontSize, fontName
- Dim monthLimit As Long
- monthLimit = GetIssuesLimitInDays / CNUMDAYS_IN_MONTH
- SetWorkbookNameValueToString logWb, COV_HIGH_LEVEL_ANALYSIS_LBL, _
- IIf(monthLimit <> CMAX_LIMIT, _
- ReplaceTopicTokens(RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_DAW, CR_TOPIC, CStr(monthLimit)), _
- RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT)
-
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_COMMENT_TXB, _
- RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_BODY, _
- CCOMMENTS_FONT_SIZE, fontName
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_LEGEND_DAW_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_DAW_LEGEND_BODY, fontSize, fontName
-
- 'Setup Chart Titles
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_CHART, _
- RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_CHART, _
- RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_CHART, _
- RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE
-
- 'Set selection to top cell of Overview
- logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW).Range("A1").Select
-
- bSetupRun = True
- SetWorkbookNameValueToBoolean logWb, COV_DAW_SETUP_SHEETS_RUN_LBL, bSetupRun
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : Problem setting up spreadsheet for DAW: " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupPAWResultsSpreadsheet(logWb As WorkBook, fontName As String, fontSize As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupPAWResultsSpreadsheet"
- Dim bSetupRun As Boolean
- bSetupRun = CBool(GetWorkbookNameValueAsLong(logWb, COV_PAW_SETUP_SHEETS_RUN_LBL))
-
- If bSetupRun Then Exit Sub
-
- 'Costs
- logWb.Names(COV_COSTS_PREPISSUE_COUNT_COL_LBL).RefersToRange.EntireColumn.Hidden = False
-
- 'Setup Text Boxes
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_LEGEND_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY, fontSize, fontName
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_LEGEND_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY, fontSize, fontName
- SetWorkbookNameValueToString logWb, COV_HIGH_LEVEL_ANALYSIS_LBL, _
- RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT
- SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_LEGEND_PAW_TXB, _
- RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_PAW_LEGEND_BODY, fontSize, fontName
-
- 'Setup Chart Titles
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_CHART, _
- RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_CHART, _
- RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE
- SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_CHART, _
- RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE
-
- 'Set selection to top cell of Overview
- logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW).Range("A1").Select
-
- bSetupRun = True
- SetWorkbookNameValueToBoolean logWb, COV_PAW_SETUP_SHEETS_RUN_LBL, bSetupRun
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : Problem setting up spreadsheet for PAW: " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupPrintRanges(logWb As WorkBook, docPropRow As Long, appIssuesRow As Long, issueDetailsRow As Long, _
- refDetailsRow As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupPrintRanges"
-
- 'Set Print Ranges
- If InDocPreparation Then
-
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP).PageSetup.PrintArea = "$A1:$U" & (docPropRow + mDocPropRowOffset)
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS).PageSetup.PrintArea = "$A1:$J" & issueDetailsRow
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS).PageSetup.PrintArea = "$A1:$G" & refDetailsRow
- If getAppSpecificApplicationName = CAPPNAME_WORD Then
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD).PageSetup.PrintArea = _
- "$A1:$N" & appIssuesRow
- ElseIf getAppSpecificApplicationName = CAPPNAME_EXCEL Then
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL).PageSetup.PrintArea = _
- "$A1:$M" & appIssuesRow
- Else
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT).PageSetup.PrintArea = _
- "$A1:$K" & appIssuesRow
- End If
- Else
- logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP).PageSetup.PrintArea = "$A1:$U" & (docPropRow + mDocPropRowOffset)
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : Problem setting print ranges: " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupSheetChartTitles(logWb As WorkBook, namedWorksheet As String, namedChart As String, _
- chartTitle As String)
- Const CCHART_TITLE_FONT_SIZE = 11
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupSheetChartTitles"
-
- With logWb.Sheets(namedWorksheet).ChartObjects(namedChart).Chart
- .HasTitle = True
- .chartTitle.Characters.Text = chartTitle
- .chartTitle.Font.Size = CCHART_TITLE_FONT_SIZE
- End With
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " namedWorkSheet: " & namedWorksheet & _
- " namedChart: " & namedChart & _
- " chartTitle: " & chartTitle & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupSheetTextBox(logWb As WorkBook, namedWorksheet As String, _
- textBoxName As String, textBoxTitle As String, textBoxBody As String, _
- textSize As Long, fontName As String)
-
- Const CMAX_INSERTABLE_STRING_LEN = 255
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupSheetTextBox"
-
- Dim strTextBody As String
- Dim allText As String
- strTextBody = ReplaceTopic2Tokens(textBoxBody, CR_STR, Chr(10), CR_PRODUCT, RID_STR_COMMON_OV_PRODUCT_STR)
-
- 'Setup Text Boxes
- logWb.Sheets(namedWorksheet).Activate
- logWb.Sheets(namedWorksheet).Shapes(textBoxName).Select
-
- '*** Workaround Excel bug: 213841 XL: Passed Strings Longer Than 255 Characters Are Truncated
- Dim I As Long
- logWb.Application.Selection.Text = ""
-
- logWb.Application.Selection.Characters.Text = textBoxTitle & Chr(10)
-
- With logWb.Application.Selection
- For I = 0 To Int(Len(strTextBody) / CMAX_INSERTABLE_STRING_LEN)
- .Characters(.Characters.count + 1).Text = Mid(strTextBody, _
- (I * CMAX_INSERTABLE_STRING_LEN) + 1, CMAX_INSERTABLE_STRING_LEN)
- Next
- End With
-
- 'Highlight title only
- With logWb.Application.Selection.Characters(start:=1, Length:=Len(textBoxTitle)).Font
- .name = fontName
- .FontStyle = "Bold"
- .Size = textSize
- End With
- With logWb.Application.Selection.Characters(start:=Len(textBoxTitle) + 1, _
- Length:=Len(strTextBody) + 1).Font
- .name = fontName
- .FontStyle = "Regular"
- .Size = textSize
- End With
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " namedWorkSheet: " & namedWorksheet & _
- " textBoxName: " & textBoxName & _
- " textBoxTitle: " & textBoxTitle & _
- " textBoxBody: " & textBoxBody & _
- " textSize: " & textSize & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Function GetWorkbookNameValueAsLong(logWb As WorkBook, name As String) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetWorkbookNameValueAsLong"
-
- GetWorkbookNameValueAsLong = logWb.Names(name).RefersToRange.Cells(1, 1).value
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- GetWorkbookNameValueAsLong = 0
- WriteDebug currentFunctionName & " : name " & name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetWorksheetCellValueAsLong(logWs As Worksheet, row As Long, col As Long) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetWorksheetCellValueAsLong"
-
- GetWorksheetCellValueAsLong = logWs.Cells(row, col).value
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetWorksheetCellValueAsString(logWs As Worksheet, row As Long, col As Long) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetWorksheetCellValueToString"
-
- GetWorksheetCellValueAsString = logWs.Cells(row, col).value
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- GetWorksheetCellValueAsString = ""
-
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub SetWorksheetCellValueToLong(logWs As Worksheet, row As Long, col As Long, val As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorksheetCellValueToLong"
-
- logWs.Cells(row, col) = val
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- " : val " & val & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub SetWorksheetCellValueToInteger(logWs As Worksheet, row As Long, col As Long, intVal As Integer)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorksheetCellValueToInteger"
-
- logWs.Cells(row, col) = intVal
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- " : intVal " & intVal & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorksheetCellValueToVariant(logWs As Worksheet, row As Long, col As Long, varVal As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorksheetCellValueToInteger"
-
- logWs.Cells(row, col) = varVal
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- " : varVal " & varVal & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorksheetCellValueToString(logWs As Worksheet, row As Long, col As Long, strVal As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorksheetCellValueToString"
-
- logWs.Cells(row, col) = strVal
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : row " & row & _
- " : col " & col & _
- " : strVal " & strVal & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorkbookNameValueToBoolean(logWb As WorkBook, name As String, bVal As Boolean)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorkbookNameValueToBoolean"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = bVal
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : boolean value " & bVal & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorkbookNameValueToString(logWb As WorkBook, name As String, val As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorkbookNameValueToString"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = val
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorkbookNameValueToLong(logWb As WorkBook, name As String, val As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorkbookNameValueToLong"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = val
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetWorkbookNameValueToVariant(logWb As WorkBook, name As String, val As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetWorkbookNameValueToVariant"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = val
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub AddLongToWorkbookNameValue(logWb As WorkBook, name As String, val As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddLongToWorkbookNameValue"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = logWb.Names(name).RefersToRange.Cells(1, 1).value + val
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub AddVariantToWorkbookNameValue(logWb As WorkBook, name As String, varVal As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddVariantToWorkbookNameValue"
-
- logWb.Names(name).RefersToRange.Cells(1, 1) = logWb.Names(name).RefersToRange.Cells(1, 1).value + varVal
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : name " & name & " : value " & varVal & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SaveAnalysisResultsVariables(logWb As WorkBook, offsetDocIssueDetailsRow As Long, _
- offsetDocRefDetailsRow As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SaveAnalysisResultsVariables"
-
- 'OV - Internal Attributes
- SetWorkbookNameValueToLong logWb, "TotalIssuesAnalysed", offsetDocIssueDetailsRow
- SetWorkbookNameValueToLong logWb, "TotalRefsAnalysed", offsetDocRefDetailsRow
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : offsetDocIssueDetailsRow " & offsetDocIssueDetailsRow & _
- " : offsetDocRefDetailsRow " & offsetDocRefDetailsRow & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub SetupAnalysisResultsVariables(logWb As WorkBook, _
- offsetDocPropRow As Long, offsetDocIssuesRow As Long, _
- offsetDocIssueDetailsRow As Long, offsetDocRefDetailsRow As Long)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupAnalysisResultsVariables"
-
- offsetDocPropRow = GetWorkbookNameValueAsLong(logWb, CTOTAL_DOCS_ANALYZED)
- offsetDocIssueDetailsRow = GetWorkbookNameValueAsLong(logWb, "TotalIssuesAnalysed")
- offsetDocRefDetailsRow = GetWorkbookNameValueAsLong(logWb, "TotalRefsAnalysed")
- offsetDocIssuesRow = GetWorkbookNameValueAsLong(logWb, getAppSpecificApplicationName & "_" & "TotalDocsAnalysedWithIssues")
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : offsetDocPropRow " & offsetDocPropRow & _
- " : offsetDocIssueDetailsRow " & offsetDocIssueDetailsRow & _
- " : offsetDocRefDetailsRow " & offsetDocRefDetailsRow & _
- " : offsetDocIssuesRow " & offsetDocIssuesRow & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteToIni(key As String, value As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteToIni"
-
- If mIniFilePath = "" Then Exit Sub
-
- Call WritePrivateProfileString("Analysis", key, value, mIniFilePath)
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : key " & key & " : value " & value & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteToLog(key As String, value As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteToLog"
-
- If mLogFilePath = "" Then Exit Sub
-
- Dim sSection As String
- sSection = getAppSpecificApplicationName
-
- Call WritePrivateProfileString(sSection, key, value, mLogFilePath)
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : key " & key & " : value " & value & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub WriteDebug(value As String)
- On Error Resume Next 'Ignore errors in our error writing routines - could get circular dependency otherwise
- Static ErrCount As Long
-
- If mLogFilePath = "" Then Exit Sub
-
- Dim sSection As String
- sSection = getAppSpecificApplicationName & "Debug"
-
- If mDebugLevel > 0 Then
- Call WritePrivateProfileString(sSection, "Doc" & mDocIndex & "_debug" & ErrCount, value, mLogFilePath)
- ErrCount = ErrCount + 1
- Else
- Debug.Print
- End If
-End Sub
-Sub WriteDebugLevelTwo(value As String)
- On Error Resume Next 'Ignore errors in our error writing routines - could get circular dependency otherwise
- Static ErrCountTwo As Long
-
- If mLogFilePath = "" Then Exit Sub
-
- Dim sSection As String
- sSection = getAppSpecificApplicationName & "Debug"
-
- If mDebugLevel > 1 Then
- Call WritePrivateProfileString(sSection, "Doc" & mDocIndex & "_debug" & ErrCountTwo, "Level2: " & value, mLogFilePath)
- ErrCountTwo = ErrCountTwo + 1
- Else
- Debug.Print
- End If
-End Sub
-
-Public Function ProfileLoadDict(dict As Scripting.Dictionary, _
- lpSectionName As String, _
- inifile As String) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "ProfileLoadDict"
- Dim success As Long
- Dim c As Long
- Dim nSize As Long
- Dim KeyData As String
- Dim lpKeyName As String
- Dim ret As String
-
- ret = Space$(2048)
- nSize = Len(ret)
- success = GetPrivateProfileString( _
- lpSectionName, vbNullString, "", ret, nSize, inifile)
-
- If success Then
- ret = Left$(ret, success)
-
- Do Until ret = ""
- lpKeyName = StripNulls(ret)
- KeyData = ProfileGetItem( _
- lpSectionName, lpKeyName, "", inifile)
- dict.Add lpKeyName, KeyData
- Loop
- End If
- ProfileLoadDict = dict.count
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : dict.Count " & dict.count & _
- " : lpSectionName " & lpSectionName & _
- " : inifile " & inifile & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Private Function StripNulls(startStrg As String) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "StripNulls"
- Dim pos As Long
- Dim item As String
-
- pos = InStr(1, startStrg, Chr$(0))
-
- If pos Then
-
- item = Mid$(startStrg, 1, pos - 1)
- startStrg = Mid$(startStrg, pos + 1, Len(startStrg))
- StripNulls = item
-
- End If
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : startStrg " & startStrg & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Function ProfileGetItem(lpSectionName As String, _
- lpKeyName As String, _
- defaultValue As String, _
- inifile As String) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "ProfileGetItem"
-
- Dim success As Long
- Dim nSize As Long
- Dim ret As String
- ret = Space$(2048)
- nSize = Len(ret)
- success = GetPrivateProfileString(lpSectionName, _
- lpKeyName, _
- defaultValue, _
- ret, _
- nSize, _
- inifile)
- If success Then
- ProfileGetItem = Left$(ret, success)
- Else
- ProfileGetItem = defaultValue
- End If
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- " : lpSectionName " & lpSectionName & _
- " : lpKeyName " & lpKeyName & _
- " : defaultValue " & defaultValue & _
- " : inifile " & inifile & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Function GetDefaultPassword() As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetDefaultPassword"
-
- Static myPassword As String
-
- If myPassword = "" Then
- myPassword = ProfileGetItem("Analysis", CDEFAULT_PASSWORD, "", mIniFilePath)
- End If
-
- GetDefaultPassword = myPassword
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Function GetVersion() As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetVersion"
-
- Static myVersion As String
-
- If myVersion = "" Then
- myVersion = ProfileGetItem("Analysis", CVERSION, "", mIniFilePath)
- End If
-
- GetVersion = myVersion
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-Public Function GetTitle() As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetTitle"
-
- Static myTitle As String
-
- If myTitle = "" Then
- myTitle = ProfileGetItem("Analysis", CTITLE, RID_STR_COMMON_ANALYSIS_STR, mIniFilePath)
- End If
-
- GetTitle = myTitle
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub SetPrepareToNone()
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetPrepareToNone"
-
- Call WritePrivateProfileString("Analysis", CDOPREPARE, CStr(0), mIniFilePath)
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Function CheckForAbort() As Boolean
- Dim currentFunctionName As String
- Dim bAbort As Boolean
-
- currentFunctionName = "CheckForAbort"
- bAbort = False
-
- On Error GoTo HandleErrors
-
- bAbort = CBool(ProfileGetItem("Analysis", C_ABORT_ANALYSIS, "false", mIniFilePath))
-
- 'reset the flag
- If (bAbort) Then Call WriteToIni(C_ABORT_ANALYSIS, "false")
-
-FinalExit:
- CheckForAbort = bAbort
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function CheckDoPrepare() As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckDoPrepare"
-
- Static bDoPrepare As Boolean
- Static myDoPrepare As String
-
- If myDoPrepare = "" Then
- bDoPrepare = CBool(ProfileGetItem("Analysis", _
- CDOPREPARE, "False", mIniFilePath))
- myDoPrepare = "OK"
- End If
-
- CheckDoPrepare = bDoPrepare
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function GetIssuesLimitInDays() As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
-
- currentFunctionName = "GetIssuesLimitInDays"
-
- Static issuesLimit As Long
- Static myDoPrepare As String
-
- If issuesLimit = 0 Then
- issuesLimit = CLng(ProfileGetItem("Analysis", _
- CISSUES_LIMIT, CMAX_LIMIT, mIniFilePath)) * CNUMDAYS_IN_MONTH
- End If
-
- GetIssuesLimitInDays = issuesLimit
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Sub AddIssueDetailsNote(myIssue As IssueInfo, noteNum As Long, noteStr As String, _
- Optional preStr As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "AddIssueDetailsNote"
-
- If IsMissing(preStr) Then
- preStr = RID_STR_COMMON_NOTE_PRE
- End If
- myIssue.Attributes.Add preStr & "[" & noteNum & "]"
- myIssue.Values.Add noteStr
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : noteNum " & noteNum & " : noteStr " & noteStr & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Public Sub SetupWizardVariables( _
- fileList As String, storeToDir As String, resultsFile As String, _
- logFile As String, resultsTemplate As String, bOverwriteFile As Boolean, _
- bNewResultsFile As Boolean, statFileName As String, debugLevel As Long, _
- outputType As String, singleFile As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupWizardVariables"
-
- If mIniFilePath = "" Then
- mIniFilePath = GetAppDataFolder & "\Sun\AnalysisWizard\" & CWIZARD & ".ini"
- End If
-
- statFileName = ProfileGetItem("Analysis", CSTAT_FILE, "", mIniFilePath)
- fileList = ProfileGetItem("Analysis", CFILE_LIST, "", mIniFilePath)
- storeToDir = ProfileGetItem("Analysis", COUTPUT_DIR, "", mIniFilePath)
- resultsFile = ProfileGetItem("Analysis", CRESULTS_FILE, "", mIniFilePath)
- logFile = ProfileGetItem("Analysis", CLOG_FILE, "", mIniFilePath)
- resultsTemplate = ProfileGetItem("Analysis", CRESULTS_TEMPLATE, "", mIniFilePath)
- bOverwriteFile = IIf(ProfileGetItem("Analysis", CRESULTS_EXIST, COVERWRITE_FILE, mIniFilePath) = COVERWRITE_FILE, _
- True, False)
- bNewResultsFile = CBool(ProfileGetItem("Analysis", CNEW_RESULTS_FILE, "True", mIniFilePath))
- debugLevel = CLng(ProfileGetItem("Analysis", CDEBUG_LEVEL, "1", mIniFilePath))
- outputType = ProfileGetItem("Analysis", COUTPUT_TYPE, COUTPUT_TYPE_XLS, mIniFilePath)
- singleFile = ProfileGetItem("Analysis", CSINGLE_FILE, "", mIniFilePath)
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & _
- ": mIniFilePath " & mIniFilePath & ": " & _
- Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Public Sub SetupSearchTypes(searchTypes As Collection)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetupSearchTypes"
-
- Dim bDocument As Boolean
- Dim bTemplate As Boolean
-
- bDocument = CBool(ProfileGetItem("Analysis", LCase("type" & getAppSpecificApplicationName & "doc"), "False", mIniFilePath))
- bTemplate = CBool(ProfileGetItem("Analysis", LCase("type" & getAppSpecificApplicationName & "dot"), "False", mIniFilePath))
- If bDocument = True Then searchTypes.Add "*" & getAppSpecificDocExt
- If bTemplate = True Then searchTypes.Add "*" & getAppSpecificTemplateExt
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & ": searchTypes.Count " & searchTypes.count & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteXMLHeader(out As TextStream)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLHeader"
-
- out.WriteLine "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
- out.WriteLine "<!DOCTYPE results SYSTEM 'analysis.dtd'>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub WriteXMLResultsStartTag(out As TextStream)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLResultsStartTag"
-
- out.WriteLine "<results generated-by=""" & IIf(InDocPreparation, "documentanalysis_preparation", "documentanalysis") & """"
- out.WriteLine " version=""" & GetVersion & """ timestamp=""" & Now & """"
- out.WriteLine " type=""" & getAppSpecificApplicationName & """ >"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Sub WriteXMLResultsEndTag(out As TextStream)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLResultsEndTag"
-
- out.WriteLine "</results>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteXMLDocProperties(out As TextStream, aAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLDocProperties"
-
- out.WriteLine "<document location=""" & EncodeXML(aAnalysis.name) & """"
- out.WriteLine " application=""" & aAnalysis.Application & """"
- out.WriteLine " issues-count=""" & (aAnalysis.IssuesCount) & """"
- out.WriteLine " pages=""" & aAnalysis.PageCount & """"
- out.WriteLine " created=""" & CheckDate(aAnalysis.Created) & """"
- out.WriteLine " modified=""" & CheckDate(aAnalysis.Modified) & """"
- out.WriteLine " accessed=""" & CheckDate(aAnalysis.Accessed) & """"
- out.WriteLine " printed=""" & CheckDate(aAnalysis.Printed) & """"
- out.WriteLine " last-save-by=""" & aAnalysis.SavedBy & """"
- out.WriteLine " revision=""" & aAnalysis.Revision & """"
- out.WriteLine " based-on-template=""" & EncodeXML(aAnalysis.Template) & """"
- out.WriteLine ">"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteXMLDocPropertiesEndTag(out As TextStream)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLDocPropertiesEndTag"
-
- out.WriteLine "</document>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteXMLDocRefDetails(out As TextStream, aAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLDocRefDetails"
- Dim myIssue As IssueInfo
-
- 'Output References for Docs with Macros
- If aAnalysis.HasMacros And (aAnalysis.References.count > 0) Then
- out.WriteLine "<references>"
- For Each myIssue In aAnalysis.References
- OutputXMLReferenceAttributes out, aAnalysis, myIssue
- Next myIssue
- out.WriteLine "</references>"
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub OutputXMLReferenceAttributes(out As TextStream, aAnalysis As DocumentAnalysis, myIssue As IssueInfo)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputXMLReferenceAttributes"
- Dim strAttributes As String
-
- With myIssue
- out.WriteLine "<reference"
-
- strAttributes = .Values("Major") & "." & .Values("Minor")
- strAttributes = IIf(strAttributes = "0.0" Or strAttributes = ".", .Values("Name"), _
- .Values("Name") & " " & .Values("Major") & "." & .Values("Minor"))
- out.WriteLine " name=""" & EncodeXML(strAttributes) & """"
-
- If .Values("Type") = "Project" Then
- strAttributes = "Project reference"
- Else
- strAttributes = IIf(.Values("Description") <> "", .Values("Description"), RID_STR_COMMON_NA)
- End If
- out.WriteLine " description=""" & EncodeXML(strAttributes) & """"
- If .Values("IsBroken") <> RID_STR_COMMON_ATTRIBUTE_BROKEN Then
- out.WriteLine " location=""" & .Values("File") & """"
- End If
- out.WriteLine " type=""" & .Values("Type") & """"
- strAttributes = IIf(.Values("GUID") <> "", .Values("GUID"), RID_STR_COMMON_NA)
- out.WriteLine " GUID=""" & strAttributes & """"
- out.WriteLine " is-broken=""" & .Values("IsBroken") & """"
- out.WriteLine " builtin=""" & .Values("BuiltIn") & """"
-
- out.WriteLine " />"
- End With
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteXMLDocIssueDetails(out As TextStream, aAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLDocIssueDetails"
-
- Dim myIssue As IssueInfo
-
- If aAnalysis.Issues.count = 0 Then Exit Sub
-
- out.WriteLine "<issues>"
- For Each myIssue In aAnalysis.Issues
- OutputXMLCommonIssueDetails out, aAnalysis, myIssue
- OutputXMLCommonIssueAttributes out, myIssue
- out.WriteLine "</issue>"
- Next myIssue
- out.WriteLine "</issues>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub OutputXMLCommonIssueDetails(out As TextStream, aAnalysis As DocumentAnalysis, myIssue As IssueInfo)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputXMLCommonIssueDetails"
-
- out.WriteLine "<issue category=""" & myIssue.IssueTypeXML & """"
- out.WriteLine " type=""" & myIssue.SubTypeXML & """"
-
- 'NOTE: Dropping severity - now stored in results.xlt, do not want to open it to fetch this data
- 'out.WriteLine " severity=""" & IIf(CheckForMinorIssue(aAnalysis, myIssue), "Minor", "Major") & """"
- out.WriteLine " prepared=""" & IIf((myIssue.Preparable), "True", "False") & """ >"
-
- out.WriteLine "<location type=""" & myIssue.locationXML & """ >"
-
- If myIssue.SubLocation <> "" Then
- out.WriteLine "<property name=""sublocation"" value=""" & myIssue.SubLocation & """ />"
- End If
- If myIssue.Line <> -1 Then
- out.WriteLine "<property name=""line"" value=""" & myIssue.Line & """ />"
- End If
- If myIssue.column <> "" Then
- out.WriteLine "<property name=""column"" value=""" & myIssue.column & """ />"
- End If
- out.WriteLine "</location>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub OutputXMLCommonIssueAttributes(out As TextStream, myIssue As IssueInfo)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "OutputXMLCommonIssueAttributes"
-
- Dim index As Integer
- Dim valStr As String
- Dim attStr As String
-
- If myIssue.Attributes.count = 0 Then Exit Sub
-
- out.WriteLine "<details>"
- For index = 1 To myIssue.Attributes.count
- attStr = myIssue.Attributes(index)
- If InStr(attStr, RID_STR_COMMON_NOTE_PRE & "[") = 1 Then
- attStr = Right$(attStr, Len(attStr) - Len(RID_STR_COMMON_NOTE_PRE & "["))
- attStr = Left$(attStr, Len(attStr) - 1)
- out.WriteLine "<note index=""" & attStr & """ value=""" & EncodeXML(myIssue.Values(index)) & """ />"
- Else
- out.WriteLine "<property name=""" & EncodeXML(myIssue.Attributes(index)) & """ value=""" & EncodeXML(myIssue.Values(index)) & """ />"
- End If
- Next index
-
- out.WriteLine "</details>"
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-
-Sub WriteXMLOutput(storeToDir As String, resultsFile As String, _
- bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, AnalysedDocs As Collection, _
- fso As Scripting.FileSystemObject)
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteXMLOutput"
-
- Dim xmlOutput As TextStream
- Dim xmlOrigOutput As TextStream
- Dim origOutput As String
- Dim analysis As DocumentAnalysis
- Dim outFilePath As String
-
- outFilePath = storeToDir & "\" & fso.GetBaseName(resultsFile) & "_" & _
- getAppSpecificApplicationName & ".xml"
-
- Set xmlOutput = fso.CreateTextFile(outFilePath, True)
- WriteXMLHeader xmlOutput
-
- 'Set xmlOrigOutput = fso.OpenTextFile(outFilePath, ForReading)
- 'Set xmlOutput = fso.OpenTextFile(outFilePath, ForWriting)
-
- WriteXMLResultsStartTag xmlOutput
- For Each analysis In AnalysedDocs
- WriteXMLDocProperties xmlOutput, analysis
- WriteXMLDocRefDetails xmlOutput, analysis
- WriteXMLDocIssueDetails xmlOutput, analysis
- WriteXMLDocPropertiesEndTag xmlOutput
- Next analysis
- WriteXMLResultsEndTag xmlOutput
-
-FinalExit:
- xmlOutput.Close
- Set xmlOutput = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : path " & outFilePath & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Private Function EncodeUrl(ByVal sUrl As String) As String
- Const MAX_PATH As Long = 260
- Const ERROR_SUCCESS As Long = 0
- Const URL_DONT_SIMPLIFY As Long = &H8000000
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "EncodeUrl"
-
- Dim sUrlEsc As String
- Dim dwSize As Long
- Dim dwFlags As Long
-
- If Len(sUrl) > 0 Then
-
- sUrlEsc = Space$(MAX_PATH)
- dwSize = Len(sUrlEsc)
- dwFlags = URL_DONT_SIMPLIFY
-
- If UrlEscape(sUrl, _
- sUrlEsc, _
- dwSize, _
- dwFlags) = ERROR_SUCCESS Then
-
- EncodeUrl = Left$(sUrlEsc, dwSize)
-
- End If 'If UrlEscape
- End If 'If Len(sUrl) > 0
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : sUrl " & sUrl & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Private Function EncodeXML(Str As String) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "EncodeXML"
-
- Str = Replace(Str, "^", "^")
- Str = Replace(Str, "&", "&")
- Str = Replace(Str, "`", "'")
- Str = Replace(Str, "{", "{")
- Str = Replace(Str, "}", "}")
- Str = Replace(Str, "|", "|")
- Str = Replace(Str, "]", "]")
- Str = Replace(Str, "[", "[")
- Str = Replace(Str, """", """)
- Str = Replace(Str, "<", "<")
- Str = Replace(Str, ">", ">")
-
- 'str = Replace(str, "\", "\")
- 'str = Replace(str, "#", "#")
- 'str = Replace(str, "?", "?")
- 'str = Replace(str, "/", "/")
-
- EncodeXML = Str
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : string " & Str & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-
-Function ReplaceTopicTokens(sString As String, _
- sToken As String, _
- sReplacement As String) As String
- On Error Resume Next
-
- Dim p As Integer
- Dim sTmp As String
-
- sTmp = sString
- Do
- p = InStr(sTmp, sToken)
- If p Then
- sTmp = Left(sTmp, p - 1) + sReplacement + Mid(sTmp, p + Len(sToken))
- End If
- Loop While p > 0
-
-
- ReplaceTopicTokens = sTmp
-
-End Function
-
-Function ReplaceTopic2Tokens(sString As String, _
- sToken1 As String, _
- sReplacement1 As String, _
- sToken2 As String, _
- sReplacement2 As String) As String
- On Error Resume Next
-
- ReplaceTopic2Tokens = _
- ReplaceTopicTokens(ReplaceTopicTokens(sString, sToken1, sReplacement1), _
- sToken2, sReplacement2)
-End Function
-
-'Language setting functions
-Function GetResourceDataFileName(thisDir As String) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetResourceDataFileName"
-
- Dim fso As FileSystemObject
- Set fso = New FileSystemObject
-
- 'A debug method - if a file called debug.dat exists load it.
- If fso.FileExists(fso.GetAbsolutePathName(thisDir & "\debug.dat")) Then
- GetResourceDataFileName = fso.GetAbsolutePathName(thisDir & "\debug.dat")
- GoTo FinalExit
- End If
-
- Dim isoLangStr As String
- Dim isoCountryStr As String
- Dim langDir As String
-
- langDir = thisDir & "\" & "lang"
-
- Dim userLCID As Long
- userLCID = GetUserDefaultLangID()
- Dim sysLCID As Long
- sysLCID = GetSystemDefaultLangID()
-
- isoLangStr = GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME)
- isoCountryStr = GetUserLocaleInfo(userLCID, LOCALE_SISO3166CTRYNAME)
-
- 'check for locale data in following order:
- ' user language
- ' isoLangStr & "_" & isoCountryStr & ".dat"
- ' isoLangStr & ".dat"
- ' system language
- ' isoLangStr & "_" & isoCountryStr & ".dat"
- ' isoLangStr & ".dat"
- ' "en_US" & ".dat"
-
- If fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")) Then
- GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")
- ElseIf fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")) Then
- GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")
- Else
- isoLangStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME)
- isoCountryStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME)
-
- If fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")) Then
- GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")
- ElseIf fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")) Then
- GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")
- Else
- GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & "en-US.dat")
- End If
- End If
-FinalExit:
- Set fso = Nothing
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetUserLocaleInfo"
- Dim sReturn As String
- Dim r As Long
-
- 'call the function passing the Locale type
- 'variable to retrieve the required size of
- 'the string buffer needed
- r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
-
- 'if successful..
- If r Then
- 'pad the buffer with spaces
- sReturn = Space$(r)
-
- 'and call again passing the buffer
- r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
-
- 'if successful (r > 0)
- If r Then
- 'r holds the size of the string
- 'including the terminating null
- GetUserLocaleInfo = Left$(sReturn, r - 1)
- End If
- End If
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-' This function returns the Application Data Folder Path
-Function GetAppDataFolder() As String
- Dim idlstr As Long
- Dim sPath As String
- Dim IDL As ITEMIDLIST
- Const NOERROR = 0
- Const MAX_LENGTH = 260
- Const CSIDL_APPDATA = &H1A
-
- On Error GoTo Err_GetFolder
-
- ' Fill the idl structure with the specified folder item.
- idlstr = SHGetSpecialFolderLocation(0, CSIDL_APPDATA, IDL)
-
- If idlstr = NOERROR Then
- ' Get the path from the idl list, and return
- ' the folder with a slash at the end.
- sPath = Space$(MAX_LENGTH)
- idlstr = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
- If idlstr Then
- GetAppDataFolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1)
- End If
- End If
-
-Exit_GetFolder:
- Exit Function
-
-Err_GetFolder:
- MsgBox "An Error was Encountered" & Chr(13) & Err.Description, _
- vbCritical Or vbOKOnly
- Resume Exit_GetFolder
-
-End Function
-
-Sub WriteToStatFile(statFileName As String, statValue As Integer, _
- currDocument As String, fso As Scripting.FileSystemObject)
-
- On Error Resume Next
-
- Dim fileCont As TextStream
-
- Set fileCont = fso.OpenTextFile(statFileName, ForWriting, True, TristateTrue)
- If (statValue = C_STAT_STARTING) Then
- fileCont.WriteLine ("analysing=" & currDocument)
- ElseIf (statValue = C_STAT_DONE) Then
- fileCont.WriteLine ("analysed=" & currDocument)
- ElseIf (statValue = C_STAT_FINISHED) Then
- fileCont.WriteLine ("finished")
- End If
-
- fileCont.Close
-End Sub
-
-' The function FindIndex looks for a document in the given document list
-' starting at the position lastIndex in that list. If the document could
-' not be found, the function starts searching from the beginning
-
-Function FindIndex(myDocument As String, _
- myDocList As Collection, _
- lastIndex As Long) As Long
-
- Dim lastEntry As Long
- Dim curIndex As Long
- Dim curEntry As String
- Dim entryFound As Boolean
-
- entryFound = False
- lastEntry = myDocList.count
-
- If (lastIndex > lastEntry) Then lastIndex = lastEntry
-
- If (lastIndex > 1) Then
- curIndex = lastIndex
- Else
- curIndex = 1
- End If
-
- While Not entryFound And curIndex <= lastEntry
- curEntry = myDocList.item(curIndex)
- If (curEntry = myDocument) Then
- entryFound = True
- Else
- curIndex = curIndex + 1
- End If
- Wend
-
- If (Not entryFound) Then
- curIndex = 1
- While Not entryFound And curIndex < lastIndex
- curEntry = myDocList.item(curIndex)
- If (curEntry = myDocument) Then
- entryFound = True
- Else
- curIndex = curIndex + 1
- End If
- Wend
- End If
-
- If entryFound Then
- FindIndex = curIndex
- Else
- FindIndex = 0
- End If
-
-End Function
-
-' The sub GetIndexValues calulates the start index of the analysis and the index
-' of the file after which the next intermediate reult will be written
-Function GetIndexValues(startIndex As Long, nextCheck As Long, _
- myFiles As Collection) As Boolean
-
- Dim lastCheckpoint As String
- Dim nextFile As String
- Dim newResultsFile As Boolean
-
- lastCheckpoint = ProfileGetItem(C_ANALYSIS, C_LAST_CHECKPOINT, "", mIniFilePath)
- nextFile = ProfileGetItem(C_ANALYSIS, C_NEXT_FILE, "", mIniFilePath)
- newResultsFile = True
-
- If (nextFile = "") Then
- ' No Analysis done yet
- startIndex = 1
- nextCheck = C_MAX_CHECK
- Else
- If (lastCheckpoint = "") Then
- startIndex = 1
- Else
- startIndex = FindIndex(lastCheckpoint, myFiles, 1) + 1
- If (startIndex > 0) Then newResultsFile = False
- End If
-
- nextCheck = FindIndex(nextFile, myFiles, startIndex - 1)
-
- If (nextCheck = 0) Then ' Next file not in file list, restarting
- startIndex = 1
- nextCheck = C_MAX_CHECK
- newResultsFile = True
- ElseIf (nextCheck < startIndex) Then 'we are done?
- nextCheck = startIndex + C_MAX_CHECK
- ElseIf (nextCheck = startIndex) Then 'skip this one
- WriteToLog C_ERROR_HANDLING_DOC & nextCheck, nextFile
- startIndex = startIndex + 1
- nextCheck = startIndex + C_MAX_CHECK
- Else 'last time an error occured with that file, write before analysing
- nextCheck = nextCheck - 1
- End If
- End If
- GetIndexValues = newResultsFile
-End Function
-
-Private Sub GetDocModificationDates(docCounts As DocModificationDates)
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetDocModificationDates"
-
- docCounts.lessThanThreemonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_3_MONTH, "0", mIniFilePath))
- docCounts.threeToSixmonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_6_MONTH, "0", mIniFilePath))
- docCounts.sixToTwelvemonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_12_MONTH, "0", mIniFilePath))
- docCounts.greaterThanOneYear = CLng(ProfileGetItem("Analysis", C_DOCS_MORE_12_MONTH, "0", mIniFilePath))
-
-FinalExit:
- Exit Sub
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
+Attribute VB_Name = "AnalysisDriver" +'************************************************************************* +' +' Licensed to the Apache Software Foundation (ASF) under one +' or more contributor license agreements. See the NOTICE file +' distributed with this work for additional information +' regarding copyright ownership. The ASF licenses this file +' to you under the Apache License, Version 2.0 (the +' "License"); you may not use this file except in compliance +' with the License. You may obtain a copy of the License at +' +' http://www.apache.org/licenses/LICENSE-2.0 +' +' Unless required by applicable law or agreed to in writing, +' software distributed under the License is distributed on an +' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +' KIND, either express or implied. See the License for the +' specific language governing permissions and limitations +' under the License. +' +'************************************************************************* +Option Explicit + +' Declare Public variables. +Public Type ShortItemId + cb As Long + abID As Byte +End Type + +Public Type ITEMIDLIST + mkid As ShortItemId +End Type + +Public Declare Function FindWindow Lib "user32" Alias _ + "FindWindowA" (ByVal lpClassName As String, _ + ByVal lpWindowName As Long) As Long + +Private Declare Function GetTickCount Lib "kernel32" () As Long + +'This function saves the passed value to the file, +'under the section and key names specified. +'If the ini file, lpFileName, does not exist, it is created. +'If the section, lpSectionName, does not exist, it is created. +'If the key name, lpKeyName, does not exist, it is created. +'If the key name exists, it's value, lpString, is replaced. +Private Declare Function WritePrivateProfileString Lib "kernel32" _ + Alias "WritePrivateProfileStringA" _ + (ByVal lpSectionName As String, _ + ByVal lpKeyName As Any, _ + ByVal lpString As Any, _ + ByVal lpFileName As String) As Long + +Private Declare Function GetPrivateProfileString Lib "kernel32" _ + Alias "GetPrivateProfileStringA" _ + (ByVal lpSectionName As String, _ + ByVal lpKeyName As Any, _ + ByVal lpDefault As String, _ + ByVal lpReturnedString As String, _ + ByVal nSize As Long, _ + ByVal lpFileName As String) As Long + +Private Declare Function UrlEscape Lib "shlwapi" _ + Alias "UrlEscapeA" _ + (ByVal pszURL As String, _ + ByVal pszEscaped As String, _ + pcchEscaped As Long, _ + ByVal dwFlags As Long) As Long + +Public Declare Function SHGetPathFromIDList Lib "shell32.dll" _ + (ByVal pidl As Long, ByVal pszPath As String) As Long + +Public Declare Function SHGetSpecialFolderLocation Lib _ + "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder _ + As Long, pidl As ITEMIDLIST) As Long + +Public Const LOCALE_ILANGUAGE As Long = &H1 'language id +Public Const LOCALE_SLANGUAGE As Long = &H2 'localized name of lang +Public Const LOCALE_SENGLANGUAGE As Long = &H1001 'English name of lang +Public Const LOCALE_SABBREVLANGNAME As Long = &H3 'abbreviated lang name +Public Const LOCALE_SNATIVELANGNAME As Long = &H4 'native name of lang +Public Const LOCALE_ICOUNTRY As Long = &H5 'country code +Public Const LOCALE_SCOUNTRY As Long = &H6 'localized name of country +Public Const LOCALE_SENGCOUNTRY As Long = &H1002 'English name of country +Public Const LOCALE_SABBREVCTRYNAME As Long = &H7 'abbreviated country name +Public Const LOCALE_SNATIVECTRYNAME As Long = &H8 'native name of country +Public Const LOCALE_SINTLSYMBOL As Long = &H15 'intl monetary symbol +Public Const LOCALE_IDEFAULTLANGUAGE As Long = &H9 'def language id +Public Const LOCALE_IDEFAULTCOUNTRY As Long = &HA 'def country code +Public Const LOCALE_IDEFAULTCODEPAGE As Long = &HB 'def oem code page +Public Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004 'def ansi code page +Public Const LOCALE_IDEFAULTMACCODEPAGE As Long = &H1011 'def mac code page + +Public Const LOCALE_IMEASURE As Long = &HD '0 = metric, 1 = US +Public Const LOCALE_SSHORTDATE As Long = &H1F 'short date format string + +'#if(WINVER >= &H0400) +Public Const LOCALE_SISO639LANGNAME As Long = &H59 'ISO abbreviated language name +Public Const LOCALE_SISO3166CTRYNAME As Long = &H5A 'ISO abbreviated country name +'#endif /* WINVER >= as long = &H0400 */ + +'#if(WINVER >= &H0500) +Public Const LOCALE_SNATIVECURRNAME As Long = &H1008 'native name of currency +Public Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012 'default ebcdic code page +Public Const LOCALE_SSORTNAME As Long = &H1013 'sort name +'#endif /* WINVER >= &H0500 */ + +Public Declare Function GetSystemDefaultLangID Lib "kernel32" () As Long +Public Declare Function GetUserDefaultLangID Lib "kernel32" () As Long + +Public Declare Function GetLocaleInfo Lib "kernel32" _ + Alias "GetLocaleInfoA" _ + (ByVal Locale As Long, _ + ByVal LCType As Long, _ + ByVal lpLCData As String, _ + ByVal cchData As Long) As Long + + +Public Const CWIZARD = "analysis" + +Const CROWOFFSET = 2 +Const CDOCPROP_PAW_ROWOFFSET = 3 +Private mDocPropRowOffset As Long + +Const CNUMBERDOC_ALL = "All" +Const CTOTAL_DOCS_ANALYZED = "TotalDocsAnalysed" +Const CNUMDAYS_IN_MONTH = 30 +Const CMAX_LIMIT = 10000 + +Const CISSUE_DETDOCNAME = 1 +Const CISSUE_DETDOCAPPLICATION = CISSUE_DETDOCNAME + 1 +Const CISSUE_DETTYPE = CISSUE_DETDOCAPPLICATION + 1 +Const CISSUE_DETSUBTYPE = CISSUE_DETTYPE + 1 +Const CISSUE_DETLOCATION = CISSUE_DETSUBTYPE + 1 +Const CISSUE_DETSUBLOCATION = CISSUE_DETLOCATION + 1 +Const CISSUE_DETLINE = CISSUE_DETSUBLOCATION + 1 +Const CISSUE_DETCOLUMN = CISSUE_DETLINE + 1 +Const CISSUE_DETATTRIBUTES = CISSUE_DETCOLUMN + 1 +Const CISSUE_DETNAMEANDPATH = CISSUE_DETATTRIBUTES + 1 + +Const CREF_DETDOCNAME = 1 +Const CREF_DETDOCAPPLICATION = CREF_DETDOCNAME + 1 +Const CREF_DETREFERENCE = CREF_DETDOCAPPLICATION + 1 +Const CREF_DETDESCRIPTION = CREF_DETREFERENCE + 1 +Const CREF_DETLOCATION = CREF_DETDESCRIPTION + 1 +Const CREF_DETATTRIBUTES = CREF_DETLOCATION + 1 +Const CREF_DETNAMEANDPATH = CREF_DETATTRIBUTES + 1 + +Const CINPUT_DIR = "indir" +Const COUTPUT_DIR = "outdir" +Const CRESULTS_FILE = "resultsfile" +Const CLOG_FILE = "logfile" +Const CRESULTS_TEMPLATE = "resultstemplate" +Const CRESULTS_EXIST = "resultsexist" +Const COVERWRITE_FILE = "overwritefile" +Const CNEW_RESULTS_FILE = "newresultsfile" +Const CINCLUDE_SUBDIRS = "includesubdirs" +Const CDEBUG_LEVEL = "debuglevel" +Const COUTPUT_TYPE = "outputtype" +Const COUTPUT_TYPE_XLS = "xls" +Const COUTPUT_TYPE_XML = "xml" +Const COUTPUT_TYPE_BOTH = "both" +Const COVERVIEW_TITLE_LABEL = "OV_Document_Analysis_Overview_lbl" +Const CDEFAULT_PASSWORD = "defaultpassword" +Const CVERSION = "version" +Const CTITLE = "title" +Const CDOPREPARE = "prepare" +Const CISSUES_LIMIT = "issuesmonthlimit" +Const CSINGLE_FILE = "singlefile" +Const CFILE_LIST = "filelist" +Const CSTAT_FILE = "statfilename" +Const C_ABORT_ANALYSIS = "abortanalysis" +Const C_DOCS_LESS_3_MONTH = "DocumentsYoungerThan3Month" +Const C_DOCS_LESS_6_MONTH = "DocumentsYoungerThan6Month" +Const C_DOCS_LESS_12_MONTH = "DocumentsYoungerThan12Month" +Const C_DOCS_MORE_12_MONTH = "DocumentsOlderThan12Month" + +Private Const C_ANALYSIS As String = "Analysis" +Private Const C_LAST_CHECKPOINT As String = "LastCheckpoint" +Private Const C_NEXT_FILE As String = "NextFile" +Private Const C_MAX_CHECK_INI As String = "FilesBeforeSave" +Private Const C_MAX_WAIT_BEFORE_WRITE_INI As String = "SecondsBeforeSave" +Private Const C_MAX_RANGE_PROCESS_TIME_INI As String = "ExcelMaxRangeProcessTime" +Private Const C_ERROR_HANDLING_DOC As String = "_ERROR_HANDLING_DOC_" +Private Const C_MAX_CHECK As Long = 100 +Private Const C_MAX_WAIT_BEFORE_WRITE As Long = 300 ' sec +Private Const C_MAX_RANGE_PROCESS_TIME As Integer = 30 'sec + +Private Const C_STAT_STARTING As Integer = 1 +Private Const C_STAT_DONE As Integer = 2 +Private Const C_STAT_FINISHED As Integer = 3 + +Private Type DocumentCount + numDocsAnalyzed As Long + numDocsAnalyzedWithIssues As Long + numMinorIssues As Long + numComplexIssues As Long + numMacroIssues As Long + numPreparableIssues As Long + totalMacroCosts As Long + totalDocIssuesCosts As Long + totalPreparableIssuesCosts As Long +End Type + +Private Type DocModificationDates + lessThanThreemonths As Long + threeToSixmonths As Long + sixToTwelvemonths As Long + greaterThanOneYear As Long +End Type + +Private Type DocMacroClassifications + None As Long + Simple As Long + Medium As Long + complex As Long +End Type + +Private Type DocIssueClassifications + None As Long + Minor As Long + complex As Long +End Type + +Const CCOST_COL_OFFSET = -1 + +Private mLogFilePath As String +Private mDocIndex As String +Private mDebugLevel As Long +Private mIniFilePath As String +Private mUserFormTypesDict As Scripting.Dictionary +Private mIssuesDict As Scripting.Dictionary +Private mMacroDict As Scripting.Dictionary +Private mPreparedIssuesDict As Scripting.Dictionary +Private mIssuesClassificationDict As Scripting.Dictionary +Private mIssuesCostDict As Scripting.Dictionary +Private mIssuesLimit As Date + +Public Const CWORD_DRIVER_FILE = "_OOoDocAnalysisWordDriver.doc" +Public Const CEXCEL_DRIVER_FILE = "_OOoDocAnalysisExcelDriver.xls" +Public Const CPP_DRIVER_FILE = "_OOoDocAnalysisPPTDriver.ppt" +Public Const CWORD_DRIVER_FILE_TEMP = "~$OoDocAnalysisWordDriver.doc" +Public Const CEXCEL_DRIVER_FILE_TEMP = "~$OoDocAnalysisExcelDriver.xls" +Public Const CPP_DRIVER_FILE_TEMP = "~$OoDocAnalysisPPTDriver.ppt" + +'Doc Properties Offsets - used in WriteDocProperties and GetPreparableFilesFromDocProps +Const CDOCINFONAME = 1 +Const CDOCINFOAPPLICATION = CDOCINFONAME + 1 + +Const CDOCINFOISSUE_CLASS = CDOCINFOAPPLICATION + 1 +Const CDOCINFOCOMPLEXISSUES = CDOCINFOISSUE_CLASS + 1 +Const CDOCINFOMINORISSUES = CDOCINFOCOMPLEXISSUES + 1 +Const CDOCINFOPREPAREDISSUES = CDOCINFOMINORISSUES + 1 + +Const CDOCINFOMACRO_CLASS = CDOCINFOPREPAREDISSUES + 1 +Const CDOCINFOMACRO_USERFORMS = CDOCINFOMACRO_CLASS + 1 +Const CDOCINFOMACRO_LINESOFCODE = CDOCINFOMACRO_USERFORMS + 1 + +Const CDOCINFODOCISSUECOSTS = CDOCINFOMACRO_LINESOFCODE + 1 +Const CDOCINFOPREPARABLEISSUECOSTS = CDOCINFODOCISSUECOSTS + 1 +Const CDOCINFOMACROISSUECOSTS = CDOCINFOPREPARABLEISSUECOSTS + 1 + +Const CDOCINFONUMBERPAGES = CDOCINFOMACROISSUECOSTS + 1 +Const CDOCINFOCREATED = CDOCINFONUMBERPAGES + 1 +Const CDOCINFOLASTMODIFIED = CDOCINFOCREATED + 1 +Const CDOCINFOLASTACCESSED = CDOCINFOLASTMODIFIED + 1 +Const CDOCINFOLASTPRINTED = CDOCINFOLASTACCESSED + 1 +Const CDOCINFOLASTSAVEDBY = CDOCINFOLASTPRINTED + 1 +Const CDOCINFOREVISION = CDOCINFOLASTSAVEDBY + 1 +Const CDOCINFOTEMPLATE = CDOCINFOREVISION + 1 +Const CDOCINFONAMEANDPATH = CDOCINFOTEMPLATE + 1 + +'Overview shapes +Const COV_DOC_MOD_DATES_CHART = "Chart 21" +Const COV_DOC_MACRO_CHART = "Chart 22" +Const COV_DOC_ANALYSIS_CHART = "Chart 23" + +Const COV_DOC_MOD_DATES_COMMENT_TXB = "Text Box 25" +Const COV_DOC_MOD_DATES_LEGEND_TXB = "Text Box 12" + +Const COV_DOC_MACRO_COMMENT_TXB = "Text Box 26" +Const COV_DOC_MACRO_LEGEND_TXB = "Text Box 16" + +Const COV_DOC_ANALYSIS_COMMENT_TXB = "Text Box 27" +Const COV_DOC_ANALYSIS_LEGEND_DAW_TXB = "Text Box 28" +Const COV_DOC_ANALYSIS_LEGEND_PAW_TXB = "Text Box 18" + +Const COV_HIGH_LEVEL_ANALYSIS_RANGE = "OV_High_Level_Analysis_Range" +Const COV_COST_RANGE = "OV_Cost_Range" + +'Sheet labels +Const COV_HIGH_LEVEL_ANALYSIS_LBL = "OV_High_level_analysis_lbl" +Const COV_DP_PREPISSUES_COL_LBL = "DocProperties_PreparedIssues_Column" +Const COV_COSTS_PREPISSUE_COUNT_COL_LBL = "Costs_PreparedIssueCount_Column" +Const CDP_DAW_HIDDEN_COLS_LBL = "DP_DAW_HIDDEN_COLS_RANGE" +Const CDP_DAW_HIDDEN_COLS2_LBL = "DP_DAW_HIDDEN_COLS_RANGE2" +Const CDP_DAW_HIDDEN_ROW_LBL = "DP_DAW_HIDDEN_ROW_RANGE" + +Const COV_DAW_SETUP_SHEETS_RUN_LBL = "OV_DAW_SETUP_SHEETS_RUN" +Const COV_PAW_SETUP_SHEETS_RUN_LBL = "OV_PAW_SETUP_SHEETS_RUN" +Const COV_Internal_Attributes_Cols_LBL = "OV_Internal_Attributes_Cols" + +Const CR_STR = "<CR>" +Const CR_TOPIC = "<TOPIC>" +Const CR_PRODUCT = "<PRODUCT>" + +Const CLEGEND_FONT_SIZE = 8 +Const CCOMMENTS_FONT_SIZE = 10 + +Dim mTstart As Single +Dim mTend As Single +Public gExcelMaxRangeProcessTime As Integer + +Sub AnalyseDirectory() + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AnalyseDirectory" + + Dim iniFilePath As String + Dim startDir As String + Dim fileList As String + Dim storeToDir As String + Dim resultsFile As String + Dim resultsTemplate As String + Dim statFileName As String + Dim bOverwriteResultsFile As Boolean + Dim bNewResultsFile As Boolean + Dim outputType As String + Dim singleFile As String + Dim nTimeNeeded As Long + Dim nIncrementFileCounter As Long + Dim nMaxWaitBeforeWrite As Long + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + + SetAppToMinimized + + If InDocPreparation Then + mDocPropRowOffset = CDOCPROP_PAW_ROWOFFSET + Else + mDocPropRowOffset = CROWOFFSET + End If + + 'Get Wizard input variables + SetupWizardVariables fileList, storeToDir, resultsFile, _ + mLogFilePath, resultsTemplate, bOverwriteResultsFile, bNewResultsFile, _ + statFileName, mDebugLevel, outputType, singleFile + + startDir = ProfileGetItem("Analysis", CINPUT_DIR, "", mIniFilePath) + + nIncrementFileCounter = CLng(ProfileGetItem("Analysis", _ + C_MAX_CHECK_INI, C_MAX_CHECK, mIniFilePath)) + nMaxWaitBeforeWrite = CLng(ProfileGetItem("Analysis", _ + C_MAX_WAIT_BEFORE_WRITE_INI, C_MAX_WAIT_BEFORE_WRITE, mIniFilePath)) + gExcelMaxRangeProcessTime = CInt(ProfileGetItem("Analysis", _ + C_MAX_RANGE_PROCESS_TIME_INI, C_MAX_RANGE_PROCESS_TIME, mIniFilePath)) + LocalizeResources + + 'Setup File List + 'For Prepare - get list from results spreadsheet with docs analysis found as preparable + 'If no results spreadsheet then just try to prepare all the docs - run over full analysis list + Dim myFiles As Collection + Set myFiles = New Collection + Dim sAnalysisOrPrep As String + If InDocPreparation And CheckDoPrepare Then + sAnalysisOrPrep = "Prepared" + If fso.FileExists(storeToDir & "\" & resultsFile) Then + If Not GetPrepareFilesToAnalyze(storeToDir & "\" & resultsFile, myFiles, fso) Then + SetPrepareToNone + WriteDebug currentFunctionName & ": No files to analyse!" + GoTo FinalExit 'No files to prepare - exit + End If + Else + If Not GetFilesToAnalyze(fileList, singleFile, myFiles) Then + SetPrepareToNone + WriteDebug currentFunctionName & ": No files to analyse! Filelist (" & fileList & ") empty?" + GoTo FinalExit 'No files to prepare - exit + End If + End If + Else + sAnalysisOrPrep = "Analyzed" + If Not GetFilesToAnalyze(fileList, singleFile, myFiles) Then + WriteDebug currentFunctionName & ": No files to analyse! Filelist (" & fileList & ") empty?" + GoTo FinalExit + End If + End If + + Dim index As Long + Dim numFiles As Long + Dim nextSave As Long + Dim startIndex As Long + Dim bResultsWaiting As Boolean + Dim AnalysedDocs As Collection + Dim startDate As Date + Dim currentDate As Date + + Set AnalysedDocs = New Collection + numFiles = myFiles.count + bResultsWaiting = False + + If (singleFile <> "") Then + ' No recovery handling for single file analysis and the value in the + ' ini file should be used for bNewResultsFile + startIndex = 1 + Else + bNewResultsFile = bNewResultsFile And GetIndexValues(startIndex, nextSave, myFiles) + End If + + startDate = Now() + + ' Analyse all files + For index = startIndex To numFiles + Set mIssuesClassificationDict = New Scripting.Dictionary + mIssuesClassificationDict.CompareMode = TextCompare + Set mIssuesCostDict = New Scripting.Dictionary + 'mIssuesCostDict.CompareMode = TextCompare + + Set mUserFormTypesDict = New Scripting.Dictionary + Set mIssuesDict = New Scripting.Dictionary + Set mMacroDict = New Scripting.Dictionary + Set mPreparedIssuesDict = New Scripting.Dictionary + + 'Write to Application log + Dim myAnalyser As MigrationAnalyser + Set myAnalyser = New MigrationAnalyser + + If (CheckForAbort) Then GoTo FinalExit + + 'Log Analysis + WriteToStatFile statFileName, C_STAT_STARTING, myFiles.item(index), fso + WriteToLog "Analyzing", myFiles.item(index) + WriteToIni C_NEXT_FILE, myFiles.item(index) + mDocIndex = index + + 'Do Analysis + myAnalyser.DoAnalyse myFiles.item(index), mUserFormTypesDict, startDir, storeToDir, fso + + AnalysedDocs.Add myAnalyser.Results + bResultsWaiting = True + + WriteToLog sAnalysisOrPrep, index & "of" & numFiles & _ + " " & getAppSpecificApplicationName & " Documents" + WriteToLog "Analyzing", "Done" + WriteToLog sAnalysisOrPrep & "Doc" & index, myFiles.item(index) + Set myAnalyser = Nothing + + If (CheckForAbort) Then GoTo FinalExit + + 'No need to output results spreadsheet, just doing prepare + If CheckDoPrepare Then GoTo CONTINUE_FOR + + nTimeNeeded = val(DateDiff("s", startDate, Now())) + If ((nTimeNeeded > nMaxWaitBeforeWrite) Or _ + (index >= nextSave)) Then + If WriteResults(storeToDir, resultsFile, resultsTemplate, _ + bOverwriteResultsFile, bNewResultsFile, _ + outputType, AnalysedDocs, fso) Then + nextSave = index + C_MAX_CHECK + bResultsWaiting = False + Set AnalysedDocs = New Collection + WriteToIni C_LAST_CHECKPOINT, myFiles.item(index) + startDate = Now() + Else + 'write error + End If + End If + WriteToStatFile statFileName, C_STAT_DONE, myFiles.item(index), fso +CONTINUE_FOR: + Next index + + If (bResultsWaiting) Then + If WriteResults(storeToDir, resultsFile, resultsTemplate, _ + bOverwriteResultsFile, bNewResultsFile, _ + outputType, AnalysedDocs, fso) Then + WriteToIni C_LAST_CHECKPOINT, myFiles.item(index - 1) + Else + 'write error + End If + End If + WriteToStatFile statFileName, C_STAT_FINISHED, "", fso + +FinalExit: + + Set fso = Nothing + Set myFiles = Nothing + Set mIssuesClassificationDict = Nothing + Set mIssuesCostDict = Nothing + Set mUserFormTypesDict = Nothing + Set mIssuesDict = Nothing + Set mMacroDict = Nothing + Set mPreparedIssuesDict = Nothing + + Set AnalysedDocs = Nothing + + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Function WriteResults(storeToDir As String, resultsFile As String, resultsTemplate As String, _ + bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, _ + outputType As String, AnalysedDocs As Collection, _ + fso As FileSystemObject) As Boolean + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteResults" + + If InDocPreparation Then + If outputType = COUTPUT_TYPE_XML Or outputType = COUTPUT_TYPE_BOTH Then + WriteXMLOutput storeToDir, resultsFile, _ + bOverwriteResultsFile, bNewResultsFile, AnalysedDocs, fso + End If + End If + + If outputType = COUTPUT_TYPE_XLS Or outputType = COUTPUT_TYPE_BOTH Then + WriteXLSOutput storeToDir, resultsFile, fso.GetAbsolutePathName(resultsTemplate), _ + bOverwriteResultsFile, bNewResultsFile, AnalysedDocs, fso + End If + + WriteResults = True + bNewResultsFile = False + +FinalExit: + Exit Function + +HandleErrors: + WriteResults = False + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetFilesToAnalyze_old(startDir As String, bIncludeSubdirs As Boolean, _ + myFiles As Collection) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetFilesToAnalyze" + Dim fso As New FileSystemObject + Dim theResultsFile As String + theResultsFile = ProfileGetItem("Analysis", CINPUT_DIR, "c:\", mIniFilePath) & "\" & ProfileGetItem("Analysis", CRESULTS_FILE, "", mIniFilePath) + + GetFilesToAnalyze = False + + Dim searchTypes As Collection + Set searchTypes = New Collection + SetupSearchTypes searchTypes + If searchTypes.count = 0 Then + GoTo FinalExit + End If + + Dim myDocFiles As CollectedFiles + Set myDocFiles = New CollectedFiles + With myDocFiles + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CWORD_DRIVER_FILE) + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CEXCEL_DRIVER_FILE) + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CPP_DRIVER_FILE) + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CWORD_DRIVER_FILE_TEMP) + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CEXCEL_DRIVER_FILE_TEMP) + .BannedList.Add fso.GetAbsolutePathName(getAppSpecificPath & "\" & CPP_DRIVER_FILE_TEMP) + .BannedList.Add theResultsFile + End With + myDocFiles.Search rootDir:=startDir, FileSpecs:=searchTypes, _ + IncludeSubdirs:=bIncludeSubdirs + + If getAppSpecificApplicationName = CAPPNAME_WORD Then + Set myFiles = myDocFiles.WordFiles + ElseIf getAppSpecificApplicationName = CAPPNAME_EXCEL Then + Set myFiles = myDocFiles.ExcelFiles + ElseIf getAppSpecificApplicationName = CAPPNAME_POWERPOINT Then + Set myFiles = myDocFiles.PowerPointFiles + Else + WriteDebug currentFunctionName & " : invalid application " & getAppSpecificApplicationName + GoTo FinalExit + End If + + GetFilesToAnalyze = True + +FinalExit: + Set searchTypes = Nothing + Set myDocFiles = Nothing + + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetFilesToAnalyze(fileList As String, startFile As String, _ + myFiles As Collection) As Boolean + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetFilesToAnalyze" + + Dim fso As New FileSystemObject + Dim fileContent As TextStream + Dim fileName As String + + GetFilesToAnalyze = False + + If (startFile = "") Then + If (fso.FileExists(fileList)) Then + Set fileContent = fso.OpenTextFile(fileList, ForReading, False, TristateTrue) + While (Not fileContent.AtEndOfStream) + fileName = fileContent.ReadLine + fileName = Trim(fileName) + If (fileName <> "") Then + myFiles.Add (fileName) + End If + Wend + fileContent.Close + End If + Else + myFiles.Add (startFile) + End If + + If (myFiles.count <> 0) Then GetFilesToAnalyze = True + +FinalExit: + Set fileContent = Nothing + Set fso = Nothing + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetPrepareFilesToAnalyze(resultsFilePath As String, myFiles As Collection, _ + fso As FileSystemObject) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetPrepareFilesToAnalyze" + + GetPrepareFilesToAnalyze = False + + If Not fso.FileExists(resultsFilePath) Then + WriteDebug currentFunctionName & ": results file does not exist : " & resultsFilePath + GoTo FinalExit + End If + + 'Open results spreadsheet + Dim xl As Excel.Application + If getAppSpecificApplicationName = CAPPNAME_EXCEL Then + Set xl = Application + xl.Visible = True + Else + Set xl = GetExcelInstance + xl.Visible = False + End If + Dim logWb As WorkBook + Set logWb = xl.Workbooks.Open(resultsFilePath) + + Dim wsDocProp As Worksheet + Set wsDocProp = logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP) + + Dim startRow As Long + Dim endRow As Long + startRow = mDocPropRowOffset + 1 + endRow = GetWorkbookNameValueAsLong(logWb, CTOTAL_DOCS_ANALYZED) + mDocPropRowOffset + + GetPreparableFilesFromDocProps wsDocProp, startRow, endRow, fso, myFiles + + GetPrepareFilesToAnalyze = (myFiles.count > 0) + +FinalExit: + Set wsDocProp = Nothing + If Not logWb Is Nothing Then logWb.Close + Set logWb = Nothing + + If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then + If Not xl Is Nothing Then + If xl.Workbooks.count = 0 Then + xl.Quit + End If + End If + End If + Set xl = Nothing + + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetPreparableFilesFromDocProps(wsDocProp As Worksheet, startRow As Long, _ + endRow As Long, fso As FileSystemObject, myFiles As Collection) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetPreparableFilesFromDocProps" + GetPreparableFilesFromDocProps = False + + Dim index As Long + Dim fileName As String + Dim fileExt As String + Dim docExt As String + Dim templateExt As String + + docExt = getAppSpecificDocExt + templateExt = getAppSpecificTemplateExt + + For index = startRow To endRow + If GetWorksheetCellValueAsLong(wsDocProp, index, CDOCINFOPREPAREDISSUES) > 0 Then + fileName = GetWorksheetCellValueAsString(wsDocProp, index, CDOCINFONAME) + fileExt = "." & fso.GetExtensionName(fileName) + 'Don't have to worry about search types - just looking at existing results + 'so just check both legal extensions for this application + If fileExt = docExt Or fileExt = templateExt Then + myFiles.Add GetWorksheetCellValueAsString(wsDocProp, index, CDOCINFONAMEANDPATH) + End If + End If + Next index + + GetPreparableFilesFromDocProps = myFiles.count > 0 +FinalExit: + Exit Function + +HandleErrors: + GetPreparableFilesFromDocProps = False + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub OpenXLSResultFile(resultsFile As String, _ + resultsTemplate As String, _ + bNewResultsFile As Boolean, _ + excelApp As Excel.Application, _ + resultSheet As Excel.WorkBook) + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OpenXLSResultFile" + + If getAppSpecificApplicationName = CAPPNAME_EXCEL Then + Set excelApp = Application + excelApp.Visible = True + Else + Set excelApp = GetExcelInstance + excelApp.Visible = False + End If + + If bNewResultsFile Then + Set resultSheet = excelApp.Workbooks.Add(Template:=resultsTemplate) + Localize_WorkBook resultSheet + Else + Set resultSheet = excelApp.Workbooks.Open(resultsFile) + End If + +FinalExit: + Exit Sub + +HandleErrors: + excelApp.DisplayAlerts = False + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub CloseXLSResultFile(excelApp As Excel.Application, _ + resultSheet As Excel.WorkBook) + + On Error Resume Next + + If Not resultSheet Is Nothing Then resultSheet.Close + Set resultSheet = Nothing + + If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then + If Not excelApp Is Nothing Then + excelApp.Visible = True + If excelApp.Workbooks.count = 0 Then + excelApp.Quit + End If + End If + End If + Set excelApp = Nothing + + Exit Sub +End Sub + +Sub WriteXLSOutput(storeToDir As String, resultsFile As String, resultsTemplate As String, _ + bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, AnalysedDocs As Collection, _ + fso As Scripting.FileSystemObject) + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXLSOutput" + + Dim offsetDocPropRow As Long + Dim offsetDocIssuesRow As Long + Dim offsetDocIssueDetailsRow As Long + Dim offsetDocRefDetailsRow As Long + + Const COVERVIEW_SHEET_IDX = 1 + Const CDOCLIST_SHEET_IDX = 2 + Const CISSUES_ANALYSED_SHEET = 3 + Const CISSUE_DETAILS_SHEET = 4 + Const CWORD_ISSUES_SHEET = 5 + Const CEXCEL_ISSUES_SHEET = 6 + Const CPOWERPOINT_ISSUES_SHEET = 7 + Const CREFERENCE_ISSUES_SHEET = 8 + + 'Begin writing stats to excel + Dim xl As Excel.Application + If getAppSpecificApplicationName = CAPPNAME_EXCEL Then + Set xl = Application + xl.Visible = True + Else + Set xl = GetExcelInstance + xl.Visible = False + End If + + Dim logWb As WorkBook + + If bNewResultsFile Then + Set logWb = xl.Workbooks.Add(Template:=resultsTemplate) + Localize_WorkBook logWb + Else + Set logWb = xl.Workbooks.Open(storeToDir & "\" & resultsFile) + End If + + SetupAnalysisResultsVariables logWb, offsetDocPropRow, _ + offsetDocIssuesRow, offsetDocIssueDetailsRow, offsetDocRefDetailsRow + + ' Iterate through results and write info + Dim aAnalysis As DocumentAnalysis + Dim row As Long + Dim docCounts As DocumentCount + Dim templateCounts As DocumentCount + + Dim issuesRow As Long + Dim issueDetailsRow As Long + Dim refDetailsRow As Long + + Dim wsOverview As Worksheet + Dim wsCosts As Worksheet + Dim wsPgStats As Worksheet + Dim wsIssues As Worksheet + Dim wsIssueDetails As Worksheet + Dim wsRefDetails As Worksheet + + Set wsOverview = logWb.Sheets(COVERVIEW_SHEET_IDX) + Set wsPgStats = logWb.Sheets(CDOCLIST_SHEET_IDX) + + 'Some localized names might be longer than 31 chars, excel doesn't + 'allow such names! + On Error Resume Next + wsOverview.name = RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW + wsPgStats.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP + On Error GoTo HandleErrors + + If InDocPreparation Then + Set wsCosts = logWb.Sheets(CISSUES_ANALYSED_SHEET) + Dim appName As String + appName = getAppSpecificApplicationName + Select Case appName + Case "Word" + Set wsIssues = logWb.Worksheets(CWORD_ISSUES_SHEET) + Case "Excel" + Set wsIssues = logWb.Worksheets(CEXCEL_ISSUES_SHEET) + Case "PowerPoint" + Set wsIssues = logWb.Worksheets(CPOWERPOINT_ISSUES_SHEET) + Case Default + Err.Raise Number:=-1, Description:="BadAppName" + End Select + Set wsIssueDetails = logWb.Sheets(CISSUE_DETAILS_SHEET) + Set wsRefDetails = logWb.Sheets(CREFERENCE_ISSUES_SHEET) + issuesRow = 1 + CROWOFFSET + offsetDocIssuesRow + issueDetailsRow = 1 + CROWOFFSET + offsetDocIssueDetailsRow + refDetailsRow = 1 + CROWOFFSET + offsetDocRefDetailsRow + ' localize PAW worksheets + Dim wsWordIssues As Worksheet + Dim wsExcelIssues As Worksheet + Dim wsPowerPointIssues As Worksheet + Set wsWordIssues = logWb.Worksheets(CWORD_ISSUES_SHEET) + Set wsExcelIssues = logWb.Worksheets(CEXCEL_ISSUES_SHEET) + Set wsPowerPointIssues = logWb.Worksheets(CPOWERPOINT_ISSUES_SHEET) + + On Error Resume Next + wsCosts.name = RID_STR_COMMON_RESULTS_SHEET_NAME_COSTS + wsIssueDetails.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS + wsRefDetails.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS + wsWordIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD + wsExcelIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL + wsPowerPointIssues.name = RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT + On Error GoTo HandleErrors + End If + + Dim fileName As String + Dim macroClasses As DocMacroClassifications + Dim issueClasses As DocIssueClassifications + + For row = 1 To AnalysedDocs.count 'Need Row count - so not using Eor Each + Set aAnalysis = AnalysedDocs.item(row) + fileName = fso.GetFileName(aAnalysis.name) + + If InDocPreparation Then + issuesRow = WriteDocIssues(wsIssues, issuesRow, aAnalysis, fileName) + issueDetailsRow = _ + ProcessIssuesAndWriteDocIssueDetails(logWb, wsIssueDetails, issueDetailsRow, aAnalysis, fileName) + refDetailsRow = _ + WriteDocRefDetails(wsRefDetails, refDetailsRow, aAnalysis, fileName) + aAnalysis.MacroCosts = getMacroIssueCosts(logWb, aAnalysis) + WriteDocProperties wsPgStats, row + offsetDocPropRow, aAnalysis, fileName + Else + ProcessIssuesForDAW logWb, aAnalysis, fileName + WriteDocProperties wsPgStats, row + offsetDocPropRow, aAnalysis, fileName + End If + + UpdateAllCounts aAnalysis, docCounts, templateCounts, macroClasses, issueClasses, fso + + Set aAnalysis = Nothing + Next row + + ' We change the font used for text box shapes here for the japanese + ' version, because office 2000 sometimes displays squares instead of + ' chars + Dim langStr As String + Dim userLCID As Long + Dim textSize As Long + Dim fontName As String + + userLCID = GetUserDefaultLangID() + langStr = GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME) + + If (langStr = "ja") Then + WriteDebug currentFunctionName & " : Setting font to MS PGothic for 'ja' locale" + fontName = "MS PGothic" + textSize = 10 + Else + fontName = "Arial" + textSize = CLEGEND_FONT_SIZE + End If + + 'DAW - PAW switches + If InDocPreparation Then + SaveAnalysisResultsVariables logWb, issueDetailsRow - (1 + CROWOFFSET), _ + refDetailsRow - (1 + CROWOFFSET) + + WriteOverview logWb, docCounts, templateCounts, macroClasses, issueClasses + + SetupPAWResultsSpreadsheet logWb, fontName, textSize + WriteIssueCounts logWb + Else + WriteOverview logWb, docCounts, templateCounts, macroClasses, issueClasses + + 'StartTiming + SetupDAWResultsSpreadsheet logWb, fontName, textSize + 'EndTiming "SetupDAWResultsSpreadsheet" + End If + + SetupPrintRanges logWb, row, issuesRow, issueDetailsRow, refDetailsRow + + If resultsFile <> "" Then + 'Overwrite existing results file without prompting + If bOverwriteResultsFile Or (Not bNewResultsFile) Then + xl.DisplayAlerts = False + End If + + logWb.SaveAs fileName:=storeToDir & "\" & resultsFile + xl.DisplayAlerts = True + End If + +FinalExit: + If Not xl Is Nothing Then + xl.Visible = True + End If + + Set wsOverview = Nothing + Set wsPgStats = Nothing + + If InDocPreparation Then + Set wsCosts = Nothing + Set wsIssues = Nothing + Set wsIssueDetails = Nothing + Set wsRefDetails = Nothing + End If + + If Not logWb Is Nothing Then logWb.Close + Set logWb = Nothing + + If getAppSpecificApplicationName <> CAPPNAME_EXCEL Then + If Not xl Is Nothing Then + If xl.Workbooks.count = 0 Then + xl.Quit + End If + End If + End If + Set xl = Nothing + + Exit Sub + +HandleErrors: + xl.DisplayAlerts = False + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Public Sub StartTiming() + mTstart = 0 + mTend = 0 + mTstart = GetTickCount() +End Sub +Public Sub EndTiming(what As String) + mTend = GetTickCount() + WriteDebug "Timing: " & what & ": " & (FormatNumber((mTend - mTstart) / 1000, 0) & " seconds") + mTstart = 0 + mTend = 0 +End Sub +Sub WriteIssueCounts(logWb As WorkBook) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteIssueCounts" + + Dim Str As String + Dim str1 As String + Dim val1 As Long + Dim count As Long + Dim vKeyArray As Variant + Dim vItemArray As Variant + Dim vPrepKeyArray As Variant + Dim vPrepItemArray As Variant + + vKeyArray = mIssuesDict.Keys + vItemArray = mIssuesDict.Items + + vPrepKeyArray = mPreparedIssuesDict.Keys + vPrepItemArray = mPreparedIssuesDict.Items + + 'Write Issue Counts across all Documents + For count = 0 To mIssuesDict.count - 1 + str1 = vKeyArray(count) + val1 = CInt(vItemArray(count)) + logWb.Names(str1).RefersToRange.Cells(1, 1) = _ + logWb.Names(str1).RefersToRange.Cells(1, 1).value + vItemArray(count) + 'DEBUG: str = str & "Key: " & str1 & " Value: " & val1 & vbLf + Next count + + 'Write Prepared Issues Counts across all Documents + For count = 0 To mPreparedIssuesDict.count - 1 + str1 = vPrepKeyArray(count) + val1 = CInt(vPrepItemArray(count)) + AddVariantToWorkbookNameValue logWb, str1, vPrepItemArray(count) + 'DEBUG: str = str & "Key: " & str1 & " Value: " & val1 & vbLf + Next count + + 'User Form control type count across all analyzed documents of this type + str1 = getAppSpecificApplicationName & "_" & _ + CSTR_ISSUE_VBA_MACROS & "_" & _ + CSTR_SUBISSUE_PROPERTIES & "_" & _ + CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROLTYPE_COUNT + SetWorkbookNameValueToLong logWb, str1, mUserFormTypesDict.count + + 'Add list of User Form controls and counts to ...USERFORMS_CONTROLTYPE_COUNT field + If mUserFormTypesDict.count > 0 Then + vKeyArray = mUserFormTypesDict.Keys + vItemArray = mUserFormTypesDict.Items + + Str = RID_STR_COMMON_ATTRIBUTE_CONTROLS & ": " + For count = 0 To mUserFormTypesDict.count - 1 + Str = Str & vbLf & vKeyArray(count) & " " & vItemArray(count) + Next count + WriteUserFromControlTypesComment logWb, str1, Str + End If + 'DEBUG: MsgBox str & vbLf & mIssuesDict.count + + WriteUniqueModuleCount logWb + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : logging costs : " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub WriteUniqueModuleCount(logWb As WorkBook) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteUniqueModuleCount" + + Dim strLabel As String + Dim uniqueLineCount As Long + Dim uniqueModuleCount As Long + Dim count As Long + Dim vItemArray As Variant + + vItemArray = mMacroDict.Items + + 'Write Issues Costs + uniqueLineCount = 0 + For count = 0 To mMacroDict.count - 1 + uniqueLineCount = uniqueLineCount + CInt(vItemArray(count)) + Next count + uniqueModuleCount = mMacroDict.count + + + strLabel = getAppSpecificApplicationName & "_" & _ + CSTR_ISSUE_VBA_MACROS & "_" & _ + CSTR_SUBISSUE_PROPERTIES & "_" & _ + CSTR_SUBISSUE_VBA_MACROS_UNIQUE_MODULE_COUNT + SetWorkbookNameValueToLong logWb, strLabel, uniqueModuleCount + + strLabel = getAppSpecificApplicationName & "_" & _ + CSTR_ISSUE_VBA_MACROS & "_" & _ + CSTR_SUBISSUE_PROPERTIES & "_" & _ + CSTR_SUBISSUE_VBA_MACROS_UNIQUE_LINE_COUNT + SetWorkbookNameValueToLong logWb, strLabel, uniqueLineCount + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : logging Unique Module/ Line Counts : " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteUserFromControlTypesComment(logWb As WorkBook, name As String, comment As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteUserFromControlTypesComment" + + On Error Resume Next 'Ignore error if trying to add comment again - would happen on append to results + logWb.Names(name).RefersToRange.Cells(1, 1).AddComment + + On Error GoTo HandleErrors + logWb.Names(name).RefersToRange.Cells(1, 1).comment.Text Text:=comment + 'Autosize not supported - Office 2000 + 'logWb.Names(name).RefersToRange.Cells(1, 1).comment.AutoSize = True + logWb.Names(name).RefersToRange.Cells(1, 1).comment.Visible = False + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : name : " & name & _ + " : comment : " & comment & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub UpdateAllCounts(aAnalysis As DocumentAnalysis, counts As DocumentCount, templateCounts As DocumentCount, _ + macroClasses As DocMacroClassifications, issueClasses As DocIssueClassifications, _ + fso As FileSystemObject) + Const CMODDATE_LESS3MONTHS = 91 + Const CMODDATE_LESS6MONTHS = 182 + Const CMODDATE_LESS12MONTHS = 365 + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "UpdateAllCounts" + 'DocIssue Classification occurs in setDocOverallIssueClassification under + ' ProcessIssuesAndWriteDocIssueDetails when all DocIssues are being traversed. + 'MacroClass for the Doc is setup at the end of the Analyze_Macros in DoAnalysis + 'Mod Dates are determined in SetDocProperties in DoAnalysis + + 'DocMacroClassifications + Select Case aAnalysis.MacroOverallClass + Case enMacroComplex + macroClasses.complex = macroClasses.complex + 1 + Case enMacroMedium + macroClasses.Medium = macroClasses.Medium + 1 + Case enMacroSimple + macroClasses.Simple = macroClasses.Simple + 1 + Case Else + macroClasses.None = macroClasses.None + 1 + End Select + + 'DocIssueClassifications + aAnalysis.BelowIssuesLimit = True + Select Case aAnalysis.DocOverallIssueClass + Case enComplex + issueClasses.complex = issueClasses.complex + 1 + Case enMinor + issueClasses.Minor = issueClasses.Minor + 1 + Case Else + issueClasses.None = issueClasses.None + 1 + End Select + + 'DocumentCounts + Dim extStr As String + extStr = "." & LCase(fso.GetExtensionName(aAnalysis.name)) + If extStr = getAppSpecificDocExt Then + UpdateDocCounts counts, aAnalysis + ElseIf extStr = getAppSpecificTemplateExt Then + UpdateDocCounts templateCounts, aAnalysis + Else + WriteDebug currentFunctionName & " : path " & aAnalysis.name & _ + ": unhandled file extesnion " & extStr & " : " & Err.Number & " " & Err.Description & " " & Err.Source + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub UpdateDocCounts(counts As DocumentCount, aAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "UpdateDocCounts" + + counts.numDocsAnalyzed = counts.numDocsAnalyzed + 1 + If aAnalysis.IssuesCount > 0 Then 'During Analysis incremented + counts.numDocsAnalyzedWithIssues = counts.numDocsAnalyzedWithIssues + 1 + + If aAnalysis.BelowIssuesLimit Then + counts.numMinorIssues = _ + counts.numMinorIssues + aAnalysis.MinorIssuesCount + 'MinorIssuesCount incemented as all DocIssues are being traversed are being written out - ProcessIssuesAndWriteDocIssueDetails + counts.numComplexIssues = counts.numComplexIssues + aAnalysis.ComplexIssuesCount 'Calculated + counts.totalDocIssuesCosts = counts.totalDocIssuesCosts + _ + aAnalysis.DocIssuesCosts + counts.totalPreparableIssuesCosts = counts.totalPreparableIssuesCosts + _ + aAnalysis.PreparableIssuesCosts + End If + + counts.numMacroIssues = counts.numMacroIssues + aAnalysis.MacroIssuesCount 'During Analysis incremented + counts.totalMacroCosts = counts.totalMacroCosts + aAnalysis.MacroCosts + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + + +Sub WriteDocProperties(wsPgStats As Worksheet, row As Long, aAnalysis As DocumentAnalysis, _ + fileName As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteDocProperties" + + Dim rowIndex As Long + rowIndex = row + mDocPropRowOffset + + If aAnalysis.Application = RID_STR_COMMON_CANNOT_OPEN Then + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name + + GoTo FinalExit + End If + + If InDocPreparation Then + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application + + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFODOCISSUECOSTS, aAnalysis.DocIssuesCosts + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOPREPARABLEISSUECOSTS, aAnalysis.PreparableIssuesCosts + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACROISSUECOSTS, aAnalysis.MacroCosts + + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOISSUE_CLASS, _ + getDocOverallIssueClassificationAsString(aAnalysis.DocOverallIssueClass) + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOCOMPLEXISSUES, aAnalysis.ComplexIssuesCount + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMINORISSUES, aAnalysis.MinorIssuesCount + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOPREPAREDISSUES, aAnalysis.PreparableIssuesCount + + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOMACRO_CLASS, _ + getDocOverallMacroClassAsString(aAnalysis.MacroOverallClass) + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACRO_USERFORMS, aAnalysis.MacroNumUserForms + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFOMACRO_LINESOFCODE, aAnalysis.MacroTotalNumLines + + SetWorksheetCellValueToLong wsPgStats, rowIndex, CDOCINFONUMBERPAGES, aAnalysis.PageCount + SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOCREATED, CheckDate(aAnalysis.Created) + SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTMODIFIED, CheckDate(aAnalysis.Modified) + SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTACCESSED, CheckDate(aAnalysis.Accessed) + SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTPRINTED, CheckDate(aAnalysis.Printed) + + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOLASTSAVEDBY, aAnalysis.SavedBy + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOREVISION, aAnalysis.Revision + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOTEMPLATE, aAnalysis.Template + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name + Else + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAME, fileName + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOAPPLICATION, aAnalysis.Application + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOISSUE_CLASS, _ + getDocOverallIssueClassificationAsString(aAnalysis.DocOverallIssueClass) + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFOMACRO_CLASS, _ + getDocOverallMacroClassAsString(aAnalysis.MacroOverallClass) + SetWorksheetCellValueToVariant wsPgStats, rowIndex, CDOCINFOLASTMODIFIED, CheckDate(aAnalysis.Modified) + SetWorksheetCellValueToString wsPgStats, rowIndex, CDOCINFONAMEANDPATH, aAnalysis.name + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Function CheckDate(myDate As Date) As Variant + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckDate" + + Dim lowerNTDateLimit As Date + If Not IsDate(myDate) Then + CheckDate = RID_STR_COMMON_NA + Exit Function + End If + + lowerNTDateLimit = DateSerial(1980, 1, 1) + CheckDate = IIf(myDate < lowerNTDateLimit, RID_STR_COMMON_NA, myDate) +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : date " & myDate & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function WriteDocIssues(wsIssues As Worksheet, row As Long, _ + aAnalysis As DocumentAnalysis, fileName As String) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteDocIssues" + + Const CNAME = 1 + Const CAPPLICATION = CNAME + 1 + Const CISSUE_COLUMNOFFSET = CAPPLICATION + + If aAnalysis.IssuesCount = 0 Then + WriteDocIssues = row + Exit Function + End If + SetWorksheetCellValueToString wsIssues, row, CNAME, fileName + SetWorksheetCellValueToString wsIssues, row, CAPPLICATION, aAnalysis.Application + + Dim index As Integer + For index = 1 To aAnalysis.TotalIssueTypes + If aAnalysis.IssuesCountArray(index) > 0 Then + SetWorksheetCellValueToString wsIssues, row, CISSUE_COLUMNOFFSET + index, aAnalysis.IssuesCountArray(index) + End If + Next index + SetWorksheetCellValueToString wsIssues, row, CISSUE_COLUMNOFFSET + aAnalysis.TotalIssueTypes + 1, aAnalysis.name + + WriteDocIssues = row + 1 +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Sub ProcessIssuesForDAW(logWb As WorkBook, aAnalysis As DocumentAnalysis, fileName As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "ProcessIssuesForDAW" + + Dim myIssue As IssueInfo + Dim issueClass As EnumDocOverallIssueClass + + Dim index As Integer + For index = 1 To aAnalysis.Issues.count + Set myIssue = aAnalysis.Issues(index) + + If Not isMacroIssue(myIssue) Then + issueClass = getDocIssueClassification(logWb, myIssue) + CountDocIssuesForDoc issueClass, aAnalysis + SetOverallDocIssueClassification issueClass, aAnalysis + End If + + Set myIssue = Nothing + Next index + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Function ProcessIssuesAndWriteDocIssueDetails(logWb As WorkBook, wsIssueDetails As Worksheet, DetailsRow As Long, _ + aAnalysis As DocumentAnalysis, fileName As String) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "ProcessIssueAndWriteDocIssueDetails" + + Dim myIssue As IssueInfo + Dim rowIndex As Long + Dim issueClass As EnumDocOverallIssueClass + Dim issueCost As Long + + rowIndex = DetailsRow + + Dim index As Integer + For index = 1 To aAnalysis.Issues.count + Set myIssue = aAnalysis.Issues(index) + + ' Process Document Issues and Costs for the Document + ' Will be output to List of Documents sheet by WriteDocProperties( ) + If Not isMacroIssue(myIssue) Then + issueClass = getDocIssueClassification(logWb, myIssue) + CountDocIssuesForDoc issueClass, aAnalysis + SetOverallDocIssueClassification issueClass, aAnalysis + issueCost = getDocIssueCost(logWb, aAnalysis, myIssue) + aAnalysis.DocIssuesCosts = aAnalysis.DocIssuesCosts + issueCost + If myIssue.Preparable Then + aAnalysis.PreparableIssuesCosts = aAnalysis.PreparableIssuesCosts + issueCost + End If + End If + + 'Collate Issue and Factor counts across all Documents + 'Will be output to the Issues Analyzed sheet by WriteIssueCounts( ) + CollateIssueAndFactorCountsAcrossAllDocs aAnalysis, myIssue, fileName + + OutputCommonIssueDetails wsIssueDetails, rowIndex, aAnalysis, myIssue, fileName + OutputCommonIssueAttributes wsIssueDetails, rowIndex, myIssue + rowIndex = rowIndex + 1 + Set myIssue = Nothing + Next index + + ProcessIssuesAndWriteDocIssueDetails = rowIndex + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function getDocIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis, myIssue As IssueInfo) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "getDocIssueCost" + + Dim issueKey As String + Dim ret As Long + ret = 0 + + issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML + + ret = getIssueValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, issueKey, 1, CCOST_COL_OFFSET) + +FinalExit: + getDocIssueCost = ret + Exit Function + +HandleErrors: + ret = 0 + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Function getMacroIssueCosts(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long + 'Error handling not required + getMacroIssueCosts = getVBAMacroIssueCost(logWb, aAnalysis) '+ getMacroExtRefIssueCost(logWb, aAnalysis) + 'NOTE: Currently not counting External Refs as Macro Cost + 'could be added if porting off Windows + +End Function + +Function getVBAMacroIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long + Const CMACRO_ROW_OFFSET_UNIQUE_LINES_COST = 4 + Const CMACRO_ROW_OFFSET_USER_FORMS_COUNT_COST = 5 + Const CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_COUNT_COST = 6 + Const CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_TYPE_COUNT_COST = 7 + + Const CMACRO_NUM_OF_LINES_FACTOR_KEY = "_UniqueLineCount" + Const CMACRO_USER_FORMS_COUNT_FACTOR_KEY = "_UserFormsCount" + Const CMACRO_USER_FORMS_CONTROL_COUNT_FACTOR_KEY = "_UserFormsControlCount" + Const CMACRO_USER_FORMS_CONTROL_TYPE_COUNT_FACTOR_KEY = "_UserFormsControlTypeCount" + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "getVBAMacroIssueCost" + + Dim baseIssueKey As String + Dim ret As Long + ret = 0 + + If Not aAnalysis.HasMacros Then GoTo FinalExit + + 'Fetch VBA Macro Cost Factors - if required + baseIssueKey = getAppSpecificApplicationName & "_" & CSTR_ISSUE_VBA_MACROS & "_" & CSTR_SUBISSUE_PROPERTIES + + 'Num Lines - Costing taken from "Lines in Unique Modules" + If aAnalysis.MacroTotalNumLines > 0 Then + ret = ret + aAnalysis.MacroTotalNumLines * _ + getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _ + baseIssueKey & CMACRO_NUM_OF_LINES_FACTOR_KEY, baseIssueKey, _ + CMACRO_ROW_OFFSET_UNIQUE_LINES_COST, CCOST_COL_OFFSET) + End If + 'User Forms Count + If aAnalysis.MacroNumUserForms > 0 Then + ret = ret + aAnalysis.MacroNumUserForms * _ + getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _ + baseIssueKey & CMACRO_USER_FORMS_COUNT_FACTOR_KEY, baseIssueKey, _ + CMACRO_ROW_OFFSET_USER_FORMS_COUNT_COST, CCOST_COL_OFFSET) + End If + 'User Forms Control Count + If aAnalysis.MacroNumUserFormControls > 0 Then + ret = ret + aAnalysis.MacroNumUserFormControls * _ + getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _ + baseIssueKey & CMACRO_USER_FORMS_CONTROL_COUNT_FACTOR_KEY, baseIssueKey, _ + CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_COUNT_COST, CCOST_COL_OFFSET) + End If + 'User Forms Control Type Count + If aAnalysis.MacroNumUserFormControlTypes > 0 Then + ret = ret + aAnalysis.MacroNumUserFormControlTypes * getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _ + baseIssueKey & CMACRO_USER_FORMS_CONTROL_TYPE_COUNT_FACTOR_KEY, baseIssueKey, CMACRO_ROW_OFFSET_USER_FORMS_CONTROL_TYPE_COUNT_COST, CCOST_COL_OFFSET) + End If + + +FinalExit: + getVBAMacroIssueCost = ret + Exit Function + +HandleErrors: + ret = 0 + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Function getMacroExtRefIssueCost(logWb As WorkBook, aAnalysis As DocumentAnalysis) As Long + Const CMACRO_ROW_OFFSET_NUM_EXTERNAL_REFS_COST = 2 + Const CMACRO_NUM_EXTERNAL_REFS_FACTOR_KEY = "_ExternalRefs" + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "getMacroExtRefIssueCost" + Dim baseIssueKey As String + Dim ret As Long + ret = 0 + + If aAnalysis.MacroNumExternalRefs <= 0 Then GoTo FinalExit + + 'Fetch External Ref Cost Factors + baseIssueKey = getAppSpecificApplicationName & "_" & CSTR_ISSUE_PORTABILITY & "_" & _ + CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO + ret = ret + aAnalysis.MacroNumExternalRefs * _ + getValueFromXLSorDict(logWb, aAnalysis, mIssuesCostDict, _ + baseIssueKey & CMACRO_NUM_EXTERNAL_REFS_FACTOR_KEY, baseIssueKey, _ + CMACRO_ROW_OFFSET_NUM_EXTERNAL_REFS_COST, CCOST_COL_OFFSET) + +FinalExit: + getMacroExtRefIssueCost = ret + Exit Function + +HandleErrors: + ret = 0 + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Function getIssueValueFromXLSorDict(logWb As WorkBook, aAnalysis As DocumentAnalysis, dict As Scripting.Dictionary, _ + key As String, row As Long, column As Long) As Long + 'Error handling not required + getIssueValueFromXLSorDict = getValueFromXLSorDict(logWb, aAnalysis, dict, key, key, row, column) +End Function + +Function getValueFromXLSorDict(logWb As WorkBook, aAnalysis As DocumentAnalysis, dict As Scripting.Dictionary, _ + dictKey As String, xlsKey As String, row As Long, column As Long) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "getValueFromXLSorDict" + + Dim ret As Long + ret = 0 + + If dict.Exists(dictKey) Then + ret = dict.item(dictKey) + Else + On Error Resume Next + ret = logWb.Names(xlsKey).RefersToRange.Cells(row, column).value + 'Log as error missing key + If Err.Number <> 0 Then + WriteDebug currentFunctionName & _ + " : Issue Cost Key - " & xlsKey & ": label missing from results.xlt Costs sheet, check sheet and add/ check spelling label" & Err.Number & " " & Err.Description & " " & Err.Source + WriteDebug currentFunctionName & " : dictKey " & dictKey & " : xlsKey " & xlsKey & " : " & Err.Number & " " & Err.Description & " " & Err.Source + ret = 0 + End If + On Error GoTo HandleErrors + dict.Add dictKey, ret + End If + +FinalExit: + getValueFromXLSorDict = ret + Exit Function + +HandleErrors: + ret = 0 + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Function isMacroIssue(myIssue As IssueInfo) + 'Error handling not required + isMacroIssue = False + + If myIssue.IssueTypeXML = CSTR_ISSUE_VBA_MACROS Or _ + (myIssue.IssueTypeXML = CSTR_ISSUE_PORTABILITY And _ + myIssue.SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO) Then + isMacroIssue = True + End If +End Function +Sub CountDocIssuesForDoc(issueClass As EnumDocOverallIssueClass, aAnalysis As DocumentAnalysis) + 'Error handling not required + + If issueClass = enMinor Then + aAnalysis.MinorIssuesCount = aAnalysis.MinorIssuesCount + 1 + End If + ' Macro issues are counted during analysis + ' Complex issues is calculated from: mIssues.count - mMinorIssuesCount - mMacroIssuesCount +End Sub +Sub SetOverallDocIssueClassification(issueClass As EnumDocOverallIssueClass, aAnalysis As DocumentAnalysis) + 'Error handling not required + + If aAnalysis.DocOverallIssueClass = enComplex Then Exit Sub + + If issueClass = enComplex Then + aAnalysis.DocOverallIssueClass = enComplex + Else + aAnalysis.DocOverallIssueClass = enMinor + End If +End Sub +Function getDocIssueClassification(logWb As WorkBook, myIssue As IssueInfo) As EnumDocOverallIssueClass + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "getDocIssueClassification" + Dim issueKey As String + Dim bRet As Boolean + bRet = False + getDocIssueClassification = enMinor + + issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML + If mIssuesClassificationDict.Exists(issueKey) Then + bRet = mIssuesClassificationDict.item(issueKey) + Else + On Error Resume Next + bRet = logWb.Names(issueKey).RefersToRange.Cells(1, 0).value + 'Log as error missing key + If Err.Number <> 0 Then + WriteDebug currentFunctionName & _ + " : Issue Cost Key - " & issueKey & ": label missing from results.xlt Costs sheet, check sheet and add/ check spelling label" & Err.Number & " " & Err.Description & " " & Err.Source + bRet = False + End If + On Error GoTo HandleErrors + mIssuesClassificationDict.Add issueKey, bRet + End If + + +FinalExit: + If bRet Then + getDocIssueClassification = enComplex + End If + Exit Function + +HandleErrors: + bRet = False + WriteDebug currentFunctionName & " : issueKey " & issueKey & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function getDocOverallIssueClassificationAsString(docIssueClass As EnumDocOverallIssueClass) As String + Dim Str As String + 'Error handling not required + + Select Case docIssueClass + Case enComplex + Str = RID_STR_COMMON_ISSUE_CLASS_COMPLEX + Case enMinor + Str = RID_STR_COMMON_ISSUE_CLASS_MINOR + Case Else + Str = RID_STR_COMMON_ISSUE_CLASS_NONE + End Select + + getDocOverallIssueClassificationAsString = Str +End Function + +Public Function getDocOverallMacroClassAsString(docMacroClass As EnumDocOverallMacroClass) As String + Dim Str As String + 'Error handling not required + + Select Case docMacroClass + Case enMacroComplex + Str = RID_STR_COMMON_MACRO_CLASS_COMPLEX + Case enMacroMedium + Str = RID_STR_COMMON_MACRO_CLASS_MEDIUM + Case enMacroSimple + Str = RID_STR_COMMON_MACRO_CLASS_SIMPLE + Case Else + Str = RID_STR_COMMON_MACRO_CLASS_NONE + End Select + + getDocOverallMacroClassAsString = Str +End Function + +Function WriteDocRefDetails(wsRefDetails As Worksheet, DetailsRow As Long, _ + aAnalysis As DocumentAnalysis, fileName As String) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteDocRefDetails" + + Dim myIssue As IssueInfo + Dim rowIndex As Long + rowIndex = DetailsRow + + Dim index As Integer + + 'Output References for Docs with Macros + If aAnalysis.HasMacros And (aAnalysis.References.count > 0) Then + For index = 1 To aAnalysis.References.count + Set myIssue = aAnalysis.References(index) + OutputReferenceAttributes wsRefDetails, rowIndex, aAnalysis, myIssue, fileName + rowIndex = rowIndex + 1 + Set myIssue = Nothing + Next index + End If + + WriteDocRefDetails = rowIndex + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & _ + " : path " & aAnalysis.name & ": " & _ + " : row " & DetailsRow & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Sub OutputReferenceAttributes(wsIssueDetails As Worksheet, rowIndex As Long, _ + aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputReferenceAttributes" + + Dim strAttributes As String + + With myIssue + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDOCNAME, fileName + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDOCAPPLICATION, aAnalysis.Application + + strAttributes = .Values(RID_STR_COMMON_ATTRIBUTE_MAJOR) & "." & .Values(RID_STR_COMMON_ATTRIBUTE_MINOR) + strAttributes = IIf(strAttributes = "0.0" Or strAttributes = ".", .Values(RID_STR_COMMON_ATTRIBUTE_NAME), _ + .Values(RID_STR_COMMON_ATTRIBUTE_NAME) & " " & .Values(RID_STR_COMMON_ATTRIBUTE_MAJOR) & _ + "." & .Values(RID_STR_COMMON_ATTRIBUTE_MINOR)) + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETREFERENCE, strAttributes + + If .Values(RID_STR_COMMON_ATTRIBUTE_TYPE) = RID_STR_COMMON_ATTRIBUTE_PROJECT Then + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDESCRIPTION, RID_STR_COMMON_ATTRIBUTE_PROJECT + Else + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETDESCRIPTION, _ + IIf(.Values(RID_STR_COMMON_ATTRIBUTE_DESCRIPTION) <> "", .Values(RID_STR_COMMON_ATTRIBUTE_DESCRIPTION), RID_STR_COMMON_NA) + End If + + + If .Values(RID_STR_COMMON_ATTRIBUTE_ISBROKEN) <> RID_STR_COMMON_ATTRIBUTE_BROKEN Then + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETLOCATION, _ + .Values(RID_STR_COMMON_ATTRIBUTE_FILE) + Else + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETLOCATION, _ + RID_STR_COMMON_NA + End If + + 'Reference Details + strAttributes = RID_STR_COMMON_ATTRIBUTE_TYPE & ": " & .Values(RID_STR_COMMON_ATTRIBUTE_TYPE) & vbLf + strAttributes = strAttributes & RID_STR_COMMON_ATTRIBUTE_PROPERTIES & ": " & _ + .Values(RID_STR_COMMON_ATTRIBUTE_BUILTIN) & " " & .Values(RID_STR_COMMON_ATTRIBUTE_ISBROKEN) + strAttributes = IIf(.Values(RID_STR_COMMON_ATTRIBUTE_GUID) <> "", _ + strAttributes & vbLf & RID_STR_COMMON_ATTRIBUTE_GUID & ": " & .Values(RID_STR_COMMON_ATTRIBUTE_GUID), _ + strAttributes) + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETATTRIBUTES, strAttributes + + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CREF_DETNAMEANDPATH, aAnalysis.name + End With +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : path " & aAnalysis.name & ": " & _ + " : rowIndex " & rowIndex & ": " & _ + " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub OutputCommonIssueAttributes(wsIssueDetails As Worksheet, rowIndex As Long, _ + myIssue As IssueInfo) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputCommonIssueAttributes" + + Dim index As Integer + Dim strAttributes As String + + strAttributes = "" + For index = 1 To myIssue.Attributes.count + strAttributes = strAttributes & myIssue.Attributes(index) & " - " & _ + myIssue.Values(index) + strAttributes = strAttributes & IIf(index <> myIssue.Attributes.count, vbLf, "") + + Next index + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETATTRIBUTES, strAttributes + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : rowIndex " & rowIndex & ": " & _ + " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +'Store issue cost and factor costs across all documents +Sub CollateIssueAndFactorCountsAcrossAllDocs(aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String) + Const CSTR_USER_FORM = "User Form" + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CollateIssueAndFactorCountsAcrossAllDocs" + + 'Don't want to cost ISSUE_INFORMATION issues + If myIssue.IssueTypeXML = CSTR_ISSUE_INFORMATION Then Exit Sub + + Dim issueKey As String + issueKey = getAppSpecificApplicationName & "_" & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML + + 'Store costing metrics for Issue + AddIssueAndOneToDict issueKey + + 'Store prepeared issue for costing metrics + If myIssue.Preparable Then + AddPreparedIssueAndOneToDict issueKey & "_Prepared" + End If + + 'Additional costing Factors output for VB macros + If (myIssue.IssueTypeXML = CSTR_ISSUE_VBA_MACROS) And _ + (myIssue.SubTypeXML <> CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION) Then + + 'Unique Macro Module and Line count + AddMacroModuleHashToMacroDict myIssue + + 'Line count + AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_NUMLINES, myIssue, _ + RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES + + 'User From info + If myIssue.SubLocation = CSTR_USER_FORM Then + AddIssueAndOneToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_USERFORMS_COUNT + + AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROL_COUNT, myIssue, _ + RID_STR_COMMON_ATTRIBUTE_CONTROLS + End If + 'Additional costing Factors output for External References + ElseIf (myIssue.IssueTypeXML = CSTR_ISSUE_PORTABILITY And _ + myIssue.SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO) Then + + AddIssueAndValToDict issueKey & "_" & CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO_COUNT, myIssue, _ + RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : path " & aAnalysis.name & ": " & _ + " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub OutputCommonIssueDetails(wsIssueDetails As Worksheet, rowIndex As Long, _ + aAnalysis As DocumentAnalysis, myIssue As IssueInfo, fileName As String) + Const CSTR_USER_FORM = "User Form" + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputCommonIssueDetails" + + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETDOCNAME, fileName + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETDOCAPPLICATION, aAnalysis.Application + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETTYPE, myIssue.IssueType + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETSUBTYPE, myIssue.SubType + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETLOCATION, myIssue.Location + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETSUBLOCATION, _ + IIf(myIssue.SubLocation = "", RID_STR_COMMON_NA, myIssue.SubLocation) + SetWorksheetCellValueToVariant wsIssueDetails, rowIndex, CISSUE_DETLINE, _ + IIf(myIssue.Line = -1, RID_STR_COMMON_NA, myIssue.Line) + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETCOLUMN, _ + IIf(myIssue.column = "", RID_STR_COMMON_NA, myIssue.column) + SetWorksheetCellValueToString wsIssueDetails, rowIndex, CISSUE_DETNAMEANDPATH, aAnalysis.name + + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : path " & aAnalysis.name & ": " & _ + " : rowIndex " & rowIndex & ": " & _ + " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub AddIssueAndBoolValToDict(issueKey As String, issue As IssueInfo, valKey As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddIssueAndBoolValToDict" + + If mIssuesDict.Exists(issueKey) Then + mIssuesDict.item(issueKey) = mIssuesDict.item(issueKey) + _ + IIf(issue.Values(valKey) > 0, 1, 0) + Else + mIssuesDict.Add issueKey, IIf(issue.Values(valKey) > 0, 1, 0) + End If +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : issueKey " & issueKey & ": " & _ + " : valKey " & valKey & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub AddIssueAndValToDict(issueKey As String, issue As IssueInfo, valKey As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddIssueAndValToDict" + + If mIssuesDict.Exists(issueKey) Then + mIssuesDict.item(issueKey) = mIssuesDict.item(issueKey) + issue.Values(valKey) + Else + mIssuesDict.Add issueKey, issue.Values(valKey) + End If +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : issueKey " & issueKey & ": " & _ + " : valKey " & valKey & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub AddMacroModuleHashToMacroDict(issue As IssueInfo) + On Error GoTo HandleErrors + Dim currentFunctionName As String + Dim issueKey As String + Dim issueVal As String + currentFunctionName = "AddMacroModuleHashToMacroDict" + + issueKey = issue.Values(RID_STR_COMMON_ATTRIBUTE_SIGNATURE) + If issueKey = RID_STR_COMMON_NA Then Exit Sub + + If Not mMacroDict.Exists(issueKey) Then + mMacroDict.Add issueKey, issue.Values(RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES) + End If +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : issueKey " & issueKey & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub AddIssueAndOneToDict(key As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddIssueAndOneToDict" + + If mIssuesDict.Exists(key) Then + mIssuesDict.item(key) = mIssuesDict.item(key) + 1 + Else + mIssuesDict.Add key, 1 + End If +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : key " & key & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub AddPreparedIssueAndOneToDict(key As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddPreparedIssueAndOneToDict" + + If mPreparedIssuesDict.Exists(key) Then + mPreparedIssuesDict.item(key) = mPreparedIssuesDict.item(key) + 1 + Else + mPreparedIssuesDict.Add key, 1 + End If +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : key " & key & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Function GetExcelInstance() As Excel.Application + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetExcelInstance" + + Dim xl As Excel.Application + On Error Resume Next + 'Try and get an existing instance + Set xl = GetObject(, "Excel.Application") + If Err.Number = 429 Then + Set xl = CreateObject("Excel.Application") + ElseIf Err.Number <> 0 Then + Set xl = Nothing + MsgBox "Error: " & Err.Description + Exit Function + End If + Set GetExcelInstance = xl + Set xl = Nothing +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub WriteOverview(logWb As WorkBook, DocCount As DocumentCount, templateCount As DocumentCount, _ + macroClasses As DocMacroClassifications, issueClasses As DocIssueClassifications) + Const COV_ISSUECLASS_COMPLEX = "MAW_ISSUECLASS_COMPLEX" + Const COV_ISSUECLASS_MINOR = "MAW_ISSUECLASS_MINOR" + Const COV_ISSUECLASS_NONE = "MAW_ISSUECLASS_NONE" + + Const COV_MACROCLASS_COMPLEX = "MAW_MACROCLASS_COMPLEX" + Const COV_MACROCLASS_MEDIUM = "MAW_MACROCLASS_MEDIUM" + Const COV_MACROCLASS_SIMPLE = "MAW_MACROCLASS_SIMPLE" + Const COV_MACROCLASS_NONE = "MAW_MACROCLASS_NONE" + + Const COV_ISSUECOUNT_COMPLEX = "MAW_ISSUECOUNT_COMPLEX" + Const COV_ISSUECOUNT_MINOR = "MAW_ISSUECOUNT_MINOR" + + Const COV_MODDATES_LESS3MONTHS = "MAW_MODDATES_LESS3MONTHS" + Const COV_MODDATES_3TO6MONTHS = "MAW_MODDATES_3TO6MONTHS" + Const COV_MODDATES_6TO12MONTHS = "MAW_MODDATES_6TO12MONTHS" + Const COV_MODDATES_MORE12MONTHS = "MAW_MODDATES_MORE12MONTHS" + + Const COV_DOC_MIGRATION_COSTS = "Document_Migration_Costs" + Const COV_DOC_PREPARABLE_COSTS = "Document_Migration_Preparable_Costs" + Const COV_MACRO_MIGRATION_COSTS = "Macro_Migration_Costs" + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteOverview" + + Dim appName As String + appName = getAppSpecificApplicationName + + 'OV - Title + SetWorkbookNameValueToString logWb, COVERVIEW_TITLE_LABEL, GetTitle + SetWorkbookNameValueToVariant logWb, "AnalysisDate", Now + SetWorkbookNameValueToString logWb, "AnalysisVersion", _ + RID_STR_COMMON_OV_VERSION_STR & ": " & GetTitle & " " & GetVersion + + 'OV - Number of Documents Analyzed + AddLongToWorkbookNameValue logWb, CNUMBERDOC_ALL & getAppSpecificDocExt, DocCount.numDocsAnalyzed + AddLongToWorkbookNameValue logWb, CNUMBERDOC_ALL & getAppSpecificTemplateExt, templateCount.numDocsAnalyzed + + 'OV - Documents with Document Migration Issues (excludes macro issues) + AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_COMPLEX, issueClasses.complex + AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_MINOR, issueClasses.Minor + AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECLASS_NONE, issueClasses.None + + 'OV - Documents with Macro Migration Issues + AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_COMPLEX, macroClasses.complex + AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_MEDIUM, macroClasses.Medium + AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_SIMPLE, macroClasses.Simple + AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACROCLASS_NONE, macroClasses.None + + 'OV - Document Modification Dates + Dim modDates As DocModificationDates + Call GetDocModificationDates(modDates) + + SetWorkbookNameValueToLong logWb, COV_MODDATES_LESS3MONTHS, modDates.lessThanThreemonths + SetWorkbookNameValueToLong logWb, COV_MODDATES_3TO6MONTHS, modDates.threeToSixmonths + SetWorkbookNameValueToLong logWb, COV_MODDATES_6TO12MONTHS, modDates.sixToTwelvemonths + SetWorkbookNameValueToLong logWb, COV_MODDATES_MORE12MONTHS, modDates.greaterThanOneYear + + + If InDocPreparation Then + 'OV - Document Migration Issues(excludes macro issues) + AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECOUNT_COMPLEX, _ + DocCount.numComplexIssues + templateCount.numComplexIssues + AddLongToWorkbookNameValue logWb, appName & "_" & COV_ISSUECOUNT_MINOR, _ + DocCount.numMinorIssues + templateCount.numMinorIssues + + 'OV - Document Migration Costs + AddLongToWorkbookNameValue logWb, appName & "_" & COV_DOC_MIGRATION_COSTS, _ + DocCount.totalDocIssuesCosts + templateCount.totalDocIssuesCosts + + 'OV - Document Migration Preparable Costs + AddLongToWorkbookNameValue logWb, COV_DOC_PREPARABLE_COSTS, _ + DocCount.totalPreparableIssuesCosts + templateCount.totalPreparableIssuesCosts + + 'OV - Macro Migration Costs + AddLongToWorkbookNameValue logWb, appName & "_" & COV_MACRO_MIGRATION_COSTS, _ + DocCount.totalMacroCosts + templateCount.totalMacroCosts + End If + + 'OV - Internal Attributes + AddLongToWorkbookNameValue logWb, appName & "_" & "TotalDocsAnalysedWithIssues", _ + DocCount.numDocsAnalyzedWithIssues + templateCount.numDocsAnalyzedWithIssues + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : Problem writing overview: " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupDAWResultsSpreadsheet(logWb As WorkBook, fontName As String, fontSize As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupDAWResultsSpreadsheet" + Dim bSetupRun As Boolean + bSetupRun = CBool(GetWorkbookNameValueAsLong(logWb, COV_DAW_SETUP_SHEETS_RUN_LBL)) + + If bSetupRun Then Exit Sub + + 'Setup Text Boxes + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_COMMENT_TXB, _ + RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_COMMENT_BODY, _ + CCOMMENTS_FONT_SIZE, fontName + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_LEGEND_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY, fontSize, fontName + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_COMMENT_TXB, _ + RID_STR_COMMON_OV_DOC_MACRO_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_MACRO_COMMENT_BODY, _ + CCOMMENTS_FONT_SIZE, fontName + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_LEGEND_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY, fontSize, fontName + Dim monthLimit As Long + monthLimit = GetIssuesLimitInDays / CNUMDAYS_IN_MONTH + SetWorkbookNameValueToString logWb, COV_HIGH_LEVEL_ANALYSIS_LBL, _ + IIf(monthLimit <> CMAX_LIMIT, _ + ReplaceTopicTokens(RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_DAW, CR_TOPIC, CStr(monthLimit)), _ + RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT) + + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_COMMENT_TXB, _ + RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_COMMENT_BODY, _ + CCOMMENTS_FONT_SIZE, fontName + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_LEGEND_DAW_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_DAW_LEGEND_BODY, fontSize, fontName + + 'Setup Chart Titles + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_CHART, _ + RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_CHART, _ + RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_CHART, _ + RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE + + 'Set selection to top cell of Overview + logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW).Range("A1").Select + + bSetupRun = True + SetWorkbookNameValueToBoolean logWb, COV_DAW_SETUP_SHEETS_RUN_LBL, bSetupRun +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : Problem setting up spreadsheet for DAW: " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupPAWResultsSpreadsheet(logWb As WorkBook, fontName As String, fontSize As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupPAWResultsSpreadsheet" + Dim bSetupRun As Boolean + bSetupRun = CBool(GetWorkbookNameValueAsLong(logWb, COV_PAW_SETUP_SHEETS_RUN_LBL)) + + If bSetupRun Then Exit Sub + + 'Costs + logWb.Names(COV_COSTS_PREPISSUE_COUNT_COL_LBL).RefersToRange.EntireColumn.Hidden = False + + 'Setup Text Boxes + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_LEGEND_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MOD_DATES_LEGEND_BODY, fontSize, fontName + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_LEGEND_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_MACRO_LEGEND_BODY, fontSize, fontName + SetWorkbookNameValueToString logWb, COV_HIGH_LEVEL_ANALYSIS_LBL, _ + RID_STR_COMMON_OV_HIGH_LEVEL_ANALYSIS_PAW_NO_LIMIT + SetupSheetTextBox logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_LEGEND_PAW_TXB, _ + RID_STR_COMMON_OV_LEGEND_TITLE, RID_STR_COMMON_OV_DOC_ANALYSIS_PAW_LEGEND_BODY, fontSize, fontName + + 'Setup Chart Titles + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MOD_DATES_CHART, _ + RID_STR_COMMON_OV_DOC_MOD_DATES_CHART_TITLE + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_MACRO_CHART, _ + RID_STR_COMMON_OV_DOC_MACRO_CHART_TITLE + SetupSheetChartTitles logWb, RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW, COV_DOC_ANALYSIS_CHART, _ + RID_STR_COMMON_OV_DOC_ANALYSIS_CHART_TITLE + + 'Set selection to top cell of Overview + logWb.Sheets(RID_STR_COMMON_RESULTS_SHEET_NAME_OVERVIEW).Range("A1").Select + + bSetupRun = True + SetWorkbookNameValueToBoolean logWb, COV_PAW_SETUP_SHEETS_RUN_LBL, bSetupRun + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : Problem setting up spreadsheet for PAW: " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupPrintRanges(logWb As WorkBook, docPropRow As Long, appIssuesRow As Long, issueDetailsRow As Long, _ + refDetailsRow As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupPrintRanges" + + 'Set Print Ranges + If InDocPreparation Then + + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP).PageSetup.PrintArea = "$A1:$U" & (docPropRow + mDocPropRowOffset) + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUE_DETAILS).PageSetup.PrintArea = "$A1:$J" & issueDetailsRow + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCREF_DETAILS).PageSetup.PrintArea = "$A1:$G" & refDetailsRow + If getAppSpecificApplicationName = CAPPNAME_WORD Then + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_WORD).PageSetup.PrintArea = _ + "$A1:$N" & appIssuesRow + ElseIf getAppSpecificApplicationName = CAPPNAME_EXCEL Then + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_EXCEL).PageSetup.PrintArea = _ + "$A1:$M" & appIssuesRow + Else + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCISSUES_POWERPOINT).PageSetup.PrintArea = _ + "$A1:$K" & appIssuesRow + End If + Else + logWb.Worksheets(RID_STR_COMMON_RESULTS_SHEET_NAME_DOCPROP).PageSetup.PrintArea = "$A1:$U" & (docPropRow + mDocPropRowOffset) + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : Problem setting print ranges: " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupSheetChartTitles(logWb As WorkBook, namedWorksheet As String, namedChart As String, _ + chartTitle As String) + Const CCHART_TITLE_FONT_SIZE = 11 + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupSheetChartTitles" + + With logWb.Sheets(namedWorksheet).ChartObjects(namedChart).Chart + .HasTitle = True + .chartTitle.Characters.Text = chartTitle + .chartTitle.Font.Size = CCHART_TITLE_FONT_SIZE + End With + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " namedWorkSheet: " & namedWorksheet & _ + " namedChart: " & namedChart & _ + " chartTitle: " & chartTitle & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupSheetTextBox(logWb As WorkBook, namedWorksheet As String, _ + textBoxName As String, textBoxTitle As String, textBoxBody As String, _ + textSize As Long, fontName As String) + + Const CMAX_INSERTABLE_STRING_LEN = 255 + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupSheetTextBox" + + Dim strTextBody As String + Dim allText As String + strTextBody = ReplaceTopic2Tokens(textBoxBody, CR_STR, Chr(10), CR_PRODUCT, RID_STR_COMMON_OV_PRODUCT_STR) + + 'Setup Text Boxes + logWb.Sheets(namedWorksheet).Activate + logWb.Sheets(namedWorksheet).Shapes(textBoxName).Select + + '*** Workaround Excel bug: 213841 XL: Passed Strings Longer Than 255 Characters Are Truncated + Dim I As Long + logWb.Application.Selection.Text = "" + + logWb.Application.Selection.Characters.Text = textBoxTitle & Chr(10) + + With logWb.Application.Selection + For I = 0 To Int(Len(strTextBody) / CMAX_INSERTABLE_STRING_LEN) + .Characters(.Characters.count + 1).Text = Mid(strTextBody, _ + (I * CMAX_INSERTABLE_STRING_LEN) + 1, CMAX_INSERTABLE_STRING_LEN) + Next + End With + + 'Highlight title only + With logWb.Application.Selection.Characters(start:=1, Length:=Len(textBoxTitle)).Font + .name = fontName + .FontStyle = "Bold" + .Size = textSize + End With + With logWb.Application.Selection.Characters(start:=Len(textBoxTitle) + 1, _ + Length:=Len(strTextBody) + 1).Font + .name = fontName + .FontStyle = "Regular" + .Size = textSize + End With + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " namedWorkSheet: " & namedWorksheet & _ + " textBoxName: " & textBoxName & _ + " textBoxTitle: " & textBoxTitle & _ + " textBoxBody: " & textBoxBody & _ + " textSize: " & textSize & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Function GetWorkbookNameValueAsLong(logWb As WorkBook, name As String) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetWorkbookNameValueAsLong" + + GetWorkbookNameValueAsLong = logWb.Names(name).RefersToRange.Cells(1, 1).value + +FinalExit: + Exit Function + +HandleErrors: + GetWorkbookNameValueAsLong = 0 + WriteDebug currentFunctionName & " : name " & name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetWorksheetCellValueAsLong(logWs As Worksheet, row As Long, col As Long) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetWorksheetCellValueAsLong" + + GetWorksheetCellValueAsLong = logWs.Cells(row, col).value + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetWorksheetCellValueAsString(logWs As Worksheet, row As Long, col As Long) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetWorksheetCellValueToString" + + GetWorksheetCellValueAsString = logWs.Cells(row, col).value + +FinalExit: + Exit Function + +HandleErrors: + GetWorksheetCellValueAsString = "" + + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub SetWorksheetCellValueToLong(logWs As Worksheet, row As Long, col As Long, val As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorksheetCellValueToLong" + + logWs.Cells(row, col) = val + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + " : val " & val & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub SetWorksheetCellValueToInteger(logWs As Worksheet, row As Long, col As Long, intVal As Integer) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorksheetCellValueToInteger" + + logWs.Cells(row, col) = intVal + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + " : intVal " & intVal & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorksheetCellValueToVariant(logWs As Worksheet, row As Long, col As Long, varVal As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorksheetCellValueToInteger" + + logWs.Cells(row, col) = varVal + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + " : varVal " & varVal & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorksheetCellValueToString(logWs As Worksheet, row As Long, col As Long, strVal As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorksheetCellValueToString" + + logWs.Cells(row, col) = strVal + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : row " & row & _ + " : col " & col & _ + " : strVal " & strVal & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorkbookNameValueToBoolean(logWb As WorkBook, name As String, bVal As Boolean) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorkbookNameValueToBoolean" + + logWb.Names(name).RefersToRange.Cells(1, 1) = bVal + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : boolean value " & bVal & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorkbookNameValueToString(logWb As WorkBook, name As String, val As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorkbookNameValueToString" + + logWb.Names(name).RefersToRange.Cells(1, 1) = val + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorkbookNameValueToLong(logWb As WorkBook, name As String, val As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorkbookNameValueToLong" + + logWb.Names(name).RefersToRange.Cells(1, 1) = val + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetWorkbookNameValueToVariant(logWb As WorkBook, name As String, val As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetWorkbookNameValueToVariant" + + logWb.Names(name).RefersToRange.Cells(1, 1) = val + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub AddLongToWorkbookNameValue(logWb As WorkBook, name As String, val As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddLongToWorkbookNameValue" + + logWb.Names(name).RefersToRange.Cells(1, 1) = logWb.Names(name).RefersToRange.Cells(1, 1).value + val + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : value " & val & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub AddVariantToWorkbookNameValue(logWb As WorkBook, name As String, varVal As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddVariantToWorkbookNameValue" + + logWb.Names(name).RefersToRange.Cells(1, 1) = logWb.Names(name).RefersToRange.Cells(1, 1).value + varVal + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : name " & name & " : value " & varVal & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SaveAnalysisResultsVariables(logWb As WorkBook, offsetDocIssueDetailsRow As Long, _ + offsetDocRefDetailsRow As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SaveAnalysisResultsVariables" + + 'OV - Internal Attributes + SetWorkbookNameValueToLong logWb, "TotalIssuesAnalysed", offsetDocIssueDetailsRow + SetWorkbookNameValueToLong logWb, "TotalRefsAnalysed", offsetDocRefDetailsRow +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : offsetDocIssueDetailsRow " & offsetDocIssueDetailsRow & _ + " : offsetDocRefDetailsRow " & offsetDocRefDetailsRow & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub SetupAnalysisResultsVariables(logWb As WorkBook, _ + offsetDocPropRow As Long, offsetDocIssuesRow As Long, _ + offsetDocIssueDetailsRow As Long, offsetDocRefDetailsRow As Long) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupAnalysisResultsVariables" + + offsetDocPropRow = GetWorkbookNameValueAsLong(logWb, CTOTAL_DOCS_ANALYZED) + offsetDocIssueDetailsRow = GetWorkbookNameValueAsLong(logWb, "TotalIssuesAnalysed") + offsetDocRefDetailsRow = GetWorkbookNameValueAsLong(logWb, "TotalRefsAnalysed") + offsetDocIssuesRow = GetWorkbookNameValueAsLong(logWb, getAppSpecificApplicationName & "_" & "TotalDocsAnalysedWithIssues") +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + " : offsetDocPropRow " & offsetDocPropRow & _ + " : offsetDocIssueDetailsRow " & offsetDocIssueDetailsRow & _ + " : offsetDocRefDetailsRow " & offsetDocRefDetailsRow & _ + " : offsetDocIssuesRow " & offsetDocIssuesRow & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteToIni(key As String, value As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteToIni" + + If mIniFilePath = "" Then Exit Sub + + Call WritePrivateProfileString("Analysis", key, value, mIniFilePath) +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : key " & key & " : value " & value & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteToLog(key As String, value As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteToLog" + + If mLogFilePath = "" Then Exit Sub + + Dim sSection As String + sSection = getAppSpecificApplicationName + + Call WritePrivateProfileString(sSection, key, value, mLogFilePath) +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : key " & key & " : value " & value & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub WriteDebug(value As String) + On Error Resume Next 'Ignore errors in our error writing routines - could get circular dependency otherwise + Static ErrCount As Long + + If mLogFilePath = "" Then Exit Sub + + Dim sSection As String + sSection = getAppSpecificApplicationName & "Debug" + + If mDebugLevel > 0 Then + Call WritePrivateProfileString(sSection, "Doc" & mDocIndex & "_debug" & ErrCount, value, mLogFilePath) + ErrCount = ErrCount + 1 + Else + Debug.Print + End If +End Sub +Sub WriteDebugLevelTwo(value As String) + On Error Resume Next 'Ignore errors in our error writing routines - could get circular dependency otherwise + Static ErrCountTwo As Long + + If mLogFilePath = "" Then Exit Sub + + Dim sSection As String + sSection = getAppSpecificApplicationName & "Debug" + + If mDebugLevel > 1 Then + Call WritePrivateProfileString(sSection, "Doc" & mDocIndex & "_debug" & ErrCountTwo, "Level2: " & value, mLogFilePath) + ErrCountTwo = ErrCountTwo + 1 + Else + Debug.Print + End If +End Sub + +Public Function ProfileLoadDict(dict As Scripting.Dictionary, _ + lpSectionName As String, _ + inifile As String) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "ProfileLoadDict" + Dim success As Long + Dim c As Long + Dim nSize As Long + Dim KeyData As String + Dim lpKeyName As String + Dim ret As String + + ret = Space$(2048) + nSize = Len(ret) + success = GetPrivateProfileString( _ + lpSectionName, vbNullString, "", ret, nSize, inifile) + + If success Then + ret = Left$(ret, success) + + Do Until ret = "" + lpKeyName = StripNulls(ret) + KeyData = ProfileGetItem( _ + lpSectionName, lpKeyName, "", inifile) + dict.Add lpKeyName, KeyData + Loop + End If + ProfileLoadDict = dict.count +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & _ + " : dict.Count " & dict.count & _ + " : lpSectionName " & lpSectionName & _ + " : inifile " & inifile & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Private Function StripNulls(startStrg As String) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "StripNulls" + Dim pos As Long + Dim item As String + + pos = InStr(1, startStrg, Chr$(0)) + + If pos Then + + item = Mid$(startStrg, 1, pos - 1) + startStrg = Mid$(startStrg, pos + 1, Len(startStrg)) + StripNulls = item + + End If + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : startStrg " & startStrg & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Function ProfileGetItem(lpSectionName As String, _ + lpKeyName As String, _ + defaultValue As String, _ + inifile As String) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "ProfileGetItem" + + Dim success As Long + Dim nSize As Long + Dim ret As String + ret = Space$(2048) + nSize = Len(ret) + success = GetPrivateProfileString(lpSectionName, _ + lpKeyName, _ + defaultValue, _ + ret, _ + nSize, _ + inifile) + If success Then + ProfileGetItem = Left$(ret, success) + Else + ProfileGetItem = defaultValue + End If + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & _ + " : lpSectionName " & lpSectionName & _ + " : lpKeyName " & lpKeyName & _ + " : defaultValue " & defaultValue & _ + " : inifile " & inifile & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Function GetDefaultPassword() As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetDefaultPassword" + + Static myPassword As String + + If myPassword = "" Then + myPassword = ProfileGetItem("Analysis", CDEFAULT_PASSWORD, "", mIniFilePath) + End If + + GetDefaultPassword = myPassword +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Function GetVersion() As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetVersion" + + Static myVersion As String + + If myVersion = "" Then + myVersion = ProfileGetItem("Analysis", CVERSION, "", mIniFilePath) + End If + + GetVersion = myVersion +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function +Public Function GetTitle() As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetTitle" + + Static myTitle As String + + If myTitle = "" Then + myTitle = ProfileGetItem("Analysis", CTITLE, RID_STR_COMMON_ANALYSIS_STR, mIniFilePath) + End If + + GetTitle = myTitle +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub SetPrepareToNone() + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetPrepareToNone" + + Call WritePrivateProfileString("Analysis", CDOPREPARE, CStr(0), mIniFilePath) + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Function CheckForAbort() As Boolean + Dim currentFunctionName As String + Dim bAbort As Boolean + + currentFunctionName = "CheckForAbort" + bAbort = False + + On Error GoTo HandleErrors + + bAbort = CBool(ProfileGetItem("Analysis", C_ABORT_ANALYSIS, "false", mIniFilePath)) + + 'reset the flag + If (bAbort) Then Call WriteToIni(C_ABORT_ANALYSIS, "false") + +FinalExit: + CheckForAbort = bAbort + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function CheckDoPrepare() As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckDoPrepare" + + Static bDoPrepare As Boolean + Static myDoPrepare As String + + If myDoPrepare = "" Then + bDoPrepare = CBool(ProfileGetItem("Analysis", _ + CDOPREPARE, "False", mIniFilePath)) + myDoPrepare = "OK" + End If + + CheckDoPrepare = bDoPrepare +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function GetIssuesLimitInDays() As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + + currentFunctionName = "GetIssuesLimitInDays" + + Static issuesLimit As Long + Static myDoPrepare As String + + If issuesLimit = 0 Then + issuesLimit = CLng(ProfileGetItem("Analysis", _ + CISSUES_LIMIT, CMAX_LIMIT, mIniFilePath)) * CNUMDAYS_IN_MONTH + End If + + GetIssuesLimitInDays = issuesLimit +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Sub AddIssueDetailsNote(myIssue As IssueInfo, noteNum As Long, noteStr As String, _ + Optional preStr As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "AddIssueDetailsNote" + + If IsMissing(preStr) Then + preStr = RID_STR_COMMON_NOTE_PRE + End If + myIssue.Attributes.Add preStr & "[" & noteNum & "]" + myIssue.Values.Add noteStr + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : noteNum " & noteNum & " : noteStr " & noteStr & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Public Sub SetupWizardVariables( _ + fileList As String, storeToDir As String, resultsFile As String, _ + logFile As String, resultsTemplate As String, bOverwriteFile As Boolean, _ + bNewResultsFile As Boolean, statFileName As String, debugLevel As Long, _ + outputType As String, singleFile As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupWizardVariables" + + If mIniFilePath = "" Then + mIniFilePath = GetAppDataFolder & "\Sun\AnalysisWizard\" & CWIZARD & ".ini" + End If + + statFileName = ProfileGetItem("Analysis", CSTAT_FILE, "", mIniFilePath) + fileList = ProfileGetItem("Analysis", CFILE_LIST, "", mIniFilePath) + storeToDir = ProfileGetItem("Analysis", COUTPUT_DIR, "", mIniFilePath) + resultsFile = ProfileGetItem("Analysis", CRESULTS_FILE, "", mIniFilePath) + logFile = ProfileGetItem("Analysis", CLOG_FILE, "", mIniFilePath) + resultsTemplate = ProfileGetItem("Analysis", CRESULTS_TEMPLATE, "", mIniFilePath) + bOverwriteFile = IIf(ProfileGetItem("Analysis", CRESULTS_EXIST, COVERWRITE_FILE, mIniFilePath) = COVERWRITE_FILE, _ + True, False) + bNewResultsFile = CBool(ProfileGetItem("Analysis", CNEW_RESULTS_FILE, "True", mIniFilePath)) + debugLevel = CLng(ProfileGetItem("Analysis", CDEBUG_LEVEL, "1", mIniFilePath)) + outputType = ProfileGetItem("Analysis", COUTPUT_TYPE, COUTPUT_TYPE_XLS, mIniFilePath) + singleFile = ProfileGetItem("Analysis", CSINGLE_FILE, "", mIniFilePath) +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & _ + ": mIniFilePath " & mIniFilePath & ": " & _ + Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Public Sub SetupSearchTypes(searchTypes As Collection) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetupSearchTypes" + + Dim bDocument As Boolean + Dim bTemplate As Boolean + + bDocument = CBool(ProfileGetItem("Analysis", LCase("type" & getAppSpecificApplicationName & "doc"), "False", mIniFilePath)) + bTemplate = CBool(ProfileGetItem("Analysis", LCase("type" & getAppSpecificApplicationName & "dot"), "False", mIniFilePath)) + If bDocument = True Then searchTypes.Add "*" & getAppSpecificDocExt + If bTemplate = True Then searchTypes.Add "*" & getAppSpecificTemplateExt +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & ": searchTypes.Count " & searchTypes.count & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteXMLHeader(out As TextStream) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLHeader" + + out.WriteLine "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" + out.WriteLine "<!DOCTYPE results SYSTEM 'analysis.dtd'>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub WriteXMLResultsStartTag(out As TextStream) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLResultsStartTag" + + out.WriteLine "<results generated-by=""" & IIf(InDocPreparation, "documentanalysis_preparation", "documentanalysis") & """" + out.WriteLine " version=""" & GetVersion & """ timestamp=""" & Now & """" + out.WriteLine " type=""" & getAppSpecificApplicationName & """ >" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Sub WriteXMLResultsEndTag(out As TextStream) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLResultsEndTag" + + out.WriteLine "</results>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteXMLDocProperties(out As TextStream, aAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLDocProperties" + + out.WriteLine "<document location=""" & EncodeXML(aAnalysis.name) & """" + out.WriteLine " application=""" & aAnalysis.Application & """" + out.WriteLine " issues-count=""" & (aAnalysis.IssuesCount) & """" + out.WriteLine " pages=""" & aAnalysis.PageCount & """" + out.WriteLine " created=""" & CheckDate(aAnalysis.Created) & """" + out.WriteLine " modified=""" & CheckDate(aAnalysis.Modified) & """" + out.WriteLine " accessed=""" & CheckDate(aAnalysis.Accessed) & """" + out.WriteLine " printed=""" & CheckDate(aAnalysis.Printed) & """" + out.WriteLine " last-save-by=""" & aAnalysis.SavedBy & """" + out.WriteLine " revision=""" & aAnalysis.Revision & """" + out.WriteLine " based-on-template=""" & EncodeXML(aAnalysis.Template) & """" + out.WriteLine ">" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteXMLDocPropertiesEndTag(out As TextStream) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLDocPropertiesEndTag" + + out.WriteLine "</document>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteXMLDocRefDetails(out As TextStream, aAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLDocRefDetails" + Dim myIssue As IssueInfo + + 'Output References for Docs with Macros + If aAnalysis.HasMacros And (aAnalysis.References.count > 0) Then + out.WriteLine "<references>" + For Each myIssue In aAnalysis.References + OutputXMLReferenceAttributes out, aAnalysis, myIssue + Next myIssue + out.WriteLine "</references>" + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub OutputXMLReferenceAttributes(out As TextStream, aAnalysis As DocumentAnalysis, myIssue As IssueInfo) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputXMLReferenceAttributes" + Dim strAttributes As String + + With myIssue + out.WriteLine "<reference" + + strAttributes = .Values("Major") & "." & .Values("Minor") + strAttributes = IIf(strAttributes = "0.0" Or strAttributes = ".", .Values("Name"), _ + .Values("Name") & " " & .Values("Major") & "." & .Values("Minor")) + out.WriteLine " name=""" & EncodeXML(strAttributes) & """" + + If .Values("Type") = "Project" Then + strAttributes = "Project reference" + Else + strAttributes = IIf(.Values("Description") <> "", .Values("Description"), RID_STR_COMMON_NA) + End If + out.WriteLine " description=""" & EncodeXML(strAttributes) & """" + If .Values("IsBroken") <> RID_STR_COMMON_ATTRIBUTE_BROKEN Then + out.WriteLine " location=""" & .Values("File") & """" + End If + out.WriteLine " type=""" & .Values("Type") & """" + strAttributes = IIf(.Values("GUID") <> "", .Values("GUID"), RID_STR_COMMON_NA) + out.WriteLine " GUID=""" & strAttributes & """" + out.WriteLine " is-broken=""" & .Values("IsBroken") & """" + out.WriteLine " builtin=""" & .Values("BuiltIn") & """" + + out.WriteLine " />" + End With + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteXMLDocIssueDetails(out As TextStream, aAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLDocIssueDetails" + + Dim myIssue As IssueInfo + + If aAnalysis.Issues.count = 0 Then Exit Sub + + out.WriteLine "<issues>" + For Each myIssue In aAnalysis.Issues + OutputXMLCommonIssueDetails out, aAnalysis, myIssue + OutputXMLCommonIssueAttributes out, myIssue + out.WriteLine "</issue>" + Next myIssue + out.WriteLine "</issues>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub OutputXMLCommonIssueDetails(out As TextStream, aAnalysis As DocumentAnalysis, myIssue As IssueInfo) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputXMLCommonIssueDetails" + + out.WriteLine "<issue category=""" & myIssue.IssueTypeXML & """" + out.WriteLine " type=""" & myIssue.SubTypeXML & """" + + 'NOTE: Dropping severity - now stored in results.xlt, do not want to open it to fetch this data + 'out.WriteLine " severity=""" & IIf(CheckForMinorIssue(aAnalysis, myIssue), "Minor", "Major") & """" + out.WriteLine " prepared=""" & IIf((myIssue.Preparable), "True", "False") & """ >" + + out.WriteLine "<location type=""" & myIssue.locationXML & """ >" + + If myIssue.SubLocation <> "" Then + out.WriteLine "<property name=""sublocation"" value=""" & myIssue.SubLocation & """ />" + End If + If myIssue.Line <> -1 Then + out.WriteLine "<property name=""line"" value=""" & myIssue.Line & """ />" + End If + If myIssue.column <> "" Then + out.WriteLine "<property name=""column"" value=""" & myIssue.column & """ />" + End If + out.WriteLine "</location>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & aAnalysis.name & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub OutputXMLCommonIssueAttributes(out As TextStream, myIssue As IssueInfo) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "OutputXMLCommonIssueAttributes" + + Dim index As Integer + Dim valStr As String + Dim attStr As String + + If myIssue.Attributes.count = 0 Then Exit Sub + + out.WriteLine "<details>" + For index = 1 To myIssue.Attributes.count + attStr = myIssue.Attributes(index) + If InStr(attStr, RID_STR_COMMON_NOTE_PRE & "[") = 1 Then + attStr = Right$(attStr, Len(attStr) - Len(RID_STR_COMMON_NOTE_PRE & "[")) + attStr = Left$(attStr, Len(attStr) - 1) + out.WriteLine "<note index=""" & attStr & """ value=""" & EncodeXML(myIssue.Values(index)) & """ />" + Else + out.WriteLine "<property name=""" & EncodeXML(myIssue.Attributes(index)) & """ value=""" & EncodeXML(myIssue.Values(index)) & """ />" + End If + Next index + + out.WriteLine "</details>" + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : myIssue " & myIssue.IssueTypeXML & "_" & myIssue.SubTypeXML & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + + +Sub WriteXMLOutput(storeToDir As String, resultsFile As String, _ + bOverwriteResultsFile As Boolean, bNewResultsFile As Boolean, AnalysedDocs As Collection, _ + fso As Scripting.FileSystemObject) + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteXMLOutput" + + Dim xmlOutput As TextStream + Dim xmlOrigOutput As TextStream + Dim origOutput As String + Dim analysis As DocumentAnalysis + Dim outFilePath As String + + outFilePath = storeToDir & "\" & fso.GetBaseName(resultsFile) & "_" & _ + getAppSpecificApplicationName & ".xml" + + Set xmlOutput = fso.CreateTextFile(outFilePath, True) + WriteXMLHeader xmlOutput + + 'Set xmlOrigOutput = fso.OpenTextFile(outFilePath, ForReading) + 'Set xmlOutput = fso.OpenTextFile(outFilePath, ForWriting) + + WriteXMLResultsStartTag xmlOutput + For Each analysis In AnalysedDocs + WriteXMLDocProperties xmlOutput, analysis + WriteXMLDocRefDetails xmlOutput, analysis + WriteXMLDocIssueDetails xmlOutput, analysis + WriteXMLDocPropertiesEndTag xmlOutput + Next analysis + WriteXMLResultsEndTag xmlOutput + +FinalExit: + xmlOutput.Close + Set xmlOutput = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : path " & outFilePath & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Private Function EncodeUrl(ByVal sUrl As String) As String + Const MAX_PATH As Long = 260 + Const ERROR_SUCCESS As Long = 0 + Const URL_DONT_SIMPLIFY As Long = &H8000000 + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "EncodeUrl" + + Dim sUrlEsc As String + Dim dwSize As Long + Dim dwFlags As Long + + If Len(sUrl) > 0 Then + + sUrlEsc = Space$(MAX_PATH) + dwSize = Len(sUrlEsc) + dwFlags = URL_DONT_SIMPLIFY + + If UrlEscape(sUrl, _ + sUrlEsc, _ + dwSize, _ + dwFlags) = ERROR_SUCCESS Then + + EncodeUrl = Left$(sUrlEsc, dwSize) + + End If 'If UrlEscape + End If 'If Len(sUrl) > 0 + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : sUrl " & sUrl & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Private Function EncodeXML(Str As String) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "EncodeXML" + + Str = Replace(Str, "^", "^") + Str = Replace(Str, "&", "&") + Str = Replace(Str, "`", "'") + Str = Replace(Str, "{", "{") + Str = Replace(Str, "}", "}") + Str = Replace(Str, "|", "|") + Str = Replace(Str, "]", "]") + Str = Replace(Str, "[", "[") + Str = Replace(Str, """", """) + Str = Replace(Str, "<", "<") + Str = Replace(Str, ">", ">") + + 'str = Replace(str, "\", "\") + 'str = Replace(str, "#", "#") + 'str = Replace(str, "?", "?") + 'str = Replace(str, "/", "/") + + EncodeXML = Str + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : string " & Str & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + + +Function ReplaceTopicTokens(sString As String, _ + sToken As String, _ + sReplacement As String) As String + On Error Resume Next + + Dim p As Integer + Dim sTmp As String + + sTmp = sString + Do + p = InStr(sTmp, sToken) + If p Then + sTmp = Left(sTmp, p - 1) + sReplacement + Mid(sTmp, p + Len(sToken)) + End If + Loop While p > 0 + + + ReplaceTopicTokens = sTmp + +End Function + +Function ReplaceTopic2Tokens(sString As String, _ + sToken1 As String, _ + sReplacement1 As String, _ + sToken2 As String, _ + sReplacement2 As String) As String + On Error Resume Next + + ReplaceTopic2Tokens = _ + ReplaceTopicTokens(ReplaceTopicTokens(sString, sToken1, sReplacement1), _ + sToken2, sReplacement2) +End Function + +'Language setting functions +Function GetResourceDataFileName(thisDir As String) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetResourceDataFileName" + + Dim fso As FileSystemObject + Set fso = New FileSystemObject + + 'A debug method - if a file called debug.dat exists load it. + If fso.FileExists(fso.GetAbsolutePathName(thisDir & "\debug.dat")) Then + GetResourceDataFileName = fso.GetAbsolutePathName(thisDir & "\debug.dat") + GoTo FinalExit + End If + + Dim isoLangStr As String + Dim isoCountryStr As String + Dim langDir As String + + langDir = thisDir & "\" & "lang" + + Dim userLCID As Long + userLCID = GetUserDefaultLangID() + Dim sysLCID As Long + sysLCID = GetSystemDefaultLangID() + + isoLangStr = GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME) + isoCountryStr = GetUserLocaleInfo(userLCID, LOCALE_SISO3166CTRYNAME) + + 'check for locale data in following order: + ' user language + ' isoLangStr & "_" & isoCountryStr & ".dat" + ' isoLangStr & ".dat" + ' system language + ' isoLangStr & "_" & isoCountryStr & ".dat" + ' isoLangStr & ".dat" + ' "en_US" & ".dat" + + If fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")) Then + GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat") + ElseIf fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")) Then + GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat") + Else + isoLangStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME) + isoCountryStr = GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME) + + If fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat")) Then + GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & "-" & isoCountryStr & ".dat") + ElseIf fso.FileExists(fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat")) Then + GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & isoLangStr & ".dat") + Else + GetResourceDataFileName = fso.GetAbsolutePathName(langDir & "\" & "en-US.dat") + End If + End If +FinalExit: + Set fso = Nothing + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetUserLocaleInfo" + Dim sReturn As String + Dim r As Long + + 'call the function passing the Locale type + 'variable to retrieve the required size of + 'the string buffer needed + r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) + + 'if successful.. + If r Then + 'pad the buffer with spaces + sReturn = Space$(r) + + 'and call again passing the buffer + r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) + + 'if successful (r > 0) + If r Then + 'r holds the size of the string + 'including the terminating null + GetUserLocaleInfo = Left$(sReturn, r - 1) + End If + End If + +FinalExit: + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +' This function returns the Application Data Folder Path +Function GetAppDataFolder() As String + Dim idlstr As Long + Dim sPath As String + Dim IDL As ITEMIDLIST + Const NOERROR = 0 + Const MAX_LENGTH = 260 + Const CSIDL_APPDATA = &H1A + + On Error GoTo Err_GetFolder + + ' Fill the idl structure with the specified folder item. + idlstr = SHGetSpecialFolderLocation(0, CSIDL_APPDATA, IDL) + + If idlstr = NOERROR Then + ' Get the path from the idl list, and return + ' the folder with a slash at the end. + sPath = Space$(MAX_LENGTH) + idlstr = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath) + If idlstr Then + GetAppDataFolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1) + End If + End If + +Exit_GetFolder: + Exit Function + +Err_GetFolder: + MsgBox "An Error was Encountered" & Chr(13) & Err.Description, _ + vbCritical Or vbOKOnly + Resume Exit_GetFolder + +End Function + +Sub WriteToStatFile(statFileName As String, statValue As Integer, _ + currDocument As String, fso As Scripting.FileSystemObject) + + On Error Resume Next + + Dim fileCont As TextStream + + Set fileCont = fso.OpenTextFile(statFileName, ForWriting, True, TristateTrue) + If (statValue = C_STAT_STARTING) Then + fileCont.WriteLine ("analysing=" & currDocument) + ElseIf (statValue = C_STAT_DONE) Then + fileCont.WriteLine ("analysed=" & currDocument) + ElseIf (statValue = C_STAT_FINISHED) Then + fileCont.WriteLine ("finished") + End If + + fileCont.Close +End Sub + +' The function FindIndex looks for a document in the given document list +' starting at the position lastIndex in that list. If the document could +' not be found, the function starts searching from the beginning + +Function FindIndex(myDocument As String, _ + myDocList As Collection, _ + lastIndex As Long) As Long + + Dim lastEntry As Long + Dim curIndex As Long + Dim curEntry As String + Dim entryFound As Boolean + + entryFound = False + lastEntry = myDocList.count + + If (lastIndex > lastEntry) Then lastIndex = lastEntry + + If (lastIndex > 1) Then + curIndex = lastIndex + Else + curIndex = 1 + End If + + While Not entryFound And curIndex <= lastEntry + curEntry = myDocList.item(curIndex) + If (curEntry = myDocument) Then + entryFound = True + Else + curIndex = curIndex + 1 + End If + Wend + + If (Not entryFound) Then + curIndex = 1 + While Not entryFound And curIndex < lastIndex + curEntry = myDocList.item(curIndex) + If (curEntry = myDocument) Then + entryFound = True + Else + curIndex = curIndex + 1 + End If + Wend + End If + + If entryFound Then + FindIndex = curIndex + Else + FindIndex = 0 + End If + +End Function + +' The sub GetIndexValues calulates the start index of the analysis and the index +' of the file after which the next intermediate reult will be written +Function GetIndexValues(startIndex As Long, nextCheck As Long, _ + myFiles As Collection) As Boolean + + Dim lastCheckpoint As String + Dim nextFile As String + Dim newResultsFile As Boolean + + lastCheckpoint = ProfileGetItem(C_ANALYSIS, C_LAST_CHECKPOINT, "", mIniFilePath) + nextFile = ProfileGetItem(C_ANALYSIS, C_NEXT_FILE, "", mIniFilePath) + newResultsFile = True + + If (nextFile = "") Then + ' No Analysis done yet + startIndex = 1 + nextCheck = C_MAX_CHECK + Else + If (lastCheckpoint = "") Then + startIndex = 1 + Else + startIndex = FindIndex(lastCheckpoint, myFiles, 1) + 1 + If (startIndex > 0) Then newResultsFile = False + End If + + nextCheck = FindIndex(nextFile, myFiles, startIndex - 1) + + If (nextCheck = 0) Then ' Next file not in file list, restarting + startIndex = 1 + nextCheck = C_MAX_CHECK + newResultsFile = True + ElseIf (nextCheck < startIndex) Then 'we are done? + nextCheck = startIndex + C_MAX_CHECK + ElseIf (nextCheck = startIndex) Then 'skip this one + WriteToLog C_ERROR_HANDLING_DOC & nextCheck, nextFile + startIndex = startIndex + 1 + nextCheck = startIndex + C_MAX_CHECK + Else 'last time an error occurred with that file, write before analysing + nextCheck = nextCheck - 1 + End If + End If + GetIndexValues = newResultsFile +End Function + +Private Sub GetDocModificationDates(docCounts As DocModificationDates) + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetDocModificationDates" + + docCounts.lessThanThreemonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_3_MONTH, "0", mIniFilePath)) + docCounts.threeToSixmonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_6_MONTH, "0", mIniFilePath)) + docCounts.sixToTwelvemonths = CLng(ProfileGetItem("Analysis", C_DOCS_LESS_12_MONTH, "0", mIniFilePath)) + docCounts.greaterThanOneYear = CLng(ProfileGetItem("Analysis", C_DOCS_MORE_12_MONTH, "0", mIniFilePath)) + +FinalExit: + Exit Sub +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub diff --git a/migrationanalysis/src/driver_docs/sources/CommonMigrationAnalyser.bas b/migrationanalysis/src/driver_docs/sources/CommonMigrationAnalyser.bas index cad3894a9b63..280f7beed8c0 100644 --- a/migrationanalysis/src/driver_docs/sources/CommonMigrationAnalyser.bas +++ b/migrationanalysis/src/driver_docs/sources/CommonMigrationAnalyser.bas @@ -1,1112 +1,1112 @@ -Attribute VB_Name = "CommonMigrationAnalyser"
-'*************************************************************************
-'
-' Licensed to the Apache Software Foundation (ASF) under one
-' or more contributor license agreements. See the NOTICE file
-' distributed with this work for additional information
-' regarding copyright ownership. The ASF licenses this file
-' to you under the Apache License, Version 2.0 (the
-' "License"); you may not use this file except in compliance
-' with the License. You may obtain a copy of the License at
-'
-' http://www.apache.org/licenses/LICENSE-2.0
-'
-' Unless required by applicable law or agreed to in writing,
-' software distributed under the License is distributed on an
-' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-' KIND, either express or implied. See the License for the
-' specific language governing permissions and limitations
-' under the License.
-'
-'*************************************************************************
-Option Explicit
-
-
-'***********************************************
-'**** APPLICATION COMMON ANALYSIS FUNCTIONS ****
-'***********************************************
-
-'** Common - XML Issue and SubIssue strings
-'For preparation - need access to some Word/ Excel or PP consts
-Public Const CSTR_ISSUE_OBJECTS_GRAPHICS_AND_FRAMES = "ObjectsGraphicsAndFrames"
-Public Const CSTR_SUBISSUE_OBJECT_IN_HEADER_FOOTER = "ObjectInHeaderFooter"
-
-Public Const CSTR_ISSUE_INFORMATION = "Information"
-Public Const CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES = "ContentAndDocumentProperties"
-Public Const CSTR_ISSUE_FORMAT = "Format"
-Public Const CSTR_ISSUE_PORTABILITY = "Portability"
-Public Const CSTR_ISSUE_VBA_MACROS = "VBAMacros"
-
-Public Const CSTR_SUBISSUE_DOCUMENT_PARTS_PROTECTION = "DocumentPartsProtection"
-Public Const CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO = "ExternalReferencesInMacro"
-Public Const CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO_COUNT = "ExternalReferencesInMacroCount"
-Public Const CSTR_SUBISSUE_GRADIENT = "Gradient"
-Public Const CSTR_SUBISSUE_INVALID_PASSWORD_ENTERED = "InvalidPasswordEntered"
-Public Const CSTR_SUBISSUE_LINE = "Line"
-Public Const CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION = "PasswordProtected"
-Public Const CSTR_SUBISSUE_OLD_WORKBOOK_VERSION = "OldWorkbookVersion"
-Public Const CSTR_SUBISSUE_OLE_EMBEDDED = "EmbeddedOLEObject"
-Public Const CSTR_SUBISSUE_OLE_LINKED = "LinkedOLEObject"
-Public Const CSTR_SUBISSUE_OLE_CONTROL = "OLEControl"
-Public Const CSTR_SUBISSUE_OLE_FIELD_LINK = "OLEFieldLink"
-Public Const CSTR_SUBISSUE_OLE_UNKNOWN = "UnknownType"
-Public Const CSTR_SUBISSUE_PASSWORDS_PROTECTION = "PasswordProtection"
-Public Const CSTR_SUBISSUE_PROPERTIES = "Properties"
-Public Const CSTR_SUBISSUE_REFERENCES = "References"
-Public Const CSTR_SUBISSUE_TRANSPARENCY = "Transparency"
-Public Const CSTR_SUBISSUE_VBA_MACROS_NUMLINES = "NumberOfLines"
-Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_COUNT = "UserFormsCount"
-Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROL_COUNT = "UserFormsControlCount"
-Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROLTYPE_COUNT = "UserFormsControlTypeCount"
-Public Const CSTR_SUBISSUE_VBA_MACROS_UNIQUE_MODULE_COUNT = "UniqueModuleCount"
-Public Const CSTR_SUBISSUE_VBA_MACROS_UNIQUE_LINE_COUNT = "UniqueLineCount"
-'** END Common - XML Issue and SubIssue strings
-
-'Macro classification bounds
-Public Const CMACRO_LINECOUNT_MEDIUM_LBOUND = 50
-
-'Don't localize folder name
-Public Const CSTR_COMMON_PREPARATION_FOLDER = "prepared"
-
-
-Public Enum EnumDocOverallMacroClass
- enMacroNone = 0
- enMacroSimple = 1
- enMacroMedium = 2
- enMacroComplex = 3
-End Enum
-Public Enum EnumDocOverallIssueClass
- enNone = 0
- enMinor = 1
- enComplex = 2
-End Enum
-
-Sub EmptyCollection(docAnalysis As DocumentAnalysis, coll As Collection)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "EmptyCollection"
- Dim Num As Long
- For Num = 1 To coll.count ' Remove name from the collection.
- coll.Remove 1 ' Default collection numeric indexes
- Next ' begin at 1.
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-Public Function Analyze_Macros(docAnalysis As DocumentAnalysis, _
- userFormTypesDict As Scripting.Dictionary, _
- currDoc As Object)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Macros"
- Dim macroDetails As String
- Dim cmpDetails As String
- Dim myProject As VBProject
- Dim myComponent As VBComponent
- Dim numLines As Long
- Dim myIssue As IssueInfo
- Dim wrd As Object
- Dim bUserFormWithEmptyCodeModule As Boolean
-
- On Error Resume Next
- Set myProject = getAppSpecificVBProject(currDoc)
- If Err.Number <> 0 Then
- ' Failed to get access to VBProject
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & _
- RID_STR_COMMON_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT & ":" & _
- RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE
-
- GoTo FinalExit
- End If
-
- On Error GoTo HandleErrors
- If myProject.Protection = vbext_pp_locked Then
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_VBA_MACROS
- .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS
- .SubType = RID_STR_COMMON_SUBISSUE_MACRO_PASSWORD_PROTECTION
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_VBA_MACROS
- .SubTypeXML = CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_VBPROJECT_PASSWORD
- .Values.Add RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE
- End With
- docAnalysis.IssuesCountArray(CID_VBA_MACROS) = _
- docAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1
- docAnalysis.Issues.Add myIssue
- docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1
-
- docAnalysis.HasMacros = True
- GoTo FinalExit
- End If
-
- Dim myContolDict As Scripting.Dictionary
- For Each myComponent In myProject.VBComponents
-
- bUserFormWithEmptyCodeModule = False
- If CheckEmptyProject(docAnalysis, myProject, myComponent) Then
- If myComponent.Type <> vbext_ct_MSForm Then
- GoTo FOREACH_CONTINUE
- Else
- bUserFormWithEmptyCodeModule = True
- End If
- End If
-
- Analyze_MacrosForPortabilityIssues docAnalysis, myProject, myComponent
-
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_VBA_MACROS
- .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS
- .SubType = RID_STR_COMMON_SUBISSUE_PROPERTIES
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_VBA_MACROS
- .SubTypeXML = CSTR_SUBISSUE_PROPERTIES
- .locationXML = .CXMLLocationDocument
-
- .SubLocation = VBComponentType(myComponent)
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROJECT
- .Values.Add myProject.name
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_COMPONENT
- .Values.Add myComponent.name
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROCEDURES
- .Values.Add VBNumFuncs(docAnalysis, myComponent.CodeModule), RID_STR_COMMON_ATTRIBUTE_PROCEDURES
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES
- numLines = VBNumLines(docAnalysis, myComponent.CodeModule)
- .Values.Add numLines, RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES
-
- If bUserFormWithEmptyCodeModule Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SIGNATURE
- .Values.Add RID_STR_COMMON_NA, RID_STR_COMMON_ATTRIBUTE_SIGNATURE
- Else
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SIGNATURE
- .Values.Add MD5HashString( _
- myComponent.CodeModule.Lines(1, myComponent.CodeModule.CountOfLines)), _
- RID_STR_COMMON_ATTRIBUTE_SIGNATURE
- End If
-
- docAnalysis.MacroTotalNumLines = numLines + docAnalysis.MacroTotalNumLines
- End With
-
- ' User Forms - control details
- If (myComponent.Type = vbext_ct_MSForm) And Not bUserFormWithEmptyCodeModule Then
- myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_CONTROLS
- myIssue.Values.Add myComponent.Designer.Controls.count, RID_STR_COMMON_ATTRIBUTE_CONTROLS
- docAnalysis.MacroNumUserForms = 1 + docAnalysis.MacroNumUserForms
- docAnalysis.MacroNumUserFormControls = myComponent.Designer.Controls.count + docAnalysis.MacroNumUserFormControls
-
- Dim myControl As Control
- Dim controlTypes As String
- Dim myType As String
-
- Set myContolDict = New Scripting.Dictionary
-
- For Each myControl In myComponent.Designer.Controls
- myType = TypeName(myControl)
- If myContolDict.Exists(myType) Then
- myContolDict.item(myType) = myContolDict.item(myType) + 1
- Else
- myContolDict.Add myType, 1
- End If
- If userFormTypesDict.Exists(myType) Then
- userFormTypesDict.item(myType) = userFormTypesDict.item(myType) + 1
- Else
- userFormTypesDict.Add myType, 1
- End If
- Next
-
- If myComponent.Designer.Controls.count > 0 Then
- Dim count As Long
- Dim vKeyArray As Variant
- Dim vItemArray As Variant
-
- vKeyArray = myContolDict.Keys
- vItemArray = myContolDict.Items
-
- controlTypes = ""
- For count = 0 To myContolDict.count - 1
- controlTypes = controlTypes & vKeyArray(count) & " " & CInt(vItemArray(count)) & " "
- Next count
- myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE
- myIssue.Values.Add controlTypes, RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE
-
- myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT
- myIssue.Values.Add myContolDict.count, RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT
-
- docAnalysis.MacroNumUserFormControlTypes = myContolDict.count + docAnalysis.MacroNumUserFormControlTypes
- End If
- Set myContolDict = Nothing
- End If
-
- 'Check for occurence of " Me " in Form and Class Modules
- If myComponent.Type = vbext_ct_MSForm Or _
- myComponent.Type = vbext_ct_ClassModule Then
-
- Dim strFind As String
- strFind = ""
- count = 0
- strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "Me", count, bWholeWord:=True)
-' If (strFind <> "") Then MsgBox strFind
-
- If count > 0 Then
- myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT
- myIssue.Values.Add count, RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT
- End If
- End If
-
- docAnalysis.IssuesCountArray(CID_VBA_MACROS) = _
- docAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1
- docAnalysis.Issues.Add myIssue
- docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1
-
- Set myIssue = Nothing
-
-FOREACH_CONTINUE:
- 'No equiv to C continue in VB
- Next myComponent 'End - For Each myComponent
-
- If docAnalysis.IssuesCountArray(CID_VBA_MACROS) > 0 Then
- Analyze_VBEReferences docAnalysis, currDoc
- docAnalysis.HasMacros = True
- End If
-
-FinalExit:
- docAnalysis.MacroOverallClass = ClassifyDocOverallMacroClass(docAnalysis)
-
- Set myProject = Nothing
- Set myIssue = Nothing
- Set myContolDict = Nothing
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function CheckOnlyEmptyProject(docAnalysis As DocumentAnalysis, currDoc As Object) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckOnlyEmptyProject"
- Dim myProject As VBProject
- Set myProject = getAppSpecificVBProject(currDoc)
- Dim myVBComponent As VBComponent
-
- For Each myVBComponent In myProject.VBComponents
- If Not CheckEmptyProject(docAnalysis, myProject, myVBComponent) Then
- CheckOnlyEmptyProject = False
- GoTo FinalExit
- End If
- Next myVBComponent
-
- CheckOnlyEmptyProject = True
-
-FinalExit:
- Set myProject = Nothing
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub Analyze_VBEReferences(docAnalysis As DocumentAnalysis, currDoc As Object)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_VBEReferences"
- 'References
- Dim Ref As Reference
- Dim fso As Scripting.FileSystemObject
- Dim myVBProject As VBProject
- Dim myVBComponent As VBComponent
-
- Set fso = New Scripting.FileSystemObject
-
- If CheckOnlyEmptyProject(docAnalysis, currDoc) Then
- Exit Sub
- End If
- Set myVBProject = getAppSpecificVBProject(currDoc)
-
- For Each Ref In myVBProject.References
- Analyze_VBEReferenceSingle docAnalysis, Ref, fso
- Next Ref
-
-FinalExit:
- Set myVBProject = Nothing
- Set fso = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_VBEReferenceSingle(docAnalysis As DocumentAnalysis, Ref As Reference, fso As Scripting.FileSystemObject)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_VBEReferenceSingle"
- 'References
- Dim myIssue As IssueInfo
- Dim bBadRef As Boolean
-
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_INFORMATION_REFS
- .IssueType = RID_STR_COMMON_ISSUE_INFORMATION
- .SubType = RID_STR_COMMON_SUBISSUE_REFERENCES
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_INFORMATION
- .SubTypeXML = CSTR_SUBISSUE_REFERENCES
- .locationXML = .CXMLLocationDocument
-
- If Ref.GUID = "" Then
- bBadRef = True
- Else
- bBadRef = False
- End If
- If Not bBadRef Then
- .SubLocation = LCase(fso.GetFileName(Ref.FullPath))
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add Ref.name, RID_STR_COMMON_ATTRIBUTE_NAME
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_DESCRIPTION
- .Values.Add Ref.Description, RID_STR_COMMON_ATTRIBUTE_DESCRIPTION
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_FILE
- .Values.Add LCase(fso.GetFileName(Ref.FullPath)), RID_STR_COMMON_ATTRIBUTE_FILE
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PATH
- .Values.Add LCase(Ref.FullPath), RID_STR_COMMON_ATTRIBUTE_PATH
- Else
- .SubLocation = RID_STR_COMMON_NA
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add RID_STR_COMMON_ATTRIBUTE_MISSING, RID_STR_COMMON_ATTRIBUTE_NAME
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_DESCRIPTION
- .Values.Add RID_STR_COMMON_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES, RID_STR_COMMON_ATTRIBUTE_DESCRIPTION
- End If
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_MAJOR
- .Values.Add IIf(Not bBadRef, Ref.Major, ""), RID_STR_COMMON_ATTRIBUTE_MAJOR
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_MINOR
- .Values.Add IIf(Not bBadRef, Ref.Minor, ""), RID_STR_COMMON_ATTRIBUTE_MINOR
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_TYPE
- .Values.Add IIf(Ref.Type = vbext_rk_Project, RID_STR_COMMON_ATTRIBUTE_PROJECT, RID_STR_COMMON_ATTRIBUTE_TYPELIB), RID_STR_COMMON_ATTRIBUTE_TYPE
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_BUILTIN
- .Values.Add IIf(Ref.BuiltIn, RID_STR_COMMON_ATTRIBUTE_BUILTIN, RID_STR_COMMON_ATTRIBUTE_CUSTOM), RID_STR_COMMON_ATTRIBUTE_BUILTIN
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_ISBROKEN
- .Values.Add IIf(bBadRef, RID_STR_COMMON_ATTRIBUTE_BROKEN, RID_STR_COMMON_ATTRIBUTE_INTACT), RID_STR_COMMON_ATTRIBUTE_ISBROKEN
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_GUID
- .Values.Add IIf(Ref.Type = vbext_rk_TypeLib, Ref.GUID, ""), RID_STR_COMMON_ATTRIBUTE_GUID
- End With
-
- docAnalysis.References.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebugLevelTwo currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_MacrosForPortabilityIssues(docAnalysis As DocumentAnalysis, myProject As VBProject, myComponent As VBComponent)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_MacrosForPortabilityIssues"
- Dim myIssue As IssueInfo
- Dim count As Long
-
- ' Code Modules
- Dim strFind As String
- strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "CreateObject", count, bWholeWord:=True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "GetObject", count, bWholeWord:=True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "ADODB.", count, True, True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "Word.", count, True, True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "Excel.", count, True, True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "PowerPoint.", count, True, True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "Access.", count, True, True) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "Declare Function ", count, False) & _
- VBFindLines(docAnalysis, myComponent.CodeModule, "Declare Sub ", count, False)
-
-
- If (strFind <> "") And (myComponent.Type <> vbext_ct_Document) Then
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_PORTABILITY
- .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY
- .SubType = RID_STR_COMMON_SUBISSUE_EXTERNAL_REFERENCES_IN_MACROS
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_PORTABILITY
- .SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO
- .locationXML = .CXMLLocationDocument
-
- .SubLocation = VBComponentType(myComponent)
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROJECT
- .Values.Add myProject.name
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_COMPONENT
- .Values.Add myComponent.name
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES
- .Values.Add RID_STR_COMMON_ATTRIBUTE_INCLUDING & vbLf & Left(strFind, Len(strFind) - 1)
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT
- .Values.Add count, RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT
- End With
- docAnalysis.IssuesCountArray(CID_PORTABILITY) = _
- docAnalysis.IssuesCountArray(CID_PORTABILITY) + 1
- docAnalysis.Issues.Add myIssue
- docAnalysis.MacroNumExternalRefs = count + docAnalysis.MacroNumExternalRefs
- docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1
- End If
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-Resume FinalExit
-End Sub
-
-'Find Lines in code module containing strFind and return list of them
-Function VBFindLines(docAnalysis As DocumentAnalysis, vbcm As CodeModule, strFind As String, _
- count As Long, _
- Optional bInProcedure As Boolean = True, _
- Optional bUsingNew As Boolean = False, _
- Optional bWholeWord As Boolean = False, _
- Optional bMatchCase As Boolean = False) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "VBFindLines"
- Dim lngStartLine As Long
- Dim lngStartCol As Long
- Dim lngEndLine As Long
- Dim lngEndCol As Long
- Dim strLine As String
- lngStartLine = 1
- lngStartCol = 1
- lngEndLine = vbcm.CountOfLines
- Dim tmpString As String
- If (vbcm.CountOfLines = 0) Then
- Exit Function
- End If
- tmpString = vbcm.Lines(vbcm.CountOfLines, 1)
- lngEndCol = Len(vbcm.Lines(vbcm.CountOfLines, 1))
- Dim lngType As Long
- Dim strProc As String
- Dim retStr As String
-
- ' Search
- Do While vbcm.Find(strFind, lngStartLine, _
- lngStartCol, lngEndLine, lngEndCol, bWholeWord, bMatchCase)
-
- 'Ignore any lines using this func
- If InStr(1, vbcm.Lines(lngStartLine, 1), "VBFindLines") <> 0 Then
- GoTo CONTINUE_LOOP
- End If
-
- If bInProcedure Then
- If bUsingNew Then
- If InStr(1, vbcm.Lines(lngStartLine, 1), "New") <> 0 Then
- strProc = vbcm.ProcOfLine(lngStartLine, lngType)
- Else
- strProc = ""
- End If
- Else
- strProc = vbcm.ProcOfLine(lngStartLine, lngType)
- End If
- If strProc = "" Then GoTo CONTINUE_LOOP
-
- VBFindLines = VBFindLines & "[" & strProc & " ( ) - " & lngStartLine & " ]" & _
- vbLf & vbcm.Lines(lngStartLine, 1) & vbLf
- Else
- strProc = vbcm.Lines(lngStartLine, 1)
- If strProc = "" Then GoTo CONTINUE_LOOP
-
- 'Can be External refs, Const, Type or variable declarations
- If InStr(1, vbcm.Lines(lngStartLine, 1), "Declare Function") <> 0 Then
- VBFindLines = VBFindLines & "[" & RID_STR_COMMON_DEC_TO_EXTERNAL_LIBRARY & " - " & lngStartLine & " ]" & _
- vbLf & strProc & vbLf
- Else
- VBFindLines = VBFindLines & "[" & RID_STR_COMMON_VB_COMPONENT_MODULE & " " & strFind & _
- " - " & lngStartLine & " ]" & vbLf
- End If
- End If
- count = count + 1
-
-CONTINUE_LOOP:
- 'Reset Params to search for next hit
- lngStartLine = lngEndLine + 1
- lngStartCol = 1
- lngEndLine = vbcm.CountOfLines
- lngEndCol = Len(vbcm.Lines(vbcm.CountOfLines, 1))
-
- If lngStartLine >= lngEndLine Then Exit Function
-
- Loop 'End - Do While vbcm.Find
- VBFindLines = VBFindLines
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Function
-Function VBNumLines(docAnalysis As DocumentAnalysis, vbcm As CodeModule) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "VBNumLines"
- Dim cLines As Long
- Dim lngType As Long
- Dim strProc As String
-
- 'Issue: Just give line count in module to be in sync with Macro Analysis and Migration Wizard
- VBNumLines = vbcm.CountOfLines
-
- 'For cLines = 1 To vbcm.CountOfLines
- ' strProc = vbcm.ProcOfLine(cLines, lngType)
- ' If strProc <> "" Then
- ' VBNumLines = VBNumLines - _
- ' (vbcm.ProcBodyLine(strProc, lngType) - vbcm.ProcStartLine(strProc, lngType))
- ' cLines = cLines + vbcm.ProcCountLines(strProc, lngType) - 1
- ' End If
- 'Next
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Function
-Function VBNumFuncs(docAnalysis As DocumentAnalysis, vbcm As CodeModule) As Long
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "VBNumFuncs"
- Dim cLines As Long
- Dim lngType As Long
- Dim strProc As String
-
- For cLines = 1 To vbcm.CountOfLines
- strProc = vbcm.ProcOfLine(cLines, lngType)
- If strProc <> "" Then
- VBNumFuncs = VBNumFuncs + 1
- cLines = cLines + vbcm.ProcCountLines(strProc, lngType) - 1
- End If
- Next
- Exit Function
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Function
-
-Function VBComponentType(vbc As VBComponent) As String
- Select Case vbc.Type
- Case vbext_ct_StdModule
- VBComponentType = RID_STR_COMMON_VB_COMPONENT_STANDARD
- Case vbext_ct_ClassModule
- VBComponentType = RID_STR_COMMON_VB_COMPONENT_CLASS
- Case vbext_ct_MSForm
- VBComponentType = RID_STR_COMMON_VB_COMPONENT_USER_FORM
- Case vbext_ct_Document
- VBComponentType = RID_STR_COMMON_VB_COMPONENT_DOCUMENT
- Case 11 'vbext_ct_ActiveX Designer
- VBComponentType = RID_STR_COMMON_VB_COMPONENT_ACTIVEX_DESIGNER
- Case Else
- VBComponentType = RID_STR_COMMON_UNKNOWN
- End Select
-End Function
-
-Function CheckEmptyProject(docAnalysis As DocumentAnalysis, myProject As VBProject, myComponent As VBComponent) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckEmptyProject"
- Dim bEmptyProject As Boolean
-
- 'Bug: Can have empty project with different name from default, would be picked up
- ' as not empty.
- 'bEmptyProject = _
- ' (StrComp(myProject.name, CTOPLEVEL_PROJECT) = 0) And _
- ' (VBNumFuncs(docAnalysis, myComponent.CodeModule) = 0) And _
- ' (VBNumLines(docAnalysis, myComponent.CodeModule) < 3)
-
- ' Code Modules
- Dim strFind As String
- Dim count As Long
- 'Check for:
- 'Public Const myFoo ....
- 'Public Declare Function ....
- 'Public myVar As ...
- strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "Public", _
- count, bInProcedure:=False, bWholeWord:=True, bMatchCase:=True)
-
- bEmptyProject = _
- (VBNumFuncs(docAnalysis, myComponent.CodeModule) = 0) And _
- (VBNumLines(docAnalysis, myComponent.CodeModule) < 3) And _
- (strFind = "")
-
- CheckEmptyProject = IIf(bEmptyProject, True, False)
- Exit Function
-
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Function
-
-Function getCustomDocPropTypeAsString(propType As MsoDocProperties)
- Dim Str As String
-
- Select Case propType
- Case msoPropertyTypeBoolean
- Str = RID_STR_COMMON_YES_OR_NO
- Case msoPropertyTypeDate
- Str = RID_STR_COMMON_DATE
- Case msoPropertyTypeFloat
- Str = RID_STR_COMMON_NUMBER
- Case msoPropertyTypeNumber
- Str = RID_STR_COMMON_NUMBER
- Case msoPropertyTypeString
- Str = RID_STR_COMMON_TEXT
- Case Else
- Str = "Unknown"
- End Select
-
- getCustomDocPropTypeAsString = Str
-End Function
-
-Sub HandleProtectedDocInvalidPassword(docAnalysis As DocumentAnalysis, strError As String, fso As FileSystemObject)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "HandleProtectedDocInvalidPassword"
- Dim f As File
- Set f = fso.GetFile(docAnalysis.name)
-
- docAnalysis.Application = RID_STR_COMMON_PASSWORD_SKIPDOC
-
- On Error Resume Next
- docAnalysis.PageCount = 0
- docAnalysis.Created = f.DateCreated
- docAnalysis.Modified = f.DateLastModified
- docAnalysis.Accessed = f.DateLastAccessed
- docAnalysis.Printed = DateValue("01/01/1900")
- docAnalysis.SavedBy = RID_STR_COMMON_NA
- docAnalysis.Revision = 0
- docAnalysis.Template = RID_STR_COMMON_NA
- On Error GoTo HandleErrors
-
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_STR_COMMON_SUBISSUE_INVALID_PASSWORD_ENTERED
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_INVALID_PASSWORD_ENTERED
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PASSWORD
- .Values.Add strError
-
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- docAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Set f = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_OLEEmbeddedSingleShape(docAnalysis As DocumentAnalysis, aShape As Shape, mySubLocation As Variant)
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_OLEEmbeddedSingleShape"
- Dim myIssue As IssueInfo
- Dim bOleObject As Boolean
- Dim TypeAsString As String
- Dim XMLTypeAsString As String
- Dim objName As String
-
- bOleObject = (aShape.Type = msoEmbeddedOLEObject) Or _
- (aShape.Type = msoLinkedOLEObject) Or _
- (aShape.Type = msoOLEControlObject)
-
- If Not bOleObject Then Exit Sub
-
- aShape.Select
- Select Case aShape.Type
- Case msoEmbeddedOLEObject
- TypeAsString = RID_STR_COMMON_OLE_EMBEDDED
- XMLTypeAsString = CSTR_SUBISSUE_OLE_EMBEDDED
- Case msoLinkedOLEObject
- TypeAsString = RID_STR_COMMON_OLE_LINKED
- XMLTypeAsString = CSTR_SUBISSUE_OLE_LINKED
- Case msoOLEControlObject
- TypeAsString = RID_STR_COMMON_OLE_CONTROL
- XMLTypeAsString = CSTR_SUBISSUE_OLE_CONTROL
- Case Else
- TypeAsString = RID_STR_COMMON_OLE_UNKNOWN
- XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN
- End Select
-
- Dim appStr As String
- appStr = getAppSpecificApplicationName
-
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_PORTABILITY
- .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY
- .SubType = TypeAsString
- .Location = .CLocationPage
- .SubLocation = mySubLocation
-
- .IssueTypeXML = CSTR_ISSUE_PORTABILITY
- .SubTypeXML = XMLTypeAsString
- .locationXML = .CXMLLocationPage
-
- .Line = aShape.top
- .column = aShape.Left
-
- If aShape.name <> "" Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add aShape.name
- End If
-
- If aShape.Type = msoEmbeddedOLEObject Or _
- aShape.Type = msoOLEControlObject Then
- Dim objType As String
- On Error Resume Next
-
- objType = getAppSpecificOLEClassType(aShape)
-
- If objType = "" Then GoTo FinalExit
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE
- .Values.Add objType
-
- If aShape.Type = msoOLEControlObject Then
- docAnalysis.MacroNumOLEControls = 1 + docAnalysis.MacroNumOLEControls
- End If
-
- If appStr = CAPPNAME_POWERPOINT Then
- '#114127: Too many open windows
- 'Checking for OLEFormat.Object is Nothing or IsEmpty still causes problem
- If objType <> "Equation.3" Then
- objName = aShape.OLEFormat.Object.name
- If Err.Number = 0 Then
- If aShape.name <> objName Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME
- .Values.Add objName
- End If
- End If
- End If
- Else
- If Not (aShape.OLEFormat.Object) Is Nothing Then
- objName = aShape.OLEFormat.Object.name
- If Err.Number = 0 Then
- If aShape.name <> objName Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME
- .Values.Add objName
- End If
- End If
- End If
- End If
-
- On Error GoTo HandleErrors
- End If
-
- If aShape.Type = msoLinkedOLEObject Then
- If appStr <> CAPPNAME_WORD Then
- On Error Resume Next
- Dim path As String
- path = aShape.OLEFormat.Object.SourceFullName
- If Err.Number = 0 Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE
- .Values.Add path
- End If
- On Error GoTo HandleErrors
- Else
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE
- .Values.Add aShape.LinkFormat.SourceFullName
- End If
- End If
-
- docAnalysis.IssuesCountArray(CID_PORTABILITY) = _
- docAnalysis.IssuesCountArray(CID_PORTABILITY) + 1
- End With
- docAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebugLevelTwo currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_Lines(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Lines"
-
- If myShape.Line.Style = msoLineSingle Or _
- myShape.Line.Style = msoLineStyleMixed Then Exit Sub
-
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_RESXLS_COST_LineStyle
- .Location = .CLocationPage
- .SubLocation = mySubLocation
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_LINE
- .locationXML = .CXMLLocationPage
-
- .Line = myShape.top
- .column = myShape.Left
-
- If myShape.name <> "" Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add myShape.name
- End If
-
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_LINE_NOTE
-
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- docAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_Transparency(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Transparency"
-
- If Not myShape.Type = msoPicture Then Exit Sub
-
- Dim bHasTransparentBkg
- bHasTransparentBkg = False
-
- On Error Resume Next
- If myShape.PictureFormat.TransparentBackground = msoTrue Then
- If Error.Number = 0 Then
- bHasTransparentBkg = True
- End If
- End If
-
- On Error GoTo HandleErrors
- If Not bHasTransparentBkg Then Exit Sub
-
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_RESXLS_COST_Transparent
- .Location = .CLocationSlide
- .SubLocation = mySubLocation
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_TRANSPARENCY
- .locationXML = .CXMLLocationPage
-
- .Line = myShape.top
- .column = myShape.Left
-
- If myShape.name <> "" Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add myShape.name
- End If
-
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_TRANSPARENCY_NOTE
-
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- docAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_Gradients(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Gradients"
-
- If myShape.Fill.Type <> msoFillGradient Then Exit Sub
-
- Dim bUsesPresetGradient, bUsesFromCorner, bUsesFromCenter
- bUsesPresetGradient = False
- bUsesFromCorner = False
- bUsesFromCenter = False
-
- On Error Resume Next
- If myShape.Fill.PresetGradientType <> msoPresetGradientMixed Then
- If Error.Number = 0 Then
- bUsesPresetGradient = True
- End If
- End If
- If myShape.Fill.GradientStyle <> msoGradientFromCorner Then
- If Error.Number = 0 Then
- bUsesFromCorner = True
- End If
- End If
- If myShape.Fill.GradientStyle <> msoGradientFromCenter Then
- If Error.Number = 0 Then
- bUsesFromCenter = True
- End If
- End If
-
- On Error GoTo HandleErrors
- If Not bUsesPresetGradient And Not bUsesFromCorner _
- And Not bUsesFromCenter Then Exit Sub
-
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_RESXLS_COST_GradientStyle
- .Location = .CLocationSlide
- .SubLocation = mySubLocation
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_GRADIENT
- .locationXML = .CXMLLocationSlide
-
- .Line = myShape.top
- .column = myShape.Left
-
- If myShape.name <> "" Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add myShape.name
- End If
-
- If bUsesPresetGradient Then
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_PRESET_NOTE
- ElseIf bUsesFromCorner Then
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_CORNER_NOTE
- Else
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_CENTER_NOTE
- End If
-
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- docAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Private Function CreateFullPath(newPath As String, fso As FileSystemObject)
- 'We don't want to create 'c:\'
- If (Len(newPath) < 4) Then
- Exit Function
- End If
-
- 'Create parent folder first
- If (Not fso.FolderExists(fso.GetParentFolderName(newPath))) Then
- CreateFullPath fso.GetParentFolderName(newPath), fso
- End If
-
- If (Not fso.FolderExists(newPath)) Then
- fso.CreateFolder (newPath)
- End If
-End Function
-
-Function GetPreparedFullPath(sourceDocPath As String, startDir As String, storeToDir As String, _
- fso As FileSystemObject) As String
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "GetPreparedFullPath"
- GetPreparedFullPath = ""
-
- Dim preparedPath As String
-
- preparedPath = Right(sourceDocPath, Len(sourceDocPath) - Len(startDir))
- If Left(preparedPath, 1) = "\" Then
- preparedPath = Right(preparedPath, Len(preparedPath) - 1)
- End If
-
- 'Allow for root folder C:\
- If Right(storeToDir, 1) <> "\" Then
- preparedPath = storeToDir & "\" & CSTR_COMMON_PREPARATION_FOLDER & "\" & preparedPath
- Else
- preparedPath = storeToDir & CSTR_COMMON_PREPARATION_FOLDER & "\" & preparedPath
- End If
-
- 'Debug: MsgBox "Preppath: " & preparedPath
- CreateFullPath fso.GetParentFolderName(preparedPath), fso
-
- 'Only set if folder to save to exists or has been created, otherwise return ""
- GetPreparedFullPath = preparedPath
-
-FinalExit:
- Exit Function
-
-HandleErrors:
- WriteDebugLevelTwo currentFunctionName & " : " & sourceDocPath & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function ClassifyDocOverallMacroClass(docAnalysis As DocumentAnalysis) As EnumDocOverallMacroClass
- ClassifyDocOverallMacroClass = enMacroNone
-
- If Not docAnalysis.HasMacros Then Exit Function
-
- If (docAnalysis.MacroTotalNumLines >= CMACRO_LINECOUNT_MEDIUM_LBOUND) Then
- If (docAnalysis.MacroNumExternalRefs > 0) Or _
- (docAnalysis.MacroNumOLEControls > 0 Or docAnalysis.MacroNumFieldsUsingMacros > 0) Or _
- docAnalysis.MacroNumUserForms > 0 Then
- ClassifyDocOverallMacroClass = enMacroComplex
- Else
- ClassifyDocOverallMacroClass = enMacroMedium
- End If
- Else
- ClassifyDocOverallMacroClass = enMacroSimple
- End If
-
-End Function
-
+Attribute VB_Name = "CommonMigrationAnalyser" +'************************************************************************* +' +' Licensed to the Apache Software Foundation (ASF) under one +' or more contributor license agreements. See the NOTICE file +' distributed with this work for additional information +' regarding copyright ownership. The ASF licenses this file +' to you under the Apache License, Version 2.0 (the +' "License"); you may not use this file except in compliance +' with the License. You may obtain a copy of the License at +' +' http://www.apache.org/licenses/LICENSE-2.0 +' +' Unless required by applicable law or agreed to in writing, +' software distributed under the License is distributed on an +' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +' KIND, either express or implied. See the License for the +' specific language governing permissions and limitations +' under the License. +' +'************************************************************************* +Option Explicit + + +'*********************************************** +'**** APPLICATION COMMON ANALYSIS FUNCTIONS **** +'*********************************************** + +'** Common - XML Issue and SubIssue strings +'For preparation - need access to some Word/ Excel or PP consts +Public Const CSTR_ISSUE_OBJECTS_GRAPHICS_AND_FRAMES = "ObjectsGraphicsAndFrames" +Public Const CSTR_SUBISSUE_OBJECT_IN_HEADER_FOOTER = "ObjectInHeaderFooter" + +Public Const CSTR_ISSUE_INFORMATION = "Information" +Public Const CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES = "ContentAndDocumentProperties" +Public Const CSTR_ISSUE_FORMAT = "Format" +Public Const CSTR_ISSUE_PORTABILITY = "Portability" +Public Const CSTR_ISSUE_VBA_MACROS = "VBAMacros" + +Public Const CSTR_SUBISSUE_DOCUMENT_PARTS_PROTECTION = "DocumentPartsProtection" +Public Const CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO = "ExternalReferencesInMacro" +Public Const CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO_COUNT = "ExternalReferencesInMacroCount" +Public Const CSTR_SUBISSUE_GRADIENT = "Gradient" +Public Const CSTR_SUBISSUE_INVALID_PASSWORD_ENTERED = "InvalidPasswordEntered" +Public Const CSTR_SUBISSUE_LINE = "Line" +Public Const CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION = "PasswordProtected" +Public Const CSTR_SUBISSUE_OLD_WORKBOOK_VERSION = "OldWorkbookVersion" +Public Const CSTR_SUBISSUE_OLE_EMBEDDED = "EmbeddedOLEObject" +Public Const CSTR_SUBISSUE_OLE_LINKED = "LinkedOLEObject" +Public Const CSTR_SUBISSUE_OLE_CONTROL = "OLEControl" +Public Const CSTR_SUBISSUE_OLE_FIELD_LINK = "OLEFieldLink" +Public Const CSTR_SUBISSUE_OLE_UNKNOWN = "UnknownType" +Public Const CSTR_SUBISSUE_PASSWORDS_PROTECTION = "PasswordProtection" +Public Const CSTR_SUBISSUE_PROPERTIES = "Properties" +Public Const CSTR_SUBISSUE_REFERENCES = "References" +Public Const CSTR_SUBISSUE_TRANSPARENCY = "Transparency" +Public Const CSTR_SUBISSUE_VBA_MACROS_NUMLINES = "NumberOfLines" +Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_COUNT = "UserFormsCount" +Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROL_COUNT = "UserFormsControlCount" +Public Const CSTR_SUBISSUE_VBA_MACROS_USERFORMS_CONTROLTYPE_COUNT = "UserFormsControlTypeCount" +Public Const CSTR_SUBISSUE_VBA_MACROS_UNIQUE_MODULE_COUNT = "UniqueModuleCount" +Public Const CSTR_SUBISSUE_VBA_MACROS_UNIQUE_LINE_COUNT = "UniqueLineCount" +'** END Common - XML Issue and SubIssue strings + +'Macro classification bounds +Public Const CMACRO_LINECOUNT_MEDIUM_LBOUND = 50 + +'Don't localize folder name +Public Const CSTR_COMMON_PREPARATION_FOLDER = "prepared" + + +Public Enum EnumDocOverallMacroClass + enMacroNone = 0 + enMacroSimple = 1 + enMacroMedium = 2 + enMacroComplex = 3 +End Enum +Public Enum EnumDocOverallIssueClass + enNone = 0 + enMinor = 1 + enComplex = 2 +End Enum + +Sub EmptyCollection(docAnalysis As DocumentAnalysis, coll As Collection) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "EmptyCollection" + Dim Num As Long + For Num = 1 To coll.count ' Remove name from the collection. + coll.Remove 1 ' Default collection numeric indexes + Next ' begin at 1. + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +Public Function Analyze_Macros(docAnalysis As DocumentAnalysis, _ + userFormTypesDict As Scripting.Dictionary, _ + currDoc As Object) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Macros" + Dim macroDetails As String + Dim cmpDetails As String + Dim myProject As VBProject + Dim myComponent As VBComponent + Dim numLines As Long + Dim myIssue As IssueInfo + Dim wrd As Object + Dim bUserFormWithEmptyCodeModule As Boolean + + On Error Resume Next + Set myProject = getAppSpecificVBProject(currDoc) + If Err.Number <> 0 Then + ' Failed to get access to VBProject + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & _ + RID_STR_COMMON_ATTRIBUTE_UNABLE_TO_ACCESS_VBPROJECT & ":" & _ + RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE + + GoTo FinalExit + End If + + On Error GoTo HandleErrors + If myProject.Protection = vbext_pp_locked Then + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_VBA_MACROS + .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS + .SubType = RID_STR_COMMON_SUBISSUE_MACRO_PASSWORD_PROTECTION + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_VBA_MACROS + .SubTypeXML = CSTR_SUBISSUE_MACRO_PASSWORD_PROTECTION + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_VBPROJECT_PASSWORD + .Values.Add RID_STR_COMMON_ATTRIBUTE_FURTHER_MACRO_ANALYSIS_NOT_POSSIBLE + End With + docAnalysis.IssuesCountArray(CID_VBA_MACROS) = _ + docAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1 + docAnalysis.Issues.Add myIssue + docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1 + + docAnalysis.HasMacros = True + GoTo FinalExit + End If + + Dim myContolDict As Scripting.Dictionary + For Each myComponent In myProject.VBComponents + + bUserFormWithEmptyCodeModule = False + If CheckEmptyProject(docAnalysis, myProject, myComponent) Then + If myComponent.Type <> vbext_ct_MSForm Then + GoTo FOREACH_CONTINUE + Else + bUserFormWithEmptyCodeModule = True + End If + End If + + Analyze_MacrosForPortabilityIssues docAnalysis, myProject, myComponent + + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_VBA_MACROS + .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS + .SubType = RID_STR_COMMON_SUBISSUE_PROPERTIES + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_VBA_MACROS + .SubTypeXML = CSTR_SUBISSUE_PROPERTIES + .locationXML = .CXMLLocationDocument + + .SubLocation = VBComponentType(myComponent) + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROJECT + .Values.Add myProject.name + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_COMPONENT + .Values.Add myComponent.name + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROCEDURES + .Values.Add VBNumFuncs(docAnalysis, myComponent.CodeModule), RID_STR_COMMON_ATTRIBUTE_PROCEDURES + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES + numLines = VBNumLines(docAnalysis, myComponent.CodeModule) + .Values.Add numLines, RID_STR_COMMON_ATTRIBUTE_NUMBER_OF_LINES + + If bUserFormWithEmptyCodeModule Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SIGNATURE + .Values.Add RID_STR_COMMON_NA, RID_STR_COMMON_ATTRIBUTE_SIGNATURE + Else + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SIGNATURE + .Values.Add MD5HashString( _ + myComponent.CodeModule.Lines(1, myComponent.CodeModule.CountOfLines)), _ + RID_STR_COMMON_ATTRIBUTE_SIGNATURE + End If + + docAnalysis.MacroTotalNumLines = numLines + docAnalysis.MacroTotalNumLines + End With + + ' User Forms - control details + If (myComponent.Type = vbext_ct_MSForm) And Not bUserFormWithEmptyCodeModule Then + myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_CONTROLS + myIssue.Values.Add myComponent.Designer.Controls.count, RID_STR_COMMON_ATTRIBUTE_CONTROLS + docAnalysis.MacroNumUserForms = 1 + docAnalysis.MacroNumUserForms + docAnalysis.MacroNumUserFormControls = myComponent.Designer.Controls.count + docAnalysis.MacroNumUserFormControls + + Dim myControl As Control + Dim controlTypes As String + Dim myType As String + + Set myContolDict = New Scripting.Dictionary + + For Each myControl In myComponent.Designer.Controls + myType = TypeName(myControl) + If myContolDict.Exists(myType) Then + myContolDict.item(myType) = myContolDict.item(myType) + 1 + Else + myContolDict.Add myType, 1 + End If + If userFormTypesDict.Exists(myType) Then + userFormTypesDict.item(myType) = userFormTypesDict.item(myType) + 1 + Else + userFormTypesDict.Add myType, 1 + End If + Next + + If myComponent.Designer.Controls.count > 0 Then + Dim count As Long + Dim vKeyArray As Variant + Dim vItemArray As Variant + + vKeyArray = myContolDict.Keys + vItemArray = myContolDict.Items + + controlTypes = "" + For count = 0 To myContolDict.count - 1 + controlTypes = controlTypes & vKeyArray(count) & " " & CInt(vItemArray(count)) & " " + Next count + myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE + myIssue.Values.Add controlTypes, RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPE + + myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT + myIssue.Values.Add myContolDict.count, RID_STR_COMMON_ATTRIBUTE_USERFORM_TYPES_COUNT + + docAnalysis.MacroNumUserFormControlTypes = myContolDict.count + docAnalysis.MacroNumUserFormControlTypes + End If + Set myContolDict = Nothing + End If + + 'Check for occurrence of " Me " in Form and Class Modules + If myComponent.Type = vbext_ct_MSForm Or _ + myComponent.Type = vbext_ct_ClassModule Then + + Dim strFind As String + strFind = "" + count = 0 + strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "Me", count, bWholeWord:=True) +' If (strFind <> "") Then MsgBox strFind + + If count > 0 Then + myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT + myIssue.Values.Add count, RID_STR_COMMON_ATTRIBUTE_CLASS_ME_COUNT + End If + End If + + docAnalysis.IssuesCountArray(CID_VBA_MACROS) = _ + docAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1 + docAnalysis.Issues.Add myIssue + docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1 + + Set myIssue = Nothing + +FOREACH_CONTINUE: + 'No equiv to C continue in VB + Next myComponent 'End - For Each myComponent + + If docAnalysis.IssuesCountArray(CID_VBA_MACROS) > 0 Then + Analyze_VBEReferences docAnalysis, currDoc + docAnalysis.HasMacros = True + End If + +FinalExit: + docAnalysis.MacroOverallClass = ClassifyDocOverallMacroClass(docAnalysis) + + Set myProject = Nothing + Set myIssue = Nothing + Set myContolDict = Nothing + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function CheckOnlyEmptyProject(docAnalysis As DocumentAnalysis, currDoc As Object) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckOnlyEmptyProject" + Dim myProject As VBProject + Set myProject = getAppSpecificVBProject(currDoc) + Dim myVBComponent As VBComponent + + For Each myVBComponent In myProject.VBComponents + If Not CheckEmptyProject(docAnalysis, myProject, myVBComponent) Then + CheckOnlyEmptyProject = False + GoTo FinalExit + End If + Next myVBComponent + + CheckOnlyEmptyProject = True + +FinalExit: + Set myProject = Nothing + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub Analyze_VBEReferences(docAnalysis As DocumentAnalysis, currDoc As Object) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_VBEReferences" + 'References + Dim Ref As Reference + Dim fso As Scripting.FileSystemObject + Dim myVBProject As VBProject + Dim myVBComponent As VBComponent + + Set fso = New Scripting.FileSystemObject + + If CheckOnlyEmptyProject(docAnalysis, currDoc) Then + Exit Sub + End If + Set myVBProject = getAppSpecificVBProject(currDoc) + + For Each Ref In myVBProject.References + Analyze_VBEReferenceSingle docAnalysis, Ref, fso + Next Ref + +FinalExit: + Set myVBProject = Nothing + Set fso = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_VBEReferenceSingle(docAnalysis As DocumentAnalysis, Ref As Reference, fso As Scripting.FileSystemObject) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_VBEReferenceSingle" + 'References + Dim myIssue As IssueInfo + Dim bBadRef As Boolean + + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_INFORMATION_REFS + .IssueType = RID_STR_COMMON_ISSUE_INFORMATION + .SubType = RID_STR_COMMON_SUBISSUE_REFERENCES + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_INFORMATION + .SubTypeXML = CSTR_SUBISSUE_REFERENCES + .locationXML = .CXMLLocationDocument + + If Ref.GUID = "" Then + bBadRef = True + Else + bBadRef = False + End If + If Not bBadRef Then + .SubLocation = LCase(fso.GetFileName(Ref.FullPath)) + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add Ref.name, RID_STR_COMMON_ATTRIBUTE_NAME + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_DESCRIPTION + .Values.Add Ref.Description, RID_STR_COMMON_ATTRIBUTE_DESCRIPTION + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_FILE + .Values.Add LCase(fso.GetFileName(Ref.FullPath)), RID_STR_COMMON_ATTRIBUTE_FILE + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PATH + .Values.Add LCase(Ref.FullPath), RID_STR_COMMON_ATTRIBUTE_PATH + Else + .SubLocation = RID_STR_COMMON_NA + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add RID_STR_COMMON_ATTRIBUTE_MISSING, RID_STR_COMMON_ATTRIBUTE_NAME + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_DESCRIPTION + .Values.Add RID_STR_COMMON_ATTRIBUTE_CHECK_DOCUMENT_REFERENCES, RID_STR_COMMON_ATTRIBUTE_DESCRIPTION + End If + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_MAJOR + .Values.Add IIf(Not bBadRef, Ref.Major, ""), RID_STR_COMMON_ATTRIBUTE_MAJOR + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_MINOR + .Values.Add IIf(Not bBadRef, Ref.Minor, ""), RID_STR_COMMON_ATTRIBUTE_MINOR + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_TYPE + .Values.Add IIf(Ref.Type = vbext_rk_Project, RID_STR_COMMON_ATTRIBUTE_PROJECT, RID_STR_COMMON_ATTRIBUTE_TYPELIB), RID_STR_COMMON_ATTRIBUTE_TYPE + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_BUILTIN + .Values.Add IIf(Ref.BuiltIn, RID_STR_COMMON_ATTRIBUTE_BUILTIN, RID_STR_COMMON_ATTRIBUTE_CUSTOM), RID_STR_COMMON_ATTRIBUTE_BUILTIN + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_ISBROKEN + .Values.Add IIf(bBadRef, RID_STR_COMMON_ATTRIBUTE_BROKEN, RID_STR_COMMON_ATTRIBUTE_INTACT), RID_STR_COMMON_ATTRIBUTE_ISBROKEN + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_GUID + .Values.Add IIf(Ref.Type = vbext_rk_TypeLib, Ref.GUID, ""), RID_STR_COMMON_ATTRIBUTE_GUID + End With + + docAnalysis.References.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebugLevelTwo currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_MacrosForPortabilityIssues(docAnalysis As DocumentAnalysis, myProject As VBProject, myComponent As VBComponent) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_MacrosForPortabilityIssues" + Dim myIssue As IssueInfo + Dim count As Long + + ' Code Modules + Dim strFind As String + strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "CreateObject", count, bWholeWord:=True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "GetObject", count, bWholeWord:=True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "ADODB.", count, True, True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "Word.", count, True, True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "Excel.", count, True, True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "PowerPoint.", count, True, True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "Access.", count, True, True) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "Declare Function ", count, False) & _ + VBFindLines(docAnalysis, myComponent.CodeModule, "Declare Sub ", count, False) + + + If (strFind <> "") And (myComponent.Type <> vbext_ct_Document) Then + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_PORTABILITY + .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY + .SubType = RID_STR_COMMON_SUBISSUE_EXTERNAL_REFERENCES_IN_MACROS + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_PORTABILITY + .SubTypeXML = CSTR_SUBISSUE_EXTERNAL_REFERENCES_IN_MACRO + .locationXML = .CXMLLocationDocument + + .SubLocation = VBComponentType(myComponent) + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PROJECT + .Values.Add myProject.name + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_COMPONENT + .Values.Add myComponent.name + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES + .Values.Add RID_STR_COMMON_ATTRIBUTE_INCLUDING & vbLf & Left(strFind, Len(strFind) - 1) + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT + .Values.Add count, RID_STR_COMMON_ATTRIBUTE_NON_PORTABLE_EXTERNAL_REFERENCES_COUNT + End With + docAnalysis.IssuesCountArray(CID_PORTABILITY) = _ + docAnalysis.IssuesCountArray(CID_PORTABILITY) + 1 + docAnalysis.Issues.Add myIssue + docAnalysis.MacroNumExternalRefs = count + docAnalysis.MacroNumExternalRefs + docAnalysis.MacroIssuesCount = docAnalysis.MacroIssuesCount + 1 + End If + +FinalExit: + Set myIssue = Nothing + Exit Sub + + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +Resume FinalExit +End Sub + +'Find Lines in code module containing strFind and return list of them +Function VBFindLines(docAnalysis As DocumentAnalysis, vbcm As CodeModule, strFind As String, _ + count As Long, _ + Optional bInProcedure As Boolean = True, _ + Optional bUsingNew As Boolean = False, _ + Optional bWholeWord As Boolean = False, _ + Optional bMatchCase As Boolean = False) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "VBFindLines" + Dim lngStartLine As Long + Dim lngStartCol As Long + Dim lngEndLine As Long + Dim lngEndCol As Long + Dim strLine As String + lngStartLine = 1 + lngStartCol = 1 + lngEndLine = vbcm.CountOfLines + Dim tmpString As String + If (vbcm.CountOfLines = 0) Then + Exit Function + End If + tmpString = vbcm.Lines(vbcm.CountOfLines, 1) + lngEndCol = Len(vbcm.Lines(vbcm.CountOfLines, 1)) + Dim lngType As Long + Dim strProc As String + Dim retStr As String + + ' Search + Do While vbcm.Find(strFind, lngStartLine, _ + lngStartCol, lngEndLine, lngEndCol, bWholeWord, bMatchCase) + + 'Ignore any lines using this func + If InStr(1, vbcm.Lines(lngStartLine, 1), "VBFindLines") <> 0 Then + GoTo CONTINUE_LOOP + End If + + If bInProcedure Then + If bUsingNew Then + If InStr(1, vbcm.Lines(lngStartLine, 1), "New") <> 0 Then + strProc = vbcm.ProcOfLine(lngStartLine, lngType) + Else + strProc = "" + End If + Else + strProc = vbcm.ProcOfLine(lngStartLine, lngType) + End If + If strProc = "" Then GoTo CONTINUE_LOOP + + VBFindLines = VBFindLines & "[" & strProc & " ( ) - " & lngStartLine & " ]" & _ + vbLf & vbcm.Lines(lngStartLine, 1) & vbLf + Else + strProc = vbcm.Lines(lngStartLine, 1) + If strProc = "" Then GoTo CONTINUE_LOOP + + 'Can be External refs, Const, Type or variable declarations + If InStr(1, vbcm.Lines(lngStartLine, 1), "Declare Function") <> 0 Then + VBFindLines = VBFindLines & "[" & RID_STR_COMMON_DEC_TO_EXTERNAL_LIBRARY & " - " & lngStartLine & " ]" & _ + vbLf & strProc & vbLf + Else + VBFindLines = VBFindLines & "[" & RID_STR_COMMON_VB_COMPONENT_MODULE & " " & strFind & _ + " - " & lngStartLine & " ]" & vbLf + End If + End If + count = count + 1 + +CONTINUE_LOOP: + 'Reset Params to search for next hit + lngStartLine = lngEndLine + 1 + lngStartCol = 1 + lngEndLine = vbcm.CountOfLines + lngEndCol = Len(vbcm.Lines(vbcm.CountOfLines, 1)) + + If lngStartLine >= lngEndLine Then Exit Function + + Loop 'End - Do While vbcm.Find + VBFindLines = VBFindLines + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Function +Function VBNumLines(docAnalysis As DocumentAnalysis, vbcm As CodeModule) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "VBNumLines" + Dim cLines As Long + Dim lngType As Long + Dim strProc As String + + 'Issue: Just give line count in module to be in sync with Macro Analysis and Migration Wizard + VBNumLines = vbcm.CountOfLines + + 'For cLines = 1 To vbcm.CountOfLines + ' strProc = vbcm.ProcOfLine(cLines, lngType) + ' If strProc <> "" Then + ' VBNumLines = VBNumLines - _ + ' (vbcm.ProcBodyLine(strProc, lngType) - vbcm.ProcStartLine(strProc, lngType)) + ' cLines = cLines + vbcm.ProcCountLines(strProc, lngType) - 1 + ' End If + 'Next + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Function +Function VBNumFuncs(docAnalysis As DocumentAnalysis, vbcm As CodeModule) As Long + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "VBNumFuncs" + Dim cLines As Long + Dim lngType As Long + Dim strProc As String + + For cLines = 1 To vbcm.CountOfLines + strProc = vbcm.ProcOfLine(cLines, lngType) + If strProc <> "" Then + VBNumFuncs = VBNumFuncs + 1 + cLines = cLines + vbcm.ProcCountLines(strProc, lngType) - 1 + End If + Next + Exit Function +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Function + +Function VBComponentType(vbc As VBComponent) As String + Select Case vbc.Type + Case vbext_ct_StdModule + VBComponentType = RID_STR_COMMON_VB_COMPONENT_STANDARD + Case vbext_ct_ClassModule + VBComponentType = RID_STR_COMMON_VB_COMPONENT_CLASS + Case vbext_ct_MSForm + VBComponentType = RID_STR_COMMON_VB_COMPONENT_USER_FORM + Case vbext_ct_Document + VBComponentType = RID_STR_COMMON_VB_COMPONENT_DOCUMENT + Case 11 'vbext_ct_ActiveX Designer + VBComponentType = RID_STR_COMMON_VB_COMPONENT_ACTIVEX_DESIGNER + Case Else + VBComponentType = RID_STR_COMMON_UNKNOWN + End Select +End Function + +Function CheckEmptyProject(docAnalysis As DocumentAnalysis, myProject As VBProject, myComponent As VBComponent) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckEmptyProject" + Dim bEmptyProject As Boolean + + 'Bug: Can have empty project with different name from default, would be picked up + ' as not empty. + 'bEmptyProject = _ + ' (StrComp(myProject.name, CTOPLEVEL_PROJECT) = 0) And _ + ' (VBNumFuncs(docAnalysis, myComponent.CodeModule) = 0) And _ + ' (VBNumLines(docAnalysis, myComponent.CodeModule) < 3) + + ' Code Modules + Dim strFind As String + Dim count As Long + 'Check for: + 'Public Const myFoo .... + 'Public Declare Function .... + 'Public myVar As ... + strFind = VBFindLines(docAnalysis, myComponent.CodeModule, "Public", _ + count, bInProcedure:=False, bWholeWord:=True, bMatchCase:=True) + + bEmptyProject = _ + (VBNumFuncs(docAnalysis, myComponent.CodeModule) = 0) And _ + (VBNumLines(docAnalysis, myComponent.CodeModule) < 3) And _ + (strFind = "") + + CheckEmptyProject = IIf(bEmptyProject, True, False) + Exit Function + + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Function + +Function getCustomDocPropTypeAsString(propType As MsoDocProperties) + Dim Str As String + + Select Case propType + Case msoPropertyTypeBoolean + Str = RID_STR_COMMON_YES_OR_NO + Case msoPropertyTypeDate + Str = RID_STR_COMMON_DATE + Case msoPropertyTypeFloat + Str = RID_STR_COMMON_NUMBER + Case msoPropertyTypeNumber + Str = RID_STR_COMMON_NUMBER + Case msoPropertyTypeString + Str = RID_STR_COMMON_TEXT + Case Else + Str = "Unknown" + End Select + + getCustomDocPropTypeAsString = Str +End Function + +Sub HandleProtectedDocInvalidPassword(docAnalysis As DocumentAnalysis, strError As String, fso As FileSystemObject) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "HandleProtectedDocInvalidPassword" + Dim f As File + Set f = fso.GetFile(docAnalysis.name) + + docAnalysis.Application = RID_STR_COMMON_PASSWORD_SKIPDOC + + On Error Resume Next + docAnalysis.PageCount = 0 + docAnalysis.Created = f.DateCreated + docAnalysis.Modified = f.DateLastModified + docAnalysis.Accessed = f.DateLastAccessed + docAnalysis.Printed = DateValue("01/01/1900") + docAnalysis.SavedBy = RID_STR_COMMON_NA + docAnalysis.Revision = 0 + docAnalysis.Template = RID_STR_COMMON_NA + On Error GoTo HandleErrors + + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_STR_COMMON_SUBISSUE_INVALID_PASSWORD_ENTERED + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_INVALID_PASSWORD_ENTERED + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_PASSWORD + .Values.Add strError + + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + docAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Set f = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_OLEEmbeddedSingleShape(docAnalysis As DocumentAnalysis, aShape As Shape, mySubLocation As Variant) + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_OLEEmbeddedSingleShape" + Dim myIssue As IssueInfo + Dim bOleObject As Boolean + Dim TypeAsString As String + Dim XMLTypeAsString As String + Dim objName As String + + bOleObject = (aShape.Type = msoEmbeddedOLEObject) Or _ + (aShape.Type = msoLinkedOLEObject) Or _ + (aShape.Type = msoOLEControlObject) + + If Not bOleObject Then Exit Sub + + aShape.Select + Select Case aShape.Type + Case msoEmbeddedOLEObject + TypeAsString = RID_STR_COMMON_OLE_EMBEDDED + XMLTypeAsString = CSTR_SUBISSUE_OLE_EMBEDDED + Case msoLinkedOLEObject + TypeAsString = RID_STR_COMMON_OLE_LINKED + XMLTypeAsString = CSTR_SUBISSUE_OLE_LINKED + Case msoOLEControlObject + TypeAsString = RID_STR_COMMON_OLE_CONTROL + XMLTypeAsString = CSTR_SUBISSUE_OLE_CONTROL + Case Else + TypeAsString = RID_STR_COMMON_OLE_UNKNOWN + XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN + End Select + + Dim appStr As String + appStr = getAppSpecificApplicationName + + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_PORTABILITY + .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY + .SubType = TypeAsString + .Location = .CLocationPage + .SubLocation = mySubLocation + + .IssueTypeXML = CSTR_ISSUE_PORTABILITY + .SubTypeXML = XMLTypeAsString + .locationXML = .CXMLLocationPage + + .Line = aShape.top + .column = aShape.Left + + If aShape.name <> "" Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add aShape.name + End If + + If aShape.Type = msoEmbeddedOLEObject Or _ + aShape.Type = msoOLEControlObject Then + Dim objType As String + On Error Resume Next + + objType = getAppSpecificOLEClassType(aShape) + + If objType = "" Then GoTo FinalExit + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE + .Values.Add objType + + If aShape.Type = msoOLEControlObject Then + docAnalysis.MacroNumOLEControls = 1 + docAnalysis.MacroNumOLEControls + End If + + If appStr = CAPPNAME_POWERPOINT Then + '#114127: Too many open windows + 'Checking for OLEFormat.Object is Nothing or IsEmpty still causes problem + If objType <> "Equation.3" Then + objName = aShape.OLEFormat.Object.name + If Err.Number = 0 Then + If aShape.name <> objName Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME + .Values.Add objName + End If + End If + End If + Else + If Not (aShape.OLEFormat.Object) Is Nothing Then + objName = aShape.OLEFormat.Object.name + If Err.Number = 0 Then + If aShape.name <> objName Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME + .Values.Add objName + End If + End If + End If + End If + + On Error GoTo HandleErrors + End If + + If aShape.Type = msoLinkedOLEObject Then + If appStr <> CAPPNAME_WORD Then + On Error Resume Next + Dim path As String + path = aShape.OLEFormat.Object.SourceFullName + If Err.Number = 0 Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE + .Values.Add path + End If + On Error GoTo HandleErrors + Else + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE + .Values.Add aShape.LinkFormat.SourceFullName + End If + End If + + docAnalysis.IssuesCountArray(CID_PORTABILITY) = _ + docAnalysis.IssuesCountArray(CID_PORTABILITY) + 1 + End With + docAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebugLevelTwo currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_Lines(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Lines" + + If myShape.Line.Style = msoLineSingle Or _ + myShape.Line.Style = msoLineStyleMixed Then Exit Sub + + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_RESXLS_COST_LineStyle + .Location = .CLocationPage + .SubLocation = mySubLocation + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_LINE + .locationXML = .CXMLLocationPage + + .Line = myShape.top + .column = myShape.Left + + If myShape.name <> "" Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add myShape.name + End If + + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_LINE_NOTE + + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + docAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_Transparency(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Transparency" + + If Not myShape.Type = msoPicture Then Exit Sub + + Dim bHasTransparentBkg + bHasTransparentBkg = False + + On Error Resume Next + If myShape.PictureFormat.TransparentBackground = msoTrue Then + If Error.Number = 0 Then + bHasTransparentBkg = True + End If + End If + + On Error GoTo HandleErrors + If Not bHasTransparentBkg Then Exit Sub + + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_RESXLS_COST_Transparent + .Location = .CLocationSlide + .SubLocation = mySubLocation + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_TRANSPARENCY + .locationXML = .CXMLLocationPage + + .Line = myShape.top + .column = myShape.Left + + If myShape.name <> "" Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add myShape.name + End If + + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_TRANSPARENCY_NOTE + + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + docAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_Gradients(docAnalysis As DocumentAnalysis, myShape As Shape, mySubLocation As Variant) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Gradients" + + If myShape.Fill.Type <> msoFillGradient Then Exit Sub + + Dim bUsesPresetGradient, bUsesFromCorner, bUsesFromCenter + bUsesPresetGradient = False + bUsesFromCorner = False + bUsesFromCenter = False + + On Error Resume Next + If myShape.Fill.PresetGradientType <> msoPresetGradientMixed Then + If Error.Number = 0 Then + bUsesPresetGradient = True + End If + End If + If myShape.Fill.GradientStyle <> msoGradientFromCorner Then + If Error.Number = 0 Then + bUsesFromCorner = True + End If + End If + If myShape.Fill.GradientStyle <> msoGradientFromCenter Then + If Error.Number = 0 Then + bUsesFromCenter = True + End If + End If + + On Error GoTo HandleErrors + If Not bUsesPresetGradient And Not bUsesFromCorner _ + And Not bUsesFromCenter Then Exit Sub + + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_RESXLS_COST_GradientStyle + .Location = .CLocationSlide + .SubLocation = mySubLocation + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_GRADIENT + .locationXML = .CXMLLocationSlide + + .Line = myShape.top + .column = myShape.Left + + If myShape.name <> "" Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add myShape.name + End If + + If bUsesPresetGradient Then + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_PRESET_NOTE + ElseIf bUsesFromCorner Then + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_CORNER_NOTE + Else + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_SUBISSUE_GRADIENT_CENTER_NOTE + End If + + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + docAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + docAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & docAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Private Function CreateFullPath(newPath As String, fso As FileSystemObject) + 'We don't want to create 'c:\' + If (Len(newPath) < 4) Then + Exit Function + End If + + 'Create parent folder first + If (Not fso.FolderExists(fso.GetParentFolderName(newPath))) Then + CreateFullPath fso.GetParentFolderName(newPath), fso + End If + + If (Not fso.FolderExists(newPath)) Then + fso.CreateFolder (newPath) + End If +End Function + +Function GetPreparedFullPath(sourceDocPath As String, startDir As String, storeToDir As String, _ + fso As FileSystemObject) As String + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "GetPreparedFullPath" + GetPreparedFullPath = "" + + Dim preparedPath As String + + preparedPath = Right(sourceDocPath, Len(sourceDocPath) - Len(startDir)) + If Left(preparedPath, 1) = "\" Then + preparedPath = Right(preparedPath, Len(preparedPath) - 1) + End If + + 'Allow for root folder C:\ + If Right(storeToDir, 1) <> "\" Then + preparedPath = storeToDir & "\" & CSTR_COMMON_PREPARATION_FOLDER & "\" & preparedPath + Else + preparedPath = storeToDir & CSTR_COMMON_PREPARATION_FOLDER & "\" & preparedPath + End If + + 'Debug: MsgBox "Preppath: " & preparedPath + CreateFullPath fso.GetParentFolderName(preparedPath), fso + + 'Only set if folder to save to exists or has been created, otherwise return "" + GetPreparedFullPath = preparedPath + +FinalExit: + Exit Function + +HandleErrors: + WriteDebugLevelTwo currentFunctionName & " : " & sourceDocPath & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function ClassifyDocOverallMacroClass(docAnalysis As DocumentAnalysis) As EnumDocOverallMacroClass + ClassifyDocOverallMacroClass = enMacroNone + + If Not docAnalysis.HasMacros Then Exit Function + + If (docAnalysis.MacroTotalNumLines >= CMACRO_LINECOUNT_MEDIUM_LBOUND) Then + If (docAnalysis.MacroNumExternalRefs > 0) Or _ + (docAnalysis.MacroNumOLEControls > 0 Or docAnalysis.MacroNumFieldsUsingMacros > 0) Or _ + docAnalysis.MacroNumUserForms > 0 Then + ClassifyDocOverallMacroClass = enMacroComplex + Else + ClassifyDocOverallMacroClass = enMacroMedium + End If + Else + ClassifyDocOverallMacroClass = enMacroSimple + End If + +End Function + diff --git a/migrationanalysis/src/driver_docs/sources/word/MigrationAnalyser.cls b/migrationanalysis/src/driver_docs/sources/word/MigrationAnalyser.cls index 5fdd2c80d837..44e1dd1212d7 100644 --- a/migrationanalysis/src/driver_docs/sources/word/MigrationAnalyser.cls +++ b/migrationanalysis/src/driver_docs/sources/word/MigrationAnalyser.cls @@ -1,1518 +1,1518 @@ -VERSION 1.0 CLASS
-BEGIN
- MultiUse = -1 'True
-END
-Attribute VB_Name = "MigrationAnalyser"
-Attribute VB_GlobalNameSpace = False
-Attribute VB_Creatable = False
-Attribute VB_PredeclaredId = False
-Attribute VB_Exposed = False
-'*************************************************************************
-'
-' Licensed to the Apache Software Foundation (ASF) under one
-' or more contributor license agreements. See the NOTICE file
-' distributed with this work for additional information
-' regarding copyright ownership. The ASF licenses this file
-' to you under the Apache License, Version 2.0 (the
-' "License"); you may not use this file except in compliance
-' with the License. You may obtain a copy of the License at
-'
-' http://www.apache.org/licenses/LICENSE-2.0
-'
-' Unless required by applicable law or agreed to in writing,
-' software distributed under the License is distributed on an
-' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-' KIND, either express or implied. See the License for the
-' specific language governing permissions and limitations
-' under the License.
-'
-'*************************************************************************
-
-Option Explicit
-
-'Class variables
-Private Enum HFIssueType
- hfInline
- hfShape
- hfFrame
-End Enum
-
-Private Enum HFIssueLocation
- hfHeader
- hffooter
-End Enum
-
-
-Private Type ShapeInfo
- top As Single
- Height As Single
-End Type
-
-Private Type FrameInfo
- Height As Single
- VerticalPosition As Single
-End Type
-
-Private mAnalysis As DocumentAnalysis
-Private mOdd As Boolean
-Private mbFormFieldErrorLogged As Boolean
-Private mbRefFormFieldErrorLogged As Boolean
-
-'***ADDING-ISSUE: Use Following Skeleton as Guideline for Adding Issue
-' For complete list of all RID_STR_... for Issues (IssueType), SubIssues (SubType) and Attributes refer to:
-' word_res.bas and common_res.bas
-'
-' For complete list of all CID_... for Issue Categories(IssueID) and
-' CSTR_... for XML Issues (IssueTypeXML) and XML SubIssues (SubTypeXML) refer to:
-' ApplicationSpecific.bas and CommonMigrationAnalyser.bas
-'
-' You should not have to add any new Issue Categories or matching IssueTypes, only new SubIssues
-Sub Analyze_SKELETON()
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_SKELETON"
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_VBA_MACROS 'Issue Category
- .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS 'Issue String
- .SubType = RID_STR_COMMON_SUBISSUE_PROPERTIES 'SubIssue String
- .Location = .CLocationDocument 'Location string
-
- .IssueTypeXML = CSTR_ISSUE_VBA_MACROS 'Non localised XML Issue String
- .SubTypeXML = CSTR_SUBISSUE_PROPERTIES 'Non localised XML SubIssue String
- .locationXML = .CXMLLocationDocument 'Non localised XML location
-
- .SubLocation = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND
- .Line = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND
- .column = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND
-
- ' Add as many Attribute Value pairs as needed
- ' Note: following must always be true - Attributes.Count = Values.Count
- .Attributes.Add "AAA"
- .Values.Add "foobar"
-
- ' Use AddIssueDetailsNote to add notes to the Issue Details if required
- ' Public Sub AddIssueDetailsNote(myIssue As IssueInfo, noteNum As Long, noteStr As String, _
- ' Optional preStr As String = RID_STR_COMMON_NOTE_PRE)
- ' Where preStr is prepended to the output, with "Note" as the default
- AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_NOTE_DOCUMENT_PROPERTIES_LOST
-
- 'Only put this in if you have a preparation function added for this issue in CommonPreparation
- 'or Preparation - NUll can be replaced with any variant if you want to pass info to the Prepare fnc
- Call DoPreparation(mAnalysis, myIssue, "", Null, Null)
-
- mAnalysis.IssuesCountArray(CID_VBA_MACROS) = _
- mAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub DoAnalyse(fileName As String, userFormTypesDict As Scripting.Dictionary, _
- startDir As String, storeToDir As String, fso As FileSystemObject)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "DoAnalyse"
- mAnalysis.name = fileName
- Dim aDoc As Document
- Dim bUnprotectError As Boolean
- mAnalysis.TotalIssueTypes = CTOTAL_CATEGORIES
- mbFormFieldErrorLogged = False
- mbRefFormFieldErrorLogged = False
-
- 'Turn off any AutoExce macros before loading the Word doc
- On Error Resume Next ' Ignore errors on setting
- WordBasic.DisableAutoMacros 1
- On Error GoTo HandleErrors
-
- Dim myPassword As String
- myPassword = GetDefaultPassword
-
- 'Always skip password protected documents
- 'If IsSkipPasswordDocs() Then
- Dim aPass As String
- If myPassword <> "" Then
- aPass = myPassword
- Else
- aPass = "xoxoxoxoxo"
- End If
-
- On Error Resume Next
- Set aDoc = Documents.Open(fileName, False, False, False, _
- aPass, aPass, False, aPass, aPass, wdOpenFormatAuto, _
- msoEncodingAutoDetect, False)
- If Err.Number = 5408 Then
- ' if password protected, try open readonly next
- Set aDoc = Documents.Open(fileName, False, True, False, _
- aPass, aPass, False, aPass, aPass, wdOpenFormatAuto, _
- msoEncodingAutoDetect, False)
- End If
- If Err.Number = 5408 Then
- HandleProtectedDocInvalidPassword mAnalysis, _
- "User entered Invalid Document Password, further analysis not possible", fso
- Analyze_Password_Protection True, False
- GoTo FinalExit
- ElseIf (Err.Number <> 0) Then
- GoTo HandleErrors
- End If
-
- On Error GoTo HandleErrors
-
- If aDoc Is Nothing Then GoTo FinalExit
-
- 'Do Analysis
- Analyze_Password_Protection aDoc.HasPassword, aDoc.WriteReserved
- Analyze_Document_Protection aDoc
-
- If aDoc.ProtectionType <> wdNoProtection Then
- If myPassword <> "" Then
- aDoc.Unprotect (myPassword)
- Else
- aDoc.Unprotect
- End If
- End If
-
- 'Set Doc Properties
- SetDocProperties mAnalysis, aDoc, fso
-
-ContinueFromUnprotectError:
-
- Analyze_Tables_TablesInTables aDoc
- Analyze_Tables_Borders aDoc
- Analyze_TOA aDoc
- If Not bUnprotectError Then
- Analyze_FieldAndFormFieldIssues aDoc
- End If
- Analyze_OLEEmbedded aDoc
- Analyze_MailMerge_DataSource aDoc
- Analyze_Macros mAnalysis, userFormTypesDict, aDoc
- 'Analyze_Numbering aDoc, mAnalysis
- 'Analyze_NumberingTabs aDoc, mAnalysis
-
- ' Doc Preparation only
- ' Save document with any prepared issues under <storeToDir>\prepared\<source doc name>
- If mAnalysis.PreparableIssuesCount > 0 And CheckDoPrepare Then
- Dim preparedFullPath As String
- preparedFullPath = GetPreparedFullPath(mAnalysis.name, startDir, storeToDir, fso)
- If preparedFullPath <> "" Then
- If fso.FileExists(preparedFullPath) Then
- fso.DeleteFile preparedFullPath, True
- End If
- If fso.FolderExists(fso.GetParentFolderName(preparedFullPath)) Then
- aDoc.SaveAs preparedFullPath
- End If
- End If
- End If
-
- 'DebugMacroInfo
-
-FinalExit:
-
-
- If Not aDoc Is Nothing Then 'If Not IsEmpty(aDoc) Then
- aDoc.Close (False)
- End If
- Set aDoc = Nothing
-
- Exit Sub
-
-HandleErrors:
- ' MsgBox currentFunctionName & " : " & fileName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- ' Handle Password error on Doc Open, Modify and Cancel
- If Err.Number = 5408 Or Err.Number = 4198 Then
- WriteDebug currentFunctionName & " : " & fileName & ": " & _
- "User entered Invalid Document Password - " & Err.Number & " " & Err.Description & " " & Err.Source
- HandleProtectedDocInvalidPassword mAnalysis, _
- "User entered Invalid Document Password, further analysis not possible", fso
- Resume FinalExit
- ElseIf Err.Number = 5485 Then
- ' Handle Password error on Unprotect Doc
- WriteDebug currentFunctionName & " : " & fileName & ": " & _
- "User entered Invalid Document Part Password, Analysis of doc will continue but will skip analysis of:" & _
- "Forms, Comments, Headers & Footers and Table cell spanning issues - " & Err.Number & " " & Err.Description & " " & Err.Source
- HandleProtectedDocInvalidPassword mAnalysis, _
- "User entered Invalid Document Part Password, Analysis of doc will continue but will skip analysis of:" & vbLf & _
- "Forms, Comments, Headers & Footers and Table cell spanning issues", fso
- bUnprotectError = True
- 'wdAllowOnlyComments, wdAllowOnlyFormFields, wdAllowOnlyRevisions
- Resume ContinueFromUnprotectError
- End If
- mAnalysis.Application = RID_STR_COMMON_CANNOT_OPEN
- WriteDebug currentFunctionName & " : " & fileName & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub DebugMacroInfo()
- MsgBox "TotalNumLines: " & mAnalysis.MacroTotalNumLines & vbLf & _
- "NumUserForms: " & mAnalysis.MacroNumUserForms & vbLf & _
- "NumUserFormControls: " & mAnalysis.MacroNumUserFormControls & vbLf & _
- "NumUserFormControlTypes: " & mAnalysis.MacroNumUserFormControlTypes & vbLf & _
- "NumExternalRefs: " & mAnalysis.MacroNumExternalRefs & vbLf & _
- "MacroNumFieldsUsingMacros: " & mAnalysis.MacroNumFieldsUsingMacros & vbLf & _
- "NumOLEControls: " & mAnalysis.MacroNumOLEControls & vbLf & _
- "MacroOverallClass: " & getDocOverallMacroClassAsString(mAnalysis.MacroOverallClass)
-End Sub
-
-Sub SetDocProperties(docAnalysis As DocumentAnalysis, doc As Document, fso As FileSystemObject)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "SetProperties"
- Dim f As File
- Set f = fso.GetFile(docAnalysis.name)
-
- docAnalysis.PageCount = doc.ComputeStatistics(wdStatisticPages)
- docAnalysis.Accessed = f.DateLastAccessed
-
- On Error Resume Next 'Some apps may not support all props
- docAnalysis.Application = getAppSpecificApplicationName & " " & Application.Version
- 'docAnalysis.Application = doc.BuiltinDocumentProperties(wdPropertyAppName)
- 'If InStr(docAnalysis.Application, "Microsoft") = 1 Then
- ' docAnalysis.Application = Mid(docAnalysis.Application, Len("Microsoft") + 2)
- 'End If
- 'If InStr(Len(docAnalysis.Application) - 2, docAnalysis.Application, ".") = 0 Then
- ' docAnalysis.Application = docAnalysis.Application & " " & Application.Version
- 'End If
-
- docAnalysis.Created = _
- doc.BuiltInDocumentProperties(wdPropertyTimeCreated)
- docAnalysis.Modified = _
- doc.BuiltInDocumentProperties(wdPropertyTimeLastSaved)
- docAnalysis.Printed = _
- doc.BuiltInDocumentProperties(wdPropertyTimeLastPrinted)
- docAnalysis.SavedBy = _
- doc.BuiltInDocumentProperties(wdPropertyLastAuthor)
- docAnalysis.Revision = _
- val(doc.BuiltInDocumentProperties(wdPropertyRevision))
- docAnalysis.Template = _
- fso.GetFileName(doc.BuiltInDocumentProperties(wdPropertyTemplate))
-
-FinalExit:
- Set f = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-'Limitation: Detect first level table in tables, does not detect further nesting
-'Can do so if required
-Sub Analyze_Tables_TablesInTables(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Tables_TablesInTables"
- Dim myTopTable As Table
- Dim myInnerTable As Table
- Dim myIssue As IssueInfo
-
- For Each myTopTable In currDoc.Tables
- For Each myInnerTable In myTopTable.Tables
- Dim logString As String
- Dim myRng As Range
- Dim startpage As Long
- Dim startRow As Long
- Dim StartColumn As Long
- Dim details As String
-
- Set myIssue = New IssueInfo
- Set myRng = myInnerTable.Range
- myRng.start = myRng.End
- startpage = myRng.Information(wdActiveEndPageNumber)
- startRow = myRng.Information(wdStartOfRangeRowNumber)
- StartColumn = myRng.Information(wdStartOfRangeColumnNumber)
-
- With myIssue
- .IssueID = CID_TABLES
- .IssueType = RID_STR_WORD_ISSUE_TABLES
- .SubType = RID_STR_WORD_SUBISSUE_NESTED_TABLES
- .Location = .CLocationPage
- .SubLocation = startpage
-
- .IssueTypeXML = CSTR_ISSUE_TABLES
- .SubTypeXML = CSTR_SUBISSUE_NESTED_TABLES
- .locationXML = .CXMLLocationPage
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_OUTER_TABLE
- .Values.Add myTopTable.Rows.count & "x" & myTopTable.Columns.count
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_INNER_TABLE
- .Values.Add myInnerTable.Rows.count & "x" & myInnerTable.Columns.count
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_START_ROW
- .Values.Add startRow
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_START_COL
- .Values.Add StartColumn
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NESTED_TABLE_WILL_BE_LOST
-
- mAnalysis.IssuesCountArray(CID_TABLES) = _
- mAnalysis.IssuesCountArray(CID_TABLES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- Set myRng = Nothing
- Next
- Next
- Exit Sub
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-Sub Analyze_Document_Protection(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Document_Protection"
- If currDoc.ProtectionType = wdNoProtection Then
- Exit Sub
- End If
-
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_STR_COMMON_SUBISSUE_DOCUMENT_PARTS_PROTECTION
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_DOCUMENT_PARTS_PROTECTION
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_PROTECTION
- Select Case currDoc.ProtectionType
- Case wdAllowOnlyComments
- .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_COMMENTS
- Case wdAllowOnlyFormFields
- .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_FORM_FIELDS
- Case wdAllowOnlyRevisions
- .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_REVISIONS
- Case Else
- .Values.Add RID_STR_COMMON_ATTRIBUTE_UNKNOWN
- End Select
-
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_Password_Protection(bHasPassword As Boolean, bWriteReserved As Boolean)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Password_Protection"
- Dim myIssue As IssueInfo
-
- If bHasPassword Or bWriteReserved Then
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_STR_COMMON_SUBISSUE_PASSWORDS_PROTECTION
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_PASSWORDS_PROTECTION
- .locationXML = .CXMLLocationDocument
-
- If bHasPassword Then
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_OPEN
- .Values.Add RID_STR_WORD_ATTRIBUTE_SET
- End If
- If bWriteReserved Then
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_MODIFY
- .Values.Add RID_STR_WORD_ATTRIBUTE_SET
- End If
-
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- End If
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_OLEEmbedded(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_OLEEmbedded"
-
- ' Handle Inline Shapes
- Dim aILShape As InlineShape
- For Each aILShape In currDoc.InlineShapes
- Analyze_OLEEmbeddedSingleInlineShape aILShape
- Next aILShape
-
- ' Handle Shapes
- Dim aShape As Shape
- For Each aShape In currDoc.Shapes
- Analyze_OLEEmbeddedSingleShape mAnalysis, aShape, _
- Selection.Information(wdActiveEndPageNumber)
- Analyze_Lines mAnalysis, aShape, _
- Selection.Information(wdActiveEndPageNumber)
- Analyze_Transparency mAnalysis, aShape, _
- Selection.Information(wdActiveEndPageNumber)
- Analyze_Gradients mAnalysis, aShape, _
- Selection.Information(wdActiveEndPageNumber)
- Next aShape
-
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-
-'WdInlineShapeType constants:
-'wdInlineShapeEmbeddedOLEObject, wdInlineShapeHorizontalLine, wdInlineShapeLinkedOLEObject,
-'wdInlineShapeLinkedPicture, wdInlineShapeLinkedPictureHorizontalLine, wdInlineShapeOLEControlObject,
-'wdInlineShapeOWSAnchor, wdInlineShapePicture, wdInlineShapePictureBullet,
-'wdInlineShapePictureHorizontalLine, wdInlineShapeScriptAnchor
-
-Sub Analyze_OLEEmbeddedSingleInlineShape(aILShape As InlineShape)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_OLEEmbeddedSingleInlineShape"
- Dim myIssue As IssueInfo
- Dim bOleObject As Boolean
- Dim TypeAsString As String
- Dim XMLTypeAsString As String
- Dim objName As String
-
- bOleObject = (aILShape.Type = wdInlineShapeEmbeddedOLEObject) Or _
- (aILShape.Type = wdInlineShapeLinkedOLEObject) Or _
- (aILShape.Type = wdInlineShapeOLEControlObject)
-
- If Not bOleObject Then Exit Sub
-
- aILShape.Select
- Select Case aILShape.Type
- Case wdInlineShapeOLEControlObject
- TypeAsString = RID_STR_COMMON_OLE_CONTROL
- XMLTypeAsString = CSTR_SUBISSUE_OLE_CONTROL
- Case wdInlineShapeEmbeddedOLEObject
- TypeAsString = RID_STR_COMMON_OLE_EMBEDDED
- XMLTypeAsString = CSTR_SUBISSUE_OLE_EMBEDDED
- Case wdInlineShapeLinkedOLEObject
- TypeAsString = RID_STR_COMMON_OLE_LINKED
- XMLTypeAsString = CSTR_SUBISSUE_OLE_LINKED
- Case Else
- TypeAsString = RID_STR_COMMON_OLE_UNKNOWN
- XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN
- End Select
-
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_PORTABILITY
- .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY
- .SubType = TypeAsString
- .Location = .CLocationPage
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
-
- .IssueTypeXML = CSTR_ISSUE_PORTABILITY
- .SubTypeXML = XMLTypeAsString
- .locationXML = .CXMLLocationPage
-
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
-
- DoEvents
- If aILShape.Type = wdInlineShapeEmbeddedOLEObject Or _
- aILShape.Type = wdInlineShapeOLEControlObject Then
-
- 'If Object is invalid can get automation server hanging
- Dim tmpStr As String
- On Error Resume Next
- tmpStr = aILShape.OLEFormat.Object
- If Err.Number = 0 Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE
- .Values.Add aILShape.OLEFormat.ProgID
- Else
- Err.Clear
- tmpStr = aILShape.OLEFormat.ClassType
- If Err.Number = 0 Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE
- .Values.Add aILShape.OLEFormat.ClassType
- Else
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE
- .Values.Add RID_STR_COMMON_NA
- End If
- End If
-
- If aILShape.Type = wdInlineShapeOLEControlObject Then
- mAnalysis.MacroNumOLEControls = 1 + mAnalysis.MacroNumOLEControls
- End If
-
- objName = aILShape.OLEFormat.Object.name
- If Err.Number = 0 Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME
- .Values.Add objName
- End If
- On Error GoTo HandleErrors
- End If
- If aILShape.Type = wdInlineShapeLinkedOLEObject Then
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE
- .Values.Add aILShape.LinkFormat.SourceFullName
- End If
-
- mAnalysis.IssuesCountArray(CID_PORTABILITY) = _
- mAnalysis.IssuesCountArray(CID_PORTABILITY) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebugLevelTwo currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-'Appears to be picked up by other OLE analysis code - the Shapes are actually field codes
-'So I get double reporting if I use this as well.
-Sub Analyze_OLEFields(myField As Field)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_OLEFields"
- Dim myIssue As IssueInfo
- Dim bOleObject As Boolean
- Dim TypeAsString As String
- Dim XMLTypeAsString As String
-
- bOleObject = (myField.Type = wdFieldOCX)
-
- If Not bOleObject Then Exit Sub
-
- myField.Select
- Select Case myField.Type
- Case wdFieldLink
- TypeAsString = RID_STR_COMMON_OLE_FIELD_LINK
- XMLTypeAsString = CSTR_SUBISSUE_OLE_FIELD_LINK
- Case Else
- TypeAsString = RID_STR_COMMON_OLE_UNKNOWN
- XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN
- End Select
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_PORTABILITY
- .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY
- .SubType = TypeAsString
- .Location = .CLocationPage
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
-
- .IssueTypeXML = CSTR_ISSUE_PORTABILITY
- .SubTypeXML = XMLTypeAsString
- .locationXML = .CXMLLocationPage
-
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE
- .Values.Add myField.OLEFormat.ClassType
-
- If myField.Type = wdFieldLink Then
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_LINK
- .Values.Add myField.LinkFormat.SourceFullName
- End If
- mAnalysis.IssuesCountArray(CID_PORTABILITY) = _
- mAnalysis.IssuesCountArray(CID_PORTABILITY) + 1
- End With
- mAnalysis.Issues.Add myIssue
-
- Set myIssue = Nothing
-
- Exit Sub
-
-HandleErrors:
- Set myIssue = Nothing
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-Sub Analyze_MailMergeField(myField As Field)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_MailMergeField"
- Dim myIssue As IssueInfo
- Dim TypeAsString As String
- Dim bProblemMailMergeField As Boolean
-
- bProblemMailMergeField = _
- (myField.Type = wdFieldFillIn) Or _
- (myField.Type = wdFieldAsk) Or _
- (myField.Type = wdFieldMergeRec) Or _
- (myField.Type = wdFieldMergeField) Or _
- (myField.Type = wdFieldNext) Or _
- (myField.Type = wdFieldRevisionNum) Or _
- (myField.Type = wdFieldSequence) Or _
- (myField.Type = wdFieldAutoNum) Or _
- (myField.Type = wdFieldAutoNumOutline) Or _
- (myField.Type = wdFieldAutoNumLegal)
-
- If bProblemMailMergeField Then
- 'Some of the following are numbering fields and need to be broken out into a seperate function. See migration guide.
-
- Select Case myField.Type
- Case wdFieldFillIn
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_FILL_IN
- Case wdFieldAsk
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_ASK
- Case wdFieldMergeRec
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_RECORDS
- Case wdFieldMergeField
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_FIELDS
- Case wdFieldNext
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_NEXT
- Case wdFieldRevisionNum
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_REVISION_NUMBER
- Case wdFieldSequence
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_SEQUENCE
- Case wdFieldAutoNum
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER
- Case wdFieldAutoNumOutline
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_OUTLINE
- Case wdFieldAutoNumLegal
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_LEGAL
- Case Else
- TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_FIELD_NAME_NOT_KNOWN
- End Select
-
- Set myIssue = New IssueInfo
- myField.Select
- With myIssue
- .IssueID = CID_FIELDS
- .IssueType = RID_STR_WORD_ISSUE_FIELDS
- .SubType = RID_STR_WORD_SUBISSUE_MAILMERGE_FIELD
- .Location = .CLocationPage
-
- .IssueTypeXML = CSTR_ISSUE_FIELDS
- .SubTypeXML = CSTR_SUBISSUE_MAILMERGE_FIELD
- .locationXML = .CXMLLocationPage
-
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add TypeAsString
- If myField.Code.Text <> "" Then
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_TEXT
- .Values.Add myField.Code.Text
- End If
-
- mAnalysis.IssuesCountArray(CID_FIELDS) = _
- mAnalysis.IssuesCountArray(CID_FIELDS) + 1
- End With
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-'Get field DS Info
-Sub Analyze_MailMerge_DataSource(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_MailMerge_DataSource"
- ' There may be no mail merge in the document
- If (currDoc.MailMerge.DataSource.Type = wdNoMergeInfo) Then
- Exit Sub
- End If
-
- 'Dim issue As SimpleAnalysisInfo
- If (currDoc.MailMerge.DataSource.Type <> wdNoMergeInfo) Then
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES
- .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES
- .SubType = RID_STR_WORD_SUBISSUE_MAILMERGE_DATASOURCE
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES
- .SubTypeXML = CSTR_SUBISSUE_MAILMERGE_DATASOURCE
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME
- .Values.Add currDoc.MailMerge.DataSource.name
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_DATASOURCE
- .Values.Add currDoc.MailMerge.DataSource.Type
-
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _
- mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-Function getFormFieldTypeAsString(fieldType As WdFieldType)
- Dim Str As String
-
- Select Case fieldType
- Case wdFieldFormCheckBox
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CHECK_BOX
- Case wdFieldFormDropDown
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DROP_DOWN
- Case wdFieldFormTextInput
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_TEXT
- Case Else
- Str = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- getFormFieldTypeAsString = Str
-End Function
-Function getTextFormFieldTypeAsString(fieldType As WdTextFormFieldType)
- Dim Str As String
-
- Select Case fieldType
- Case wdCalculationText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CALCULATION
- Case wdCurrentDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_DATE
- Case wdCurrentTimeText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_TIME
- Case wdDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DATE
- Case wdNumberText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_NUMBER
- Case wdRegularText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_REGULAR
- Case Else
- Str = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- getTextFormFieldTypeAsString = Str
-End Function
-Function getTextFormFieldDefaultAsString(fieldType As WdTextFormFieldType)
- Dim Str As String
-
- Select Case fieldType
- Case wdCalculationText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_EXPRESSION
- Case wdCurrentDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE
- Case wdCurrentTimeText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TIME
- Case wdDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE
- Case wdNumberText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_NUMBER
- Case wdRegularText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TEXT
- Case Else
- Str = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- getTextFormFieldDefaultAsString = Str
-End Function
-Function getTextFormFieldFormatAsString(fieldType As WdTextFormFieldType)
- Dim Str As String
-
- Select Case fieldType
- Case wdCalculationText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER
- Case wdCurrentDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE
- Case wdCurrentTimeText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TIME
- Case wdDateText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE
- Case wdNumberText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER
- Case wdRegularText
- Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TEXT
- Case Else
- Str = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- getTextFormFieldFormatAsString = Str
-End Function
-
-Sub Analyze_FieldAndFormFieldIssues(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_FormFields"
- Dim myIssue As IssueInfo
-
- 'Analysze all Fields in doc
- Dim myField As Field
-
- For Each myField In currDoc.Fields
- 'Analyze Mail Merge Fields
- Analyze_MailMergeField myField
-
- 'Analyze TOA Fields
- Analyze_TOAField myField
- Next myField
-
- 'Analyze FormField doc issues
- If currDoc.FormFields.count = 0 Then GoTo FinalExit
-
- If (currDoc.FormFields.Shaded) Then
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_FIELDS
- .IssueType = RID_STR_WORD_ISSUE_FIELDS
- .SubType = RID_STR_WORD_SUBISSUE_APPEARANCE
- .Location = .CLocationDocument
-
- .IssueTypeXML = CSTR_ISSUE_FIELDS
- .SubTypeXML = CSTR_SUBISSUE_APPEARANCE
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_GREYED
- .Values.Add RID_STR_WORD_TRUE
- mAnalysis.IssuesCountArray(CID_FIELDS) = _
- mAnalysis.IssuesCountArray(CID_FIELDS) + 1
- End With
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
- 'Analyse all FormFields in doc
- Dim myFormField As FormField
-
- For Each myFormField In currDoc.FormFields
- Analyze_FormFieldIssue myFormField
- Next myFormField
-
-FinalExit:
- Set myIssue = Nothing
- Set myFormField = Nothing
- Exit Sub
-
-HandleErrors:
-
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_FormFieldIssue(myFormField As FormField)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_FormFieldIssue"
- Dim myIssue As IssueInfo
- Dim bCheckBoxIssues As Boolean
- Dim bFormFieldIssues As Boolean
-
- bCheckBoxIssues = False
- If (myFormField.Type = wdFieldFormCheckBox) Then
- If myFormField.CheckBox.AutoSize Then
- bCheckBoxIssues = True
- End If
- End If
-
- bFormFieldIssues = bCheckBoxIssues
-
- If Not bFormFieldIssues Then GoTo FinalExit
-
- myFormField.Select
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_FIELDS
- .IssueType = RID_STR_WORD_ISSUE_FIELDS
- .SubType = RID_STR_WORD_SUBISSUE_FORM_FIELD
- .Location = .CLocationPage
-
- .IssueTypeXML = CSTR_ISSUE_FIELDS
- .SubTypeXML = CSTR_SUBISSUE_FORM_FIELD
- .locationXML = .CXMLLocationPage
-
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
- myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_TYPE
- myIssue.Values.Add getFormFieldTypeAsString(myFormField.Type)
- End With
-
- 'Checkbox Issues
- If (myFormField.Type = wdFieldFormCheckBox) Then
- 'AutoSize CheckBoxes
- If myFormField.CheckBox.AutoSize Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_AUTOSIZE
- myIssue.Values.Add RID_STR_WORD_TRUE
- End If
- End If
-
- 'TextInput Issues
- If myFormField.Type = wdFieldFormTextInput Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_TEXT_FORM_FIELD_TYPE
- myIssue.Values.Add getTextFormFieldTypeAsString(myFormField.TextInput.Type)
- Dim bLostType As Boolean
- bLostType = False
- If (myFormField.TextInput.Type = wdCalculationText) Or _
- (myFormField.TextInput.Type = wdCurrentDateText) Or _
- (myFormField.TextInput.Type = wdCurrentTimeText) Then
- AddIssueDetailsNote myIssue, 0, getTextFormFieldTypeAsString(myFormField.TextInput.Type) & _
- " " & RID_STR_WORD_NOTE_FORM_FIELD_TYPE_LOST
- bLostType = True
- End If
-
- If (myFormField.TextInput.Format <> "") Then
- myIssue.Attributes.Add getTextFormFieldFormatAsString(myFormField.TextInput.Type)
- myIssue.Values.Add myFormField.TextInput.Format
- End If
-
- 'Default text
- If (myFormField.TextInput.Default <> "") Then
- myIssue.Attributes.Add getTextFormFieldDefaultAsString(myFormField.TextInput.Type)
- myIssue.Values.Add myFormField.TextInput.Default
- End If
-
- 'Maximum text
- If (myFormField.TextInput.Width <> 0) Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_MAX_LENGTH
- myIssue.Values.Add myFormField.TextInput.Width
- End If
-
- 'Fill-in disabled
- If (myFormField.Enabled = False) And (Not bLostType) Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_FILLIN_ENABLED
- myIssue.Values.Add RID_STR_WORD_FALSE
- End If
- End If
-
- 'Help Key(F1)
- If (myFormField.OwnHelp And myFormField.HelpText <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_OWN_TEXT
- myIssue.Values.Add myFormField.HelpText
- ElseIf ((Not myFormField.OwnHelp) And myFormField.HelpText <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_AUTO_TEXT
- myIssue.Values.Add myFormField.HelpText
- End If
-
- 'StatusHelp
- If (myFormField.OwnStatus And myFormField.StatusText <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_OWN_TEXT
- myIssue.Values.Add myFormField.StatusText
- ElseIf ((Not myFormField.OwnStatus) And myFormField.StatusText <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_AUTO_TEXT
- myIssue.Values.Add myFormField.StatusText
- End If
-
- 'Macros
- If (myFormField.EntryMacro <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_ENTRY_MACRO
- myIssue.Values.Add myFormField.EntryMacro
- End If
- If (myFormField.ExitMacro <> "") Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_EXIT_MACRO
- myIssue.Values.Add myFormField.ExitMacro
- End If
- If (myFormField.EntryMacro <> "") Or (myFormField.ExitMacro <> "") Then
- mAnalysis.MacroNumFieldsUsingMacros = 1 + mAnalysis.MacroNumFieldsUsingMacros
- End If
-
- 'LockedField
- If (myFormField.Enabled = False) And (myFormField.Type <> wdFieldFormTextInput) Then
- myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_LOCKED
- myIssue.Values.Add RID_STR_WORD_TRUE
- End If
-
- mAnalysis.IssuesCountArray(CID_FIELDS) = _
- mAnalysis.IssuesCountArray(CID_FIELDS) + 1
-
- mAnalysis.Issues.Add myIssue
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- 'Log first occurence for this doc
- If Not mbFormFieldErrorLogged Then
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- mbFormFieldErrorLogged = True
- End If
- Resume FinalExit
-End Sub
-
-
-Sub Analyze_TOA(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_TOA"
-
- Dim toa As TableOfAuthorities
- Dim myIssue As IssueInfo
- Dim myRng As Range
-
- For Each toa In currDoc.TablesOfAuthorities
- Set myRng = toa.Range
- myRng.start = myRng.End
- Set myIssue = New IssueInfo
- myRng.Select
-
- Dim TabLeaderAsString As String
- Select Case toa.TabLeader
- Case wdTabLeaderDashes
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_DASHES
- Case wdTabLeaderDots
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_DOTS
- Case wdTabLeaderHeavy
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_HEAVY
- Case wdTabLeaderLines
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_LINES
- Case wdTabLeaderMiddleDot
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_MIDDLEDOT
- Case wdTabLeaderSpaces
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_SPACES
- Case Else
- TabLeaderAsString = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- Dim FormatAsString As String
- Select Case currDoc.TablesOfAuthorities.Format
- Case wdTOAClassic
- FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_CLASSIC
- Case wdTOADistinctive
- FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_DISTINCTIVE
- Case wdTOAFormal
- FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_FORMAL
- Case wdTOASimple
- FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_SIMPLE
- Case wdTOATemplate
- FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_FROM_TEMPLATE
- Case Else
- FormatAsString = RID_STR_WORD_ENUMERATION_UNKNOWN
- End Select
-
- With myIssue
- .IssueID = CID_INDEX_AND_REFERENCES
- .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES
- .SubType = RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES
- .Location = .CLocationPage
-
- .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES
- .SubTypeXML = CSTR_SUBISSUE_TABLE_OF_AUTHORITIES
- .locationXML = .CXMLLocationPage
-
- .SubLocation = myRng.Information(wdActiveEndPageNumber)
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_LEADER
- .Values.Add TabLeaderAsString
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TOA_MIGRATE_AS_PLAIN_TEXT
-
- mAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _
- mAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- Set myRng = Nothing
- Next
-FinalExit:
- Set myIssue = Nothing
- Set myRng = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_TOAField(myField As Field)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_TOAField"
-
- Dim toa As TableOfAuthorities
- Dim myIssue As IssueInfo
-
- If myField.Type = wdFieldTOAEntry Then
- Set myIssue = New IssueInfo
- myField.Select
-
- With myIssue
- .IssueID = CID_FIELDS
- .IssueType = RID_STR_WORD_ISSUE_FIELDS
- .SubType = RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD
- .Location = .CLocationPage
-
- .IssueTypeXML = CSTR_ISSUE_FIELDS
- .SubTypeXML = CSTR_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD
- .locationXML = .CXMLLocationPage
-
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_FIELD_TEXT
- .Values.Add myField.Code.Text
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TOA_FIELD_LOST_ON_ROUNDTRIP
-
- mAnalysis.IssuesCountArray(CID_FIELDS) = _
- mAnalysis.IssuesCountArray(CID_FIELDS) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub Analyze_Tables_Borders(currDoc As Document)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Tables_Borders"
- Dim myIssue As IssueInfo
- Set myIssue = New IssueInfo
- Dim aTable As Table
- Dim invalidBorders As String
-
- For Each aTable In currDoc.Tables
- invalidBorders = GetInvalidBorder(aTable)
- If invalidBorders <> "" Then
- aTable.Range.Select
- Set myIssue = New IssueInfo
- With myIssue
- .IssueID = CID_TABLES
- .IssueType = RID_STR_WORD_ISSUE_TABLES
- .SubType = RID_STR_WORD_SUBISSUE_BORDER_STYLES
- .Location = .CLocationPage
-
- .IssueTypeXML = CSTR_ISSUE_TABLES
- .SubTypeXML = CSTR_SUBISSUE_BORDER_STYLES
- .locationXML = .CXMLLocationPage
-
- .SubLocation = Selection.Information(wdActiveEndPageNumber)
- .Line = Selection.Information(wdFirstCharacterLineNumber)
- .column = Selection.Information(wdFirstCharacterColumnNumber)
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_BORDERS_NOT_DISPLAYING
- .Values.Add invalidBorders
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TABLE_BORDER
-
- mAnalysis.IssuesCountArray(CID_TABLES) = mAnalysis.IssuesCountArray(CID_TABLES) + 1
- End With
-
- mAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
- Next aTable
-FinalExit:
- Set myIssue = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-Function GetInvalidBorder(aTable As Table) As String
-
- Dim theResult As String
- theResult = ""
-
- If IsInvalidBorderStyle(aTable.Borders(wdBorderTop).LineStyle) Then
- theResult = theResult + "Top, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderBottom).LineStyle) Then
- theResult = theResult + "Bottom, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderDiagonalDown).LineStyle) Then
- theResult = theResult + "Down Diagonal, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderDiagonalUp).LineStyle) Then
- theResult = theResult + "Up Diagonal, "
-
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderHorizontal).LineStyle) Then
- theResult = theResult + "Horizontal, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderLeft).LineStyle) Then
- theResult = theResult + "Left, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderRight).LineStyle) Then
- theResult = theResult + "Right, "
- End If
- If IsInvalidBorderStyle(aTable.Borders(wdBorderVertical).LineStyle) Then
- theResult = theResult + "Vertical, "
- End If
-
- If theResult <> "" Then
- theResult = Left(theResult, (Len(theResult) - 2)) + "."
- End If
-
- GetInvalidBorder = theResult
-End Function
-
-Function IsInvalidBorderStyle(aStyle As WdLineStyle) As Boolean
-
- Dim IsInvalid As Boolean
-
- Select Case aStyle
- Case wdLineStyleDot, wdLineStyleDashSmallGap, wdLineStyleDashLargeGap, wdLineStyleDashDot, _
- wdLineStyleDashDotDot, wdLineStyleTriple, wdLineStyleThinThickThinSmallGap, wdLineStyleThinThickMedGap, _
- wdLineStyleThickThinMedGap, wdLineStyleThinThickThinMedGap, wdLineStyleThinThickLargeGap, _
- wdLineStyleThickThinLargeGap, wdLineStyleThinThickThinLargeGap, wdLineStyleSingleWavy, _
- wdLineStyleDoubleWavy, wdLineStyleDashDotStroked, wdLineStyleEmboss3D, wdLineStyleEngrave3D
- IsInvalid = True
- Case Else
- IsInvalid = False
- End Select
-
- IsInvalidBorderStyle = IsInvalid
-
-End Function
-
-Private Sub Class_Initialize()
- Set mAnalysis = New DocumentAnalysis
-End Sub
-Private Sub Class_Terminate()
- Set mAnalysis = Nothing
-End Sub
-
-Public Property Get Results() As DocumentAnalysis
- Set Results = mAnalysis
-End Property
-
-Sub Analyze_NumberingTabs(currDoc As Document, docAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_NumberingTabs"
-
- Dim tb As TabStop
- Dim customTabPos As Single
- Dim tabs As Integer
- Dim listLvl As Long
- Dim tp As Single
- Dim bHasAlignmentProblem As Boolean
- Dim bHasTooManyTabs As Boolean
- Dim myIssue As IssueInfo
- Dim p As Object
-
- bHasAlignmentProblem = False
- bHasTooManyTabs = False
-
- For Each p In currDoc.ListParagraphs
- tabs = 0
- For Each tb In p.TabStops
- If tb.customTab Then
- tabs = tabs + 1
- customTabPos = tb.Position
- End If
- Next
-
- If tabs = 1 Then
- listLvl = p.Range.ListFormat.ListLevelNumber
- tp = p.Range.ListFormat.ListTemplate.ListLevels.item(listLvl).TabPosition
- If (p.Range.ListFormat.ListTemplate.ListLevels.item(listLvl).Alignment <> _
- wdListLevelAlignLeft) Then
- ' ERROR: alignment problem
- bHasAlignmentProblem = True
- End If
-
- If tp <> customTabPos Then
- p.Range.InsertBefore ("XXXXX")
- End If
- 'OK - at least heuristically
- Else
- 'ERROR: too many tabs
- bHasTooManyTabs = True
- End If
- Next
-
- If (bHasAlignmentProblem) Then
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_INDEX_AND_REFERENCES
- .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES
- .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_TAB_ALIGNMENT
- .Location = .CLocationDocument 'Location string
-
- .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES
- .SubTypeXML = CSTR_SUBISSUE_NUMBERING_TAB_ALIGNMENT
- .locationXML = .CXMLLocationDocument
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_TAB_ALIGNMENT
-
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1
- End With
- docAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
- If (bHasTooManyTabs) Then
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_INDEX_AND_REFERENCES
- .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES
- .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_TAB_OVERFLOW
- .Location = .CLocationDocument 'Location string
-
- .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES
- .SubTypeXML = CSTR_SUBISSUE_NUMBERING_TAB_OVERFLOW
- .locationXML = .CXMLLocationDocument
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_TAB_OVERFLOW
-
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1
- End With
- docAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Set myIssue = Nothing
- Resume FinalExit
-End Sub
-
-Sub Analyze_Numbering(currDoc As Document, docAnalysis As DocumentAnalysis)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Analyze_Numbering"
-
- Dim myIssue As IssueInfo
- Dim nFormatProblems As Integer
- Dim nAlignmentProblems As Integer
- nFormatProblems = 0
- nAlignmentProblems = 0
-
- Dim lt As ListTemplate
- Dim lvl As ListLevel
- Dim I, l_, p1, p2, v1, v2 As Integer
- Dim display_levels As Integer
- Dim fmt, prefix, postfix, res As String
-
- For Each lt In currDoc.ListTemplates
- l_ = 0
- For Each lvl In lt.ListLevels
- l_ = l_ + 1
- 'Selection.TypeText Text:="List Number Format " + lvl.NumberFormat
- 'Apply Heuristic
- fmt = lvl.NumberFormat
- p1 = InStr(fmt, "%")
- p2 = InStrRev(fmt, "%")
- v1 = val(Mid(fmt, p1 + 1, 1))
- v2 = val(Mid(fmt, p2 + 1, 1))
- display_levels = v2 - v1 + 1
- prefix = Mid(fmt, 1, p1 - 1)
- postfix = Mid(fmt, p2 + 2)
- 'Check Heuristic
- res = prefix
- For I = 2 To display_levels
- res = "%" + Trim(Str(l_ - I + 1)) + "." + res
- Next
- res = res + "%" + Trim(Str(l_)) + postfix
- If (StrComp(res, fmt) <> 0) Then
- nFormatProblems = nFormatProblems + 1
- 'Selection.TypeText Text:="Label Problem: NumberFormat=" + fmt + " Heuristic=" + res
- End If
-
- 'check alignment
- If (lvl.NumberPosition <> wdListLevelAlignLeft) Then
- nAlignmentProblems = nAlignmentProblems + 1
- 'Selection.TypeText Text:="Number alignment problem"
- End If
- Next
- Next
-
- If (nFormatProblems > 0) Then
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_INDEX_AND_REFERENCES
- .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES
- .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_FORMAT
- .Location = .CLocationDocument 'Location string
-
- .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES
- .SubTypeXML = CSTR_SUBISSUE_NUMBERING_FORMAT
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_COUNT
- .Values.Add nFormatProblems
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_FORMAT
-
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1
- End With
- docAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
- If (nAlignmentProblems > 0) Then
- Set myIssue = New IssueInfo
-
- With myIssue
- .IssueID = CID_INDEX_AND_REFERENCES
- .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES
- .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_ALIGNMENT
- .Location = .CLocationDocument 'Location string
-
- .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES
- .SubTypeXML = CSTR_SUBISSUE_NUMBERING_ALIGNMENT
- .locationXML = .CXMLLocationDocument
-
- .Attributes.Add RID_STR_WORD_ATTRIBUTE_COUNT
- .Values.Add nAlignmentProblems
-
- AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_ALIGNMENT
-
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _
- docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1
- End With
- docAnalysis.Issues.Add myIssue
- Set myIssue = Nothing
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source
- Set myIssue = Nothing
- Resume FinalExit
-End Sub
-
+VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "MigrationAnalyser" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************************* +' +' Licensed to the Apache Software Foundation (ASF) under one +' or more contributor license agreements. See the NOTICE file +' distributed with this work for additional information +' regarding copyright ownership. The ASF licenses this file +' to you under the Apache License, Version 2.0 (the +' "License"); you may not use this file except in compliance +' with the License. You may obtain a copy of the License at +' +' http://www.apache.org/licenses/LICENSE-2.0 +' +' Unless required by applicable law or agreed to in writing, +' software distributed under the License is distributed on an +' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +' KIND, either express or implied. See the License for the +' specific language governing permissions and limitations +' under the License. +' +'************************************************************************* + +Option Explicit + +'Class variables +Private Enum HFIssueType + hfInline + hfShape + hfFrame +End Enum + +Private Enum HFIssueLocation + hfHeader + hffooter +End Enum + + +Private Type ShapeInfo + top As Single + Height As Single +End Type + +Private Type FrameInfo + Height As Single + VerticalPosition As Single +End Type + +Private mAnalysis As DocumentAnalysis +Private mOdd As Boolean +Private mbFormFieldErrorLogged As Boolean +Private mbRefFormFieldErrorLogged As Boolean + +'***ADDING-ISSUE: Use Following Skeleton as Guideline for Adding Issue +' For complete list of all RID_STR_... for Issues (IssueType), SubIssues (SubType) and Attributes refer to: +' word_res.bas and common_res.bas +' +' For complete list of all CID_... for Issue Categories(IssueID) and +' CSTR_... for XML Issues (IssueTypeXML) and XML SubIssues (SubTypeXML) refer to: +' ApplicationSpecific.bas and CommonMigrationAnalyser.bas +' +' You should not have to add any new Issue Categories or matching IssueTypes, only new SubIssues +Sub Analyze_SKELETON() + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_SKELETON" + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_VBA_MACROS 'Issue Category + .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS 'Issue String + .SubType = RID_STR_COMMON_SUBISSUE_PROPERTIES 'SubIssue String + .Location = .CLocationDocument 'Location string + + .IssueTypeXML = CSTR_ISSUE_VBA_MACROS 'Non localised XML Issue String + .SubTypeXML = CSTR_SUBISSUE_PROPERTIES 'Non localised XML SubIssue String + .locationXML = .CXMLLocationDocument 'Non localised XML location + + .SubLocation = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND + .Line = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND + .column = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND + + ' Add as many Attribute Value pairs as needed + ' Note: following must always be true - Attributes.Count = Values.Count + .Attributes.Add "AAA" + .Values.Add "foobar" + + ' Use AddIssueDetailsNote to add notes to the Issue Details if required + ' Public Sub AddIssueDetailsNote(myIssue As IssueInfo, noteNum As Long, noteStr As String, _ + ' Optional preStr As String = RID_STR_COMMON_NOTE_PRE) + ' Where preStr is prepended to the output, with "Note" as the default + AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_NOTE_DOCUMENT_PROPERTIES_LOST + + 'Only put this in if you have a preparation function added for this issue in CommonPreparation + 'or Preparation - NUll can be replaced with any variant if you want to pass info to the Prepare fnc + Call DoPreparation(mAnalysis, myIssue, "", Null, Null) + + mAnalysis.IssuesCountArray(CID_VBA_MACROS) = _ + mAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1 + End With + + mAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub DoAnalyse(fileName As String, userFormTypesDict As Scripting.Dictionary, _ + startDir As String, storeToDir As String, fso As FileSystemObject) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "DoAnalyse" + mAnalysis.name = fileName + Dim aDoc As Document + Dim bUnprotectError As Boolean + mAnalysis.TotalIssueTypes = CTOTAL_CATEGORIES + mbFormFieldErrorLogged = False + mbRefFormFieldErrorLogged = False + + 'Turn off any AutoExce macros before loading the Word doc + On Error Resume Next ' Ignore errors on setting + WordBasic.DisableAutoMacros 1 + On Error GoTo HandleErrors + + Dim myPassword As String + myPassword = GetDefaultPassword + + 'Always skip password protected documents + 'If IsSkipPasswordDocs() Then + Dim aPass As String + If myPassword <> "" Then + aPass = myPassword + Else + aPass = "xoxoxoxoxo" + End If + + On Error Resume Next + Set aDoc = Documents.Open(fileName, False, False, False, _ + aPass, aPass, False, aPass, aPass, wdOpenFormatAuto, _ + msoEncodingAutoDetect, False) + If Err.Number = 5408 Then + ' if password protected, try open readonly next + Set aDoc = Documents.Open(fileName, False, True, False, _ + aPass, aPass, False, aPass, aPass, wdOpenFormatAuto, _ + msoEncodingAutoDetect, False) + End If + If Err.Number = 5408 Then + HandleProtectedDocInvalidPassword mAnalysis, _ + "User entered Invalid Document Password, further analysis not possible", fso + Analyze_Password_Protection True, False + GoTo FinalExit + ElseIf (Err.Number <> 0) Then + GoTo HandleErrors + End If + + On Error GoTo HandleErrors + + If aDoc Is Nothing Then GoTo FinalExit + + 'Do Analysis + Analyze_Password_Protection aDoc.HasPassword, aDoc.WriteReserved + Analyze_Document_Protection aDoc + + If aDoc.ProtectionType <> wdNoProtection Then + If myPassword <> "" Then + aDoc.Unprotect (myPassword) + Else + aDoc.Unprotect + End If + End If + + 'Set Doc Properties + SetDocProperties mAnalysis, aDoc, fso + +ContinueFromUnprotectError: + + Analyze_Tables_TablesInTables aDoc + Analyze_Tables_Borders aDoc + Analyze_TOA aDoc + If Not bUnprotectError Then + Analyze_FieldAndFormFieldIssues aDoc + End If + Analyze_OLEEmbedded aDoc + Analyze_MailMerge_DataSource aDoc + Analyze_Macros mAnalysis, userFormTypesDict, aDoc + 'Analyze_Numbering aDoc, mAnalysis + 'Analyze_NumberingTabs aDoc, mAnalysis + + ' Doc Preparation only + ' Save document with any prepared issues under <storeToDir>\prepared\<source doc name> + If mAnalysis.PreparableIssuesCount > 0 And CheckDoPrepare Then + Dim preparedFullPath As String + preparedFullPath = GetPreparedFullPath(mAnalysis.name, startDir, storeToDir, fso) + If preparedFullPath <> "" Then + If fso.FileExists(preparedFullPath) Then + fso.DeleteFile preparedFullPath, True + End If + If fso.FolderExists(fso.GetParentFolderName(preparedFullPath)) Then + aDoc.SaveAs preparedFullPath + End If + End If + End If + + 'DebugMacroInfo + +FinalExit: + + + If Not aDoc Is Nothing Then 'If Not IsEmpty(aDoc) Then + aDoc.Close (False) + End If + Set aDoc = Nothing + + Exit Sub + +HandleErrors: + ' MsgBox currentFunctionName & " : " & fileName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + ' Handle Password error on Doc Open, Modify and Cancel + If Err.Number = 5408 Or Err.Number = 4198 Then + WriteDebug currentFunctionName & " : " & fileName & ": " & _ + "User entered Invalid Document Password - " & Err.Number & " " & Err.Description & " " & Err.Source + HandleProtectedDocInvalidPassword mAnalysis, _ + "User entered Invalid Document Password, further analysis not possible", fso + Resume FinalExit + ElseIf Err.Number = 5485 Then + ' Handle Password error on Unprotect Doc + WriteDebug currentFunctionName & " : " & fileName & ": " & _ + "User entered Invalid Document Part Password, Analysis of doc will continue but will skip analysis of:" & _ + "Forms, Comments, Headers & Footers and Table cell spanning issues - " & Err.Number & " " & Err.Description & " " & Err.Source + HandleProtectedDocInvalidPassword mAnalysis, _ + "User entered Invalid Document Part Password, Analysis of doc will continue but will skip analysis of:" & vbLf & _ + "Forms, Comments, Headers & Footers and Table cell spanning issues", fso + bUnprotectError = True + 'wdAllowOnlyComments, wdAllowOnlyFormFields, wdAllowOnlyRevisions + Resume ContinueFromUnprotectError + End If + mAnalysis.Application = RID_STR_COMMON_CANNOT_OPEN + WriteDebug currentFunctionName & " : " & fileName & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub DebugMacroInfo() + MsgBox "TotalNumLines: " & mAnalysis.MacroTotalNumLines & vbLf & _ + "NumUserForms: " & mAnalysis.MacroNumUserForms & vbLf & _ + "NumUserFormControls: " & mAnalysis.MacroNumUserFormControls & vbLf & _ + "NumUserFormControlTypes: " & mAnalysis.MacroNumUserFormControlTypes & vbLf & _ + "NumExternalRefs: " & mAnalysis.MacroNumExternalRefs & vbLf & _ + "MacroNumFieldsUsingMacros: " & mAnalysis.MacroNumFieldsUsingMacros & vbLf & _ + "NumOLEControls: " & mAnalysis.MacroNumOLEControls & vbLf & _ + "MacroOverallClass: " & getDocOverallMacroClassAsString(mAnalysis.MacroOverallClass) +End Sub + +Sub SetDocProperties(docAnalysis As DocumentAnalysis, doc As Document, fso As FileSystemObject) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "SetProperties" + Dim f As File + Set f = fso.GetFile(docAnalysis.name) + + docAnalysis.PageCount = doc.ComputeStatistics(wdStatisticPages) + docAnalysis.Accessed = f.DateLastAccessed + + On Error Resume Next 'Some apps may not support all props + docAnalysis.Application = getAppSpecificApplicationName & " " & Application.Version + 'docAnalysis.Application = doc.BuiltinDocumentProperties(wdPropertyAppName) + 'If InStr(docAnalysis.Application, "Microsoft") = 1 Then + ' docAnalysis.Application = Mid(docAnalysis.Application, Len("Microsoft") + 2) + 'End If + 'If InStr(Len(docAnalysis.Application) - 2, docAnalysis.Application, ".") = 0 Then + ' docAnalysis.Application = docAnalysis.Application & " " & Application.Version + 'End If + + docAnalysis.Created = _ + doc.BuiltInDocumentProperties(wdPropertyTimeCreated) + docAnalysis.Modified = _ + doc.BuiltInDocumentProperties(wdPropertyTimeLastSaved) + docAnalysis.Printed = _ + doc.BuiltInDocumentProperties(wdPropertyTimeLastPrinted) + docAnalysis.SavedBy = _ + doc.BuiltInDocumentProperties(wdPropertyLastAuthor) + docAnalysis.Revision = _ + val(doc.BuiltInDocumentProperties(wdPropertyRevision)) + docAnalysis.Template = _ + fso.GetFileName(doc.BuiltInDocumentProperties(wdPropertyTemplate)) + +FinalExit: + Set f = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +'Limitation: Detect first level table in tables, does not detect further nesting +'Can do so if required +Sub Analyze_Tables_TablesInTables(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Tables_TablesInTables" + Dim myTopTable As Table + Dim myInnerTable As Table + Dim myIssue As IssueInfo + + For Each myTopTable In currDoc.Tables + For Each myInnerTable In myTopTable.Tables + Dim logString As String + Dim myRng As Range + Dim startpage As Long + Dim startRow As Long + Dim StartColumn As Long + Dim details As String + + Set myIssue = New IssueInfo + Set myRng = myInnerTable.Range + myRng.start = myRng.End + startpage = myRng.Information(wdActiveEndPageNumber) + startRow = myRng.Information(wdStartOfRangeRowNumber) + StartColumn = myRng.Information(wdStartOfRangeColumnNumber) + + With myIssue + .IssueID = CID_TABLES + .IssueType = RID_STR_WORD_ISSUE_TABLES + .SubType = RID_STR_WORD_SUBISSUE_NESTED_TABLES + .Location = .CLocationPage + .SubLocation = startpage + + .IssueTypeXML = CSTR_ISSUE_TABLES + .SubTypeXML = CSTR_SUBISSUE_NESTED_TABLES + .locationXML = .CXMLLocationPage + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_OUTER_TABLE + .Values.Add myTopTable.Rows.count & "x" & myTopTable.Columns.count + .Attributes.Add RID_STR_WORD_ATTRIBUTE_INNER_TABLE + .Values.Add myInnerTable.Rows.count & "x" & myInnerTable.Columns.count + .Attributes.Add RID_STR_WORD_ATTRIBUTE_START_ROW + .Values.Add startRow + .Attributes.Add RID_STR_WORD_ATTRIBUTE_START_COL + .Values.Add StartColumn + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NESTED_TABLE_WILL_BE_LOST + + mAnalysis.IssuesCountArray(CID_TABLES) = _ + mAnalysis.IssuesCountArray(CID_TABLES) + 1 + End With + + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + Set myRng = Nothing + Next + Next + Exit Sub +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +Sub Analyze_Document_Protection(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Document_Protection" + If currDoc.ProtectionType = wdNoProtection Then + Exit Sub + End If + + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_STR_COMMON_SUBISSUE_DOCUMENT_PARTS_PROTECTION + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_DOCUMENT_PARTS_PROTECTION + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_PROTECTION + Select Case currDoc.ProtectionType + Case wdAllowOnlyComments + .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_COMMENTS + Case wdAllowOnlyFormFields + .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_FORM_FIELDS + Case wdAllowOnlyRevisions + .Values.Add RID_STR_WORD_ATTRIBUTE_ALLOW_ONLY_REVISIONS + Case Else + .Values.Add RID_STR_COMMON_ATTRIBUTE_UNKNOWN + End Select + + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + mAnalysis.Issues.Add myIssue +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_Password_Protection(bHasPassword As Boolean, bWriteReserved As Boolean) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Password_Protection" + Dim myIssue As IssueInfo + + If bHasPassword Or bWriteReserved Then + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_STR_COMMON_SUBISSUE_PASSWORDS_PROTECTION + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_PASSWORDS_PROTECTION + .locationXML = .CXMLLocationDocument + + If bHasPassword Then + .Attributes.Add RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_OPEN + .Values.Add RID_STR_WORD_ATTRIBUTE_SET + End If + If bWriteReserved Then + .Attributes.Add RID_STR_WORD_ATTRIBUTE_PASSWORD_TO_MODIFY + .Values.Add RID_STR_WORD_ATTRIBUTE_SET + End If + + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + mAnalysis.Issues.Add myIssue + End If +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_OLEEmbedded(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_OLEEmbedded" + + ' Handle Inline Shapes + Dim aILShape As InlineShape + For Each aILShape In currDoc.InlineShapes + Analyze_OLEEmbeddedSingleInlineShape aILShape + Next aILShape + + ' Handle Shapes + Dim aShape As Shape + For Each aShape In currDoc.Shapes + Analyze_OLEEmbeddedSingleShape mAnalysis, aShape, _ + Selection.Information(wdActiveEndPageNumber) + Analyze_Lines mAnalysis, aShape, _ + Selection.Information(wdActiveEndPageNumber) + Analyze_Transparency mAnalysis, aShape, _ + Selection.Information(wdActiveEndPageNumber) + Analyze_Gradients mAnalysis, aShape, _ + Selection.Information(wdActiveEndPageNumber) + Next aShape + + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + + +'WdInlineShapeType constants: +'wdInlineShapeEmbeddedOLEObject, wdInlineShapeHorizontalLine, wdInlineShapeLinkedOLEObject, +'wdInlineShapeLinkedPicture, wdInlineShapeLinkedPictureHorizontalLine, wdInlineShapeOLEControlObject, +'wdInlineShapeOWSAnchor, wdInlineShapePicture, wdInlineShapePictureBullet, +'wdInlineShapePictureHorizontalLine, wdInlineShapeScriptAnchor + +Sub Analyze_OLEEmbeddedSingleInlineShape(aILShape As InlineShape) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_OLEEmbeddedSingleInlineShape" + Dim myIssue As IssueInfo + Dim bOleObject As Boolean + Dim TypeAsString As String + Dim XMLTypeAsString As String + Dim objName As String + + bOleObject = (aILShape.Type = wdInlineShapeEmbeddedOLEObject) Or _ + (aILShape.Type = wdInlineShapeLinkedOLEObject) Or _ + (aILShape.Type = wdInlineShapeOLEControlObject) + + If Not bOleObject Then Exit Sub + + aILShape.Select + Select Case aILShape.Type + Case wdInlineShapeOLEControlObject + TypeAsString = RID_STR_COMMON_OLE_CONTROL + XMLTypeAsString = CSTR_SUBISSUE_OLE_CONTROL + Case wdInlineShapeEmbeddedOLEObject + TypeAsString = RID_STR_COMMON_OLE_EMBEDDED + XMLTypeAsString = CSTR_SUBISSUE_OLE_EMBEDDED + Case wdInlineShapeLinkedOLEObject + TypeAsString = RID_STR_COMMON_OLE_LINKED + XMLTypeAsString = CSTR_SUBISSUE_OLE_LINKED + Case Else + TypeAsString = RID_STR_COMMON_OLE_UNKNOWN + XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN + End Select + + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_PORTABILITY + .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY + .SubType = TypeAsString + .Location = .CLocationPage + .SubLocation = Selection.Information(wdActiveEndPageNumber) + + .IssueTypeXML = CSTR_ISSUE_PORTABILITY + .SubTypeXML = XMLTypeAsString + .locationXML = .CXMLLocationPage + + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + + DoEvents + If aILShape.Type = wdInlineShapeEmbeddedOLEObject Or _ + aILShape.Type = wdInlineShapeOLEControlObject Then + + 'If Object is invalid can get automation server hanging + Dim tmpStr As String + On Error Resume Next + tmpStr = aILShape.OLEFormat.Object + If Err.Number = 0 Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE + .Values.Add aILShape.OLEFormat.ProgID + Else + Err.Clear + tmpStr = aILShape.OLEFormat.ClassType + If Err.Number = 0 Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE + .Values.Add aILShape.OLEFormat.ClassType + Else + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE + .Values.Add RID_STR_COMMON_NA + End If + End If + + If aILShape.Type = wdInlineShapeOLEControlObject Then + mAnalysis.MacroNumOLEControls = 1 + mAnalysis.MacroNumOLEControls + End If + + objName = aILShape.OLEFormat.Object.name + If Err.Number = 0 Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_NAME + .Values.Add objName + End If + On Error GoTo HandleErrors + End If + If aILShape.Type = wdInlineShapeLinkedOLEObject Then + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE + .Values.Add aILShape.LinkFormat.SourceFullName + End If + + mAnalysis.IssuesCountArray(CID_PORTABILITY) = _ + mAnalysis.IssuesCountArray(CID_PORTABILITY) + 1 + End With + + mAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebugLevelTwo currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +'Appears to be picked up by other OLE analysis code - the Shapes are actually field codes +'So I get double reporting if I use this as well. +Sub Analyze_OLEFields(myField As Field) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_OLEFields" + Dim myIssue As IssueInfo + Dim bOleObject As Boolean + Dim TypeAsString As String + Dim XMLTypeAsString As String + + bOleObject = (myField.Type = wdFieldOCX) + + If Not bOleObject Then Exit Sub + + myField.Select + Select Case myField.Type + Case wdFieldLink + TypeAsString = RID_STR_COMMON_OLE_FIELD_LINK + XMLTypeAsString = CSTR_SUBISSUE_OLE_FIELD_LINK + Case Else + TypeAsString = RID_STR_COMMON_OLE_UNKNOWN + XMLTypeAsString = CSTR_SUBISSUE_OLE_UNKNOWN + End Select + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_PORTABILITY + .IssueType = RID_STR_COMMON_ISSUE_PORTABILITY + .SubType = TypeAsString + .Location = .CLocationPage + .SubLocation = Selection.Information(wdActiveEndPageNumber) + + .IssueTypeXML = CSTR_ISSUE_PORTABILITY + .SubTypeXML = XMLTypeAsString + .locationXML = .CXMLLocationPage + + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_OBJECT_TYPE + .Values.Add myField.OLEFormat.ClassType + + If myField.Type = wdFieldLink Then + .Attributes.Add RID_STR_WORD_ATTRIBUTE_LINK + .Values.Add myField.LinkFormat.SourceFullName + End If + mAnalysis.IssuesCountArray(CID_PORTABILITY) = _ + mAnalysis.IssuesCountArray(CID_PORTABILITY) + 1 + End With + mAnalysis.Issues.Add myIssue + + Set myIssue = Nothing + + Exit Sub + +HandleErrors: + Set myIssue = Nothing + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +Sub Analyze_MailMergeField(myField As Field) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_MailMergeField" + Dim myIssue As IssueInfo + Dim TypeAsString As String + Dim bProblemMailMergeField As Boolean + + bProblemMailMergeField = _ + (myField.Type = wdFieldFillIn) Or _ + (myField.Type = wdFieldAsk) Or _ + (myField.Type = wdFieldMergeRec) Or _ + (myField.Type = wdFieldMergeField) Or _ + (myField.Type = wdFieldNext) Or _ + (myField.Type = wdFieldRevisionNum) Or _ + (myField.Type = wdFieldSequence) Or _ + (myField.Type = wdFieldAutoNum) Or _ + (myField.Type = wdFieldAutoNumOutline) Or _ + (myField.Type = wdFieldAutoNumLegal) + + If bProblemMailMergeField Then + 'Some of the following are numbering fields and need to be broken out into a separate function. See migration guide. + + Select Case myField.Type + Case wdFieldFillIn + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_FILL_IN + Case wdFieldAsk + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_ASK + Case wdFieldMergeRec + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_RECORDS + Case wdFieldMergeField + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_MERGE_FIELDS + Case wdFieldNext + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_NEXT + Case wdFieldRevisionNum + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_REVISION_NUMBER + Case wdFieldSequence + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_SEQUENCE + Case wdFieldAutoNum + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER + Case wdFieldAutoNumOutline + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_OUTLINE + Case wdFieldAutoNumLegal + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_AUTO_NUMBER_LEGAL + Case Else + TypeAsString = RID_STR_WORD_ENUMERATION_MAILMERGE_FIELD_NAME_NOT_KNOWN + End Select + + Set myIssue = New IssueInfo + myField.Select + With myIssue + .IssueID = CID_FIELDS + .IssueType = RID_STR_WORD_ISSUE_FIELDS + .SubType = RID_STR_WORD_SUBISSUE_MAILMERGE_FIELD + .Location = .CLocationPage + + .IssueTypeXML = CSTR_ISSUE_FIELDS + .SubTypeXML = CSTR_SUBISSUE_MAILMERGE_FIELD + .locationXML = .CXMLLocationPage + + .SubLocation = Selection.Information(wdActiveEndPageNumber) + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add TypeAsString + If myField.Code.Text <> "" Then + .Attributes.Add RID_STR_WORD_ATTRIBUTE_TEXT + .Values.Add myField.Code.Text + End If + + mAnalysis.IssuesCountArray(CID_FIELDS) = _ + mAnalysis.IssuesCountArray(CID_FIELDS) + 1 + End With + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +'Get field DS Info +Sub Analyze_MailMerge_DataSource(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_MailMerge_DataSource" + ' There may be no mail merge in the document + If (currDoc.MailMerge.DataSource.Type = wdNoMergeInfo) Then + Exit Sub + End If + + 'Dim issue As SimpleAnalysisInfo + If (currDoc.MailMerge.DataSource.Type <> wdNoMergeInfo) Then + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES + .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES + .SubType = RID_STR_WORD_SUBISSUE_MAILMERGE_DATASOURCE + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES + .SubTypeXML = CSTR_SUBISSUE_MAILMERGE_DATASOURCE + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME + .Values.Add currDoc.MailMerge.DataSource.name + .Attributes.Add RID_STR_WORD_ATTRIBUTE_DATASOURCE + .Values.Add currDoc.MailMerge.DataSource.Type + + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ + mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 + End With + + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +Function getFormFieldTypeAsString(fieldType As WdFieldType) + Dim Str As String + + Select Case fieldType + Case wdFieldFormCheckBox + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CHECK_BOX + Case wdFieldFormDropDown + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DROP_DOWN + Case wdFieldFormTextInput + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_TEXT + Case Else + Str = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + getFormFieldTypeAsString = Str +End Function +Function getTextFormFieldTypeAsString(fieldType As WdTextFormFieldType) + Dim Str As String + + Select Case fieldType + Case wdCalculationText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CALCULATION + Case wdCurrentDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_DATE + Case wdCurrentTimeText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_CURRENT_TIME + Case wdDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DATE + Case wdNumberText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_NUMBER + Case wdRegularText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_REGULAR + Case Else + Str = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + getTextFormFieldTypeAsString = Str +End Function +Function getTextFormFieldDefaultAsString(fieldType As WdTextFormFieldType) + Dim Str As String + + Select Case fieldType + Case wdCalculationText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_EXPRESSION + Case wdCurrentDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE + Case wdCurrentTimeText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TIME + Case wdDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_DATE + Case wdNumberText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_NUMBER + Case wdRegularText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_DEFAULT_TEXT + Case Else + Str = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + getTextFormFieldDefaultAsString = Str +End Function +Function getTextFormFieldFormatAsString(fieldType As WdTextFormFieldType) + Dim Str As String + + Select Case fieldType + Case wdCalculationText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER + Case wdCurrentDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE + Case wdCurrentTimeText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TIME + Case wdDateText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_DATE + Case wdNumberText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_NUMBER + Case wdRegularText + Str = RID_STR_WORD_ENUMERATION_FORM_FIELD_FORMAT_TEXT + Case Else + Str = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + getTextFormFieldFormatAsString = Str +End Function + +Sub Analyze_FieldAndFormFieldIssues(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_FormFields" + Dim myIssue As IssueInfo + + 'Analysze all Fields in doc + Dim myField As Field + + For Each myField In currDoc.Fields + 'Analyze Mail Merge Fields + Analyze_MailMergeField myField + + 'Analyze TOA Fields + Analyze_TOAField myField + Next myField + + 'Analyze FormField doc issues + If currDoc.FormFields.count = 0 Then GoTo FinalExit + + If (currDoc.FormFields.Shaded) Then + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_FIELDS + .IssueType = RID_STR_WORD_ISSUE_FIELDS + .SubType = RID_STR_WORD_SUBISSUE_APPEARANCE + .Location = .CLocationDocument + + .IssueTypeXML = CSTR_ISSUE_FIELDS + .SubTypeXML = CSTR_SUBISSUE_APPEARANCE + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_GREYED + .Values.Add RID_STR_WORD_TRUE + mAnalysis.IssuesCountArray(CID_FIELDS) = _ + mAnalysis.IssuesCountArray(CID_FIELDS) + 1 + End With + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + + 'Analyse all FormFields in doc + Dim myFormField As FormField + + For Each myFormField In currDoc.FormFields + Analyze_FormFieldIssue myFormField + Next myFormField + +FinalExit: + Set myIssue = Nothing + Set myFormField = Nothing + Exit Sub + +HandleErrors: + + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_FormFieldIssue(myFormField As FormField) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_FormFieldIssue" + Dim myIssue As IssueInfo + Dim bCheckBoxIssues As Boolean + Dim bFormFieldIssues As Boolean + + bCheckBoxIssues = False + If (myFormField.Type = wdFieldFormCheckBox) Then + If myFormField.CheckBox.AutoSize Then + bCheckBoxIssues = True + End If + End If + + bFormFieldIssues = bCheckBoxIssues + + If Not bFormFieldIssues Then GoTo FinalExit + + myFormField.Select + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_FIELDS + .IssueType = RID_STR_WORD_ISSUE_FIELDS + .SubType = RID_STR_WORD_SUBISSUE_FORM_FIELD + .Location = .CLocationPage + + .IssueTypeXML = CSTR_ISSUE_FIELDS + .SubTypeXML = CSTR_SUBISSUE_FORM_FIELD + .locationXML = .CXMLLocationPage + + .SubLocation = Selection.Information(wdActiveEndPageNumber) + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + myIssue.Attributes.Add RID_STR_COMMON_ATTRIBUTE_TYPE + myIssue.Values.Add getFormFieldTypeAsString(myFormField.Type) + End With + + 'Checkbox Issues + If (myFormField.Type = wdFieldFormCheckBox) Then + 'AutoSize CheckBoxes + If myFormField.CheckBox.AutoSize Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_AUTOSIZE + myIssue.Values.Add RID_STR_WORD_TRUE + End If + End If + + 'TextInput Issues + If myFormField.Type = wdFieldFormTextInput Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_TEXT_FORM_FIELD_TYPE + myIssue.Values.Add getTextFormFieldTypeAsString(myFormField.TextInput.Type) + Dim bLostType As Boolean + bLostType = False + If (myFormField.TextInput.Type = wdCalculationText) Or _ + (myFormField.TextInput.Type = wdCurrentDateText) Or _ + (myFormField.TextInput.Type = wdCurrentTimeText) Then + AddIssueDetailsNote myIssue, 0, getTextFormFieldTypeAsString(myFormField.TextInput.Type) & _ + " " & RID_STR_WORD_NOTE_FORM_FIELD_TYPE_LOST + bLostType = True + End If + + If (myFormField.TextInput.Format <> "") Then + myIssue.Attributes.Add getTextFormFieldFormatAsString(myFormField.TextInput.Type) + myIssue.Values.Add myFormField.TextInput.Format + End If + + 'Default text + If (myFormField.TextInput.Default <> "") Then + myIssue.Attributes.Add getTextFormFieldDefaultAsString(myFormField.TextInput.Type) + myIssue.Values.Add myFormField.TextInput.Default + End If + + 'Maximum text + If (myFormField.TextInput.Width <> 0) Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_MAX_LENGTH + myIssue.Values.Add myFormField.TextInput.Width + End If + + 'Fill-in disabled + If (myFormField.Enabled = False) And (Not bLostType) Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_FILLIN_ENABLED + myIssue.Values.Add RID_STR_WORD_FALSE + End If + End If + + 'Help Key(F1) + If (myFormField.OwnHelp And myFormField.HelpText <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_OWN_TEXT + myIssue.Values.Add myFormField.HelpText + ElseIf ((Not myFormField.OwnHelp) And myFormField.HelpText <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_HELP_KEY_F1_AUTO_TEXT + myIssue.Values.Add myFormField.HelpText + End If + + 'StatusHelp + If (myFormField.OwnStatus And myFormField.StatusText <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_OWN_TEXT + myIssue.Values.Add myFormField.StatusText + ElseIf ((Not myFormField.OwnStatus) And myFormField.StatusText <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_STATUS_BAR_HELP_AUTO_TEXT + myIssue.Values.Add myFormField.StatusText + End If + + 'Macros + If (myFormField.EntryMacro <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_ENTRY_MACRO + myIssue.Values.Add myFormField.EntryMacro + End If + If (myFormField.ExitMacro <> "") Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_EXIT_MACRO + myIssue.Values.Add myFormField.ExitMacro + End If + If (myFormField.EntryMacro <> "") Or (myFormField.ExitMacro <> "") Then + mAnalysis.MacroNumFieldsUsingMacros = 1 + mAnalysis.MacroNumFieldsUsingMacros + End If + + 'LockedField + If (myFormField.Enabled = False) And (myFormField.Type <> wdFieldFormTextInput) Then + myIssue.Attributes.Add RID_STR_WORD_ATTRIBUTE_FORM_FIELD_LOCKED + myIssue.Values.Add RID_STR_WORD_TRUE + End If + + mAnalysis.IssuesCountArray(CID_FIELDS) = _ + mAnalysis.IssuesCountArray(CID_FIELDS) + 1 + + mAnalysis.Issues.Add myIssue + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + 'Log first occurrence for this doc + If Not mbFormFieldErrorLogged Then + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + mbFormFieldErrorLogged = True + End If + Resume FinalExit +End Sub + + +Sub Analyze_TOA(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_TOA" + + Dim toa As TableOfAuthorities + Dim myIssue As IssueInfo + Dim myRng As Range + + For Each toa In currDoc.TablesOfAuthorities + Set myRng = toa.Range + myRng.start = myRng.End + Set myIssue = New IssueInfo + myRng.Select + + Dim TabLeaderAsString As String + Select Case toa.TabLeader + Case wdTabLeaderDashes + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_DASHES + Case wdTabLeaderDots + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_DOTS + Case wdTabLeaderHeavy + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_HEAVY + Case wdTabLeaderLines + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_LINES + Case wdTabLeaderMiddleDot + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_MIDDLEDOT + Case wdTabLeaderSpaces + TabLeaderAsString = RID_STR_WORD_ENUMERATION_INDEX_LEADER_SPACES + Case Else + TabLeaderAsString = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + Dim FormatAsString As String + Select Case currDoc.TablesOfAuthorities.Format + Case wdTOAClassic + FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_CLASSIC + Case wdTOADistinctive + FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_DISTINCTIVE + Case wdTOAFormal + FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_FORMAL + Case wdTOASimple + FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_SIMPLE + Case wdTOATemplate + FormatAsString = RID_STR_WORD_ENUMERATION_INDEX_TABLES_FROM_TEMPLATE + Case Else + FormatAsString = RID_STR_WORD_ENUMERATION_UNKNOWN + End Select + + With myIssue + .IssueID = CID_INDEX_AND_REFERENCES + .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES + .SubType = RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES + .Location = .CLocationPage + + .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES + .SubTypeXML = CSTR_SUBISSUE_TABLE_OF_AUTHORITIES + .locationXML = .CXMLLocationPage + + .SubLocation = myRng.Information(wdActiveEndPageNumber) + .Attributes.Add RID_STR_WORD_ATTRIBUTE_LEADER + .Values.Add TabLeaderAsString + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TOA_MIGRATE_AS_PLAIN_TEXT + + mAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _ + mAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1 + End With + + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + Set myRng = Nothing + Next +FinalExit: + Set myIssue = Nothing + Set myRng = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_TOAField(myField As Field) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_TOAField" + + Dim toa As TableOfAuthorities + Dim myIssue As IssueInfo + + If myField.Type = wdFieldTOAEntry Then + Set myIssue = New IssueInfo + myField.Select + + With myIssue + .IssueID = CID_FIELDS + .IssueType = RID_STR_WORD_ISSUE_FIELDS + .SubType = RID_STR_WORD_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD + .Location = .CLocationPage + + .IssueTypeXML = CSTR_ISSUE_FIELDS + .SubTypeXML = CSTR_SUBISSUE_TABLE_OF_AUTHORITIES_FIELD + .locationXML = .CXMLLocationPage + + .SubLocation = Selection.Information(wdActiveEndPageNumber) + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_FIELD_TEXT + .Values.Add myField.Code.Text + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TOA_FIELD_LOST_ON_ROUNDTRIP + + mAnalysis.IssuesCountArray(CID_FIELDS) = _ + mAnalysis.IssuesCountArray(CID_FIELDS) + 1 + End With + + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub Analyze_Tables_Borders(currDoc As Document) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Tables_Borders" + Dim myIssue As IssueInfo + Set myIssue = New IssueInfo + Dim aTable As Table + Dim invalidBorders As String + + For Each aTable In currDoc.Tables + invalidBorders = GetInvalidBorder(aTable) + If invalidBorders <> "" Then + aTable.Range.Select + Set myIssue = New IssueInfo + With myIssue + .IssueID = CID_TABLES + .IssueType = RID_STR_WORD_ISSUE_TABLES + .SubType = RID_STR_WORD_SUBISSUE_BORDER_STYLES + .Location = .CLocationPage + + .IssueTypeXML = CSTR_ISSUE_TABLES + .SubTypeXML = CSTR_SUBISSUE_BORDER_STYLES + .locationXML = .CXMLLocationPage + + .SubLocation = Selection.Information(wdActiveEndPageNumber) + .Line = Selection.Information(wdFirstCharacterLineNumber) + .column = Selection.Information(wdFirstCharacterColumnNumber) + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_BORDERS_NOT_DISPLAYING + .Values.Add invalidBorders + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_TABLE_BORDER + + mAnalysis.IssuesCountArray(CID_TABLES) = mAnalysis.IssuesCountArray(CID_TABLES) + 1 + End With + + mAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + Next aTable +FinalExit: + Set myIssue = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub +Function GetInvalidBorder(aTable As Table) As String + + Dim theResult As String + theResult = "" + + If IsInvalidBorderStyle(aTable.Borders(wdBorderTop).LineStyle) Then + theResult = theResult + "Top, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderBottom).LineStyle) Then + theResult = theResult + "Bottom, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderDiagonalDown).LineStyle) Then + theResult = theResult + "Down Diagonal, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderDiagonalUp).LineStyle) Then + theResult = theResult + "Up Diagonal, " + + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderHorizontal).LineStyle) Then + theResult = theResult + "Horizontal, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderLeft).LineStyle) Then + theResult = theResult + "Left, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderRight).LineStyle) Then + theResult = theResult + "Right, " + End If + If IsInvalidBorderStyle(aTable.Borders(wdBorderVertical).LineStyle) Then + theResult = theResult + "Vertical, " + End If + + If theResult <> "" Then + theResult = Left(theResult, (Len(theResult) - 2)) + "." + End If + + GetInvalidBorder = theResult +End Function + +Function IsInvalidBorderStyle(aStyle As WdLineStyle) As Boolean + + Dim IsInvalid As Boolean + + Select Case aStyle + Case wdLineStyleDot, wdLineStyleDashSmallGap, wdLineStyleDashLargeGap, wdLineStyleDashDot, _ + wdLineStyleDashDotDot, wdLineStyleTriple, wdLineStyleThinThickThinSmallGap, wdLineStyleThinThickMedGap, _ + wdLineStyleThickThinMedGap, wdLineStyleThinThickThinMedGap, wdLineStyleThinThickLargeGap, _ + wdLineStyleThickThinLargeGap, wdLineStyleThinThickThinLargeGap, wdLineStyleSingleWavy, _ + wdLineStyleDoubleWavy, wdLineStyleDashDotStroked, wdLineStyleEmboss3D, wdLineStyleEngrave3D + IsInvalid = True + Case Else + IsInvalid = False + End Select + + IsInvalidBorderStyle = IsInvalid + +End Function + +Private Sub Class_Initialize() + Set mAnalysis = New DocumentAnalysis +End Sub +Private Sub Class_Terminate() + Set mAnalysis = Nothing +End Sub + +Public Property Get Results() As DocumentAnalysis + Set Results = mAnalysis +End Property + +Sub Analyze_NumberingTabs(currDoc As Document, docAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_NumberingTabs" + + Dim tb As TabStop + Dim customTabPos As Single + Dim tabs As Integer + Dim listLvl As Long + Dim tp As Single + Dim bHasAlignmentProblem As Boolean + Dim bHasTooManyTabs As Boolean + Dim myIssue As IssueInfo + Dim p As Object + + bHasAlignmentProblem = False + bHasTooManyTabs = False + + For Each p In currDoc.ListParagraphs + tabs = 0 + For Each tb In p.TabStops + If tb.customTab Then + tabs = tabs + 1 + customTabPos = tb.Position + End If + Next + + If tabs = 1 Then + listLvl = p.Range.ListFormat.ListLevelNumber + tp = p.Range.ListFormat.ListTemplate.ListLevels.item(listLvl).TabPosition + If (p.Range.ListFormat.ListTemplate.ListLevels.item(listLvl).Alignment <> _ + wdListLevelAlignLeft) Then + ' ERROR: alignment problem + bHasAlignmentProblem = True + End If + + If tp <> customTabPos Then + p.Range.InsertBefore ("XXXXX") + End If + 'OK - at least heuristically + Else + 'ERROR: too many tabs + bHasTooManyTabs = True + End If + Next + + If (bHasAlignmentProblem) Then + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_INDEX_AND_REFERENCES + .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES + .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_TAB_ALIGNMENT + .Location = .CLocationDocument 'Location string + + .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES + .SubTypeXML = CSTR_SUBISSUE_NUMBERING_TAB_ALIGNMENT + .locationXML = .CXMLLocationDocument + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_TAB_ALIGNMENT + + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _ + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1 + End With + docAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + + If (bHasTooManyTabs) Then + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_INDEX_AND_REFERENCES + .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES + .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_TAB_OVERFLOW + .Location = .CLocationDocument 'Location string + + .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES + .SubTypeXML = CSTR_SUBISSUE_NUMBERING_TAB_OVERFLOW + .locationXML = .CXMLLocationDocument + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_TAB_OVERFLOW + + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _ + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1 + End With + docAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Set myIssue = Nothing + Resume FinalExit +End Sub + +Sub Analyze_Numbering(currDoc As Document, docAnalysis As DocumentAnalysis) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Analyze_Numbering" + + Dim myIssue As IssueInfo + Dim nFormatProblems As Integer + Dim nAlignmentProblems As Integer + nFormatProblems = 0 + nAlignmentProblems = 0 + + Dim lt As ListTemplate + Dim lvl As ListLevel + Dim I, l_, p1, p2, v1, v2 As Integer + Dim display_levels As Integer + Dim fmt, prefix, postfix, res As String + + For Each lt In currDoc.ListTemplates + l_ = 0 + For Each lvl In lt.ListLevels + l_ = l_ + 1 + 'Selection.TypeText Text:="List Number Format " + lvl.NumberFormat + 'Apply Heuristic + fmt = lvl.NumberFormat + p1 = InStr(fmt, "%") + p2 = InStrRev(fmt, "%") + v1 = val(Mid(fmt, p1 + 1, 1)) + v2 = val(Mid(fmt, p2 + 1, 1)) + display_levels = v2 - v1 + 1 + prefix = Mid(fmt, 1, p1 - 1) + postfix = Mid(fmt, p2 + 2) + 'Check Heuristic + res = prefix + For I = 2 To display_levels + res = "%" + Trim(Str(l_ - I + 1)) + "." + res + Next + res = res + "%" + Trim(Str(l_)) + postfix + If (StrComp(res, fmt) <> 0) Then + nFormatProblems = nFormatProblems + 1 + 'Selection.TypeText Text:="Label Problem: NumberFormat=" + fmt + " Heuristic=" + res + End If + + 'check alignment + If (lvl.NumberPosition <> wdListLevelAlignLeft) Then + nAlignmentProblems = nAlignmentProblems + 1 + 'Selection.TypeText Text:="Number alignment problem" + End If + Next + Next + + If (nFormatProblems > 0) Then + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_INDEX_AND_REFERENCES + .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES + .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_FORMAT + .Location = .CLocationDocument 'Location string + + .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES + .SubTypeXML = CSTR_SUBISSUE_NUMBERING_FORMAT + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_COUNT + .Values.Add nFormatProblems + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_FORMAT + + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _ + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1 + End With + docAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + + If (nAlignmentProblems > 0) Then + Set myIssue = New IssueInfo + + With myIssue + .IssueID = CID_INDEX_AND_REFERENCES + .IssueType = RID_STR_WORD_ISSUE_INDEX_AND_REFERENCES + .SubType = RID_STR_WORD_SUBISSUE_NUMBERING_ALIGNMENT + .Location = .CLocationDocument 'Location string + + .IssueTypeXML = CSTR_ISSUE_INDEX_AND_REFERENCES + .SubTypeXML = CSTR_SUBISSUE_NUMBERING_ALIGNMENT + .locationXML = .CXMLLocationDocument + + .Attributes.Add RID_STR_WORD_ATTRIBUTE_COUNT + .Values.Add nAlignmentProblems + + AddIssueDetailsNote myIssue, 0, RID_STR_WORD_NOTE_NUMBERING_ALIGNMENT + + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) = _ + docAnalysis.IssuesCountArray(CID_INDEX_AND_REFERENCES) + 1 + End With + docAnalysis.Issues.Add myIssue + Set myIssue = Nothing + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source + Set myIssue = Nothing + Resume FinalExit +End Sub + diff --git a/migrationanalysis/src/msokill/msokill.cpp b/migrationanalysis/src/msokill/msokill.cpp index 9940aa47903a..9f6df41783a8 100644 --- a/migrationanalysis/src/msokill/msokill.cpp +++ b/migrationanalysis/src/msokill/msokill.cpp @@ -91,7 +91,7 @@ int main(int argc, char* argv[]) } /*-------------------------------------------------------------- - Find the MSO window if it is available and explictly kill it + Find the MSO window if it is available and explicitly kill it MSO apps in this case are Excel, Word and PP Use FindWindow Win32 API to detect if they are available diff --git a/migrationanalysis/src/wizard/Wizard.frm b/migrationanalysis/src/wizard/Wizard.frm index ebb955386c68..e64c5ab7ea8c 100644 --- a/migrationanalysis/src/wizard/Wizard.frm +++ b/migrationanalysis/src/wizard/Wizard.frm @@ -1,3453 +1,3453 @@ -VERSION 5.00
-Begin VB.Form frmWizard
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 1 'Fixed Single
- Caption = "OpenOffice.org Document Analysis Wizard"
- ClientHeight = 5520
- ClientLeft = 1965
- ClientTop = 1815
- ClientWidth = 8175
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Icon = "Wizard.frx":0000
- KeyPreview = -1 'True
- LinkTopic = "Form1"
- LockControls = -1 'True
- MaxButton = 0 'False
- MinButton = 0 'False
- ScaleHeight = 5520
- ScaleWidth = 8175
- Tag = "1000"
- Begin VB.Frame fraStep
- BorderStyle = 0 'None
- Caption = "Introduction"
- ClipControls = 0 'False
- Enabled = 0 'False
- BeginProperty Font
- Name = "MS Sans Serif"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 4905
- Index = 0
- Left = -10000
- TabIndex = 25
- Tag = "1000"
- Top = 0
- Width = 8235
- Begin VB.PictureBox Picture4
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 4935
- Index = 0
- Left = 0
- ScaleHeight = 4935
- ScaleWidth = 2565
- TabIndex = 2
- TabStop = 0 'False
- Top = 0
- Width = 2565
- Begin VB.PictureBox Picture10
- Height = 735
- Left = 2580
- ScaleHeight = 735
- ScaleWidth = 30
- TabIndex = 68
- TabStop = 0 'False
- Top = 2610
- Width = 30
- End
- Begin VB.PictureBox Picture6
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1485
- Left = 150
- ScaleHeight = 1485
- ScaleWidth = 2355
- TabIndex = 67
- TabStop = 0 'False
- Top = 3390
- Width = 2355
- Begin VB.PictureBox Picture1
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1200
- Index = 0
- Left = 200
- Picture = "Wizard.frx":482C2
- ScaleHeight = 1200
- ScaleWidth = 1980
- TabIndex = 7
- TabStop = 0 'False
- Tag = "1060"
- Top = 300
- Width = 1980
- End
- End
- Begin VB.Label lblStep1_4
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "4. Analyze"
- ForeColor = &H00BF4F59&
- Height = 195
- Left = 120
- TabIndex = 89
- Tag = "1044"
- Top = 1800
- Width = 2140
- End
- Begin VB.Line Line2
- BorderColor = &H00808080&
- Index = 2
- X1 = 2550
- X2 = 2550
- Y1 = 0
- Y2 = 4920
- End
- Begin VB.Line Line3
- Index = 1
- X1 = 120
- X2 = 2280
- Y1 = 480
- Y2 = 480
- End
- Begin VB.Label Label7
- BackColor = &H00EED3C2&
- Caption = "1. Introduction"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 1
- Left = 120
- TabIndex = 11
- Tag = "1041"
- Top = 720
- Width = 2140
- End
- Begin VB.Label Label8
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "3. Results"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 1
- Left = 120
- TabIndex = 9
- Tag = "1043"
- Top = 1440
- Width = 2140
- End
- Begin VB.Label Label9
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "2. Documents"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 1
- Left = 120
- TabIndex = 10
- Tag = "1042"
- Top = 1080
- Width = 2140
- End
- Begin VB.Label Label12
- BackStyle = 0 'Transparent
- Caption = "Steps"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 255
- Index = 1
- Left = 120
- TabIndex = 8
- Tag = "1040"
- Top = 240
- Width = 2115
- End
- End
- Begin VB.PictureBox Picture8
- Appearance = 0 'Flat
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 4935
- Left = 2400
- ScaleHeight = 4935
- ScaleWidth = 5925
- TabIndex = 3
- TabStop = 0 'False
- Top = -30
- Width = 5925
- Begin VB.CheckBox chkShowIntro
- Caption = "Do not show this introduction again"
- Enabled = 0 'False
- Height = 315
- Left = 690
- MaskColor = &H00000000&
- TabIndex = 6
- Tag = "1103"
- Top = 4890
- Visible = 0 'False
- Width = 3810
- End
- Begin VB.Label lblIntroduction1
- AutoSize = -1 'True
- Caption = $"Wizard.frx":4F8B8
- Height = 585
- Left = 690
- TabIndex = 93
- Tag = "1101"
- Top = 750
- Width = 4890
- WordWrap = -1 'True
- End
- Begin VB.Label lblIntroduction3
- AutoSize = -1 'True
- Caption = "The wizard will remain on screen while the analysis is carried out."
- Height = 195
- Left = 690
- TabIndex = 0
- Tag = "1104"
- Top = 2670
- Width = 4845
- WordWrap = -1 'True
- End
- Begin VB.Label lblIntroduction2
- AutoSize = -1 'True
- Caption = "You will be able to select which documents you want to analyze as well as where you want the results to the analysis to be saved. "
- Height = 390
- Left = 690
- TabIndex = 1
- Tag = "1102"
- Top = 1800
- Width = 4875
- WordWrap = -1 'True
- End
- Begin VB.Label Label12
- BackStyle = 0 'Transparent
- Caption = "Introduction"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 255
- Index = 2
- Left = 450
- TabIndex = 5
- Tag = "1100"
- Top = 270
- Width = 4000
- End
- End
- End
- Begin VB.Frame fraStep
- BorderStyle = 0 'None
- Caption = "Setup"
- Enabled = 0 'False
- BeginProperty Font
- Name = "MS Sans Serif"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 4905
- Index = 1
- Left = -10000
- TabIndex = 32
- Tag = "2000"
- Top = 0
- Width = 8235
- Begin VB.PictureBox Picture4
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 4905
- Index = 1
- Left = 0
- ScaleHeight = 4905
- ScaleWidth = 2565
- TabIndex = 61
- TabStop = 0 'False
- Top = 0
- Width = 2565
- Begin VB.PictureBox Picture1
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1200
- Index = 1
- Left = 350
- Picture = "Wizard.frx":4F971
- ScaleHeight = 1200
- ScaleWidth = 1980
- TabIndex = 62
- TabStop = 0 'False
- Tag = "1060"
- Top = 3690
- Width = 1980
- End
- Begin VB.Label lblStep2_4
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "4. Analyze"
- ForeColor = &H00BF4F59&
- Height = 195
- Left = 120
- TabIndex = 90
- Tag = "1044"
- Top = 1800
- Width = 2140
- End
- Begin VB.Line Line2
- BorderColor = &H00808080&
- Index = 1
- X1 = 2550
- X2 = 2550
- Y1 = 0
- Y2 = 4920
- End
- Begin VB.Label Label12
- BackStyle = 0 'Transparent
- Caption = "Steps"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 255
- Index = 3
- Left = 120
- TabIndex = 66
- Tag = "1040"
- Top = 240
- Width = 1335
- End
- Begin VB.Label Label9
- BackColor = &H00EED3C2&
- Caption = "2. Documents"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 2
- Left = 120
- TabIndex = 65
- Tag = "1042"
- Top = 1080
- Width = 2140
- End
- Begin VB.Label Label8
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "3. Results"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 2
- Left = 120
- TabIndex = 64
- Tag = "1043"
- Top = 1440
- Width = 2140
- End
- Begin VB.Label Label7
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "1. Introduction"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 2
- Left = 120
- TabIndex = 63
- Tag = "1041"
- Top = 720
- Width = 2140
- End
- Begin VB.Line Line3
- Index = 2
- X1 = 120
- X2 = 2280
- Y1 = 480
- Y2 = 480
- End
- End
- Begin VB.PictureBox Picture7
- Appearance = 0 'Flat
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 4725
- Left = 2580
- ScaleHeight = 4725
- ScaleWidth = 5535
- TabIndex = 58
- TabStop = 0 'False
- Top = 0
- Width = 5535
- Begin VB.ComboBox cbIgnoreOld
- Height = 330
- ItemData = "Wizard.frx":56F67
- Left = 3950
- List = "Wizard.frx":56F74
- Style = 2 'Dropdown List
- TabIndex = 99
- Top = 1570
- Width = 1215
- End
- Begin VB.CheckBox chkIgnoreOld
- Caption = "Ignore documents older than"
- Height = 225
- Left = 450
- TabIndex = 98
- Top = 1600
- Width = 3400
- End
- Begin VB.CheckBox chkWordDoc
- Caption = "Documents (*.doc)"
- Height = 225
- Left = 2160
- TabIndex = 19
- Tag = "1208"
- Top = 2600
- Value = 1 'Checked
- Width = 3200
- End
- Begin VB.CheckBox chkWordTemplate
- Caption = "Templates (*.dot)"
- Height = 225
- Left = 2160
- TabIndex = 20
- Tag = "1209"
- Top = 2900
- Width = 3200
- End
- Begin VB.CheckBox chkPPTemplate
- Caption = "Templates (*.pot)"
- Height = 225
- Left = 2160
- TabIndex = 24
- Tag = "1215"
- Top = 4400
- Width = 3200
- End
- Begin VB.CheckBox chkPPDoc
- Caption = "Presentations (*.ppt)"
- Height = 225
- Left = 2160
- TabIndex = 23
- Tag = "1214"
- Top = 4100
- Width = 3200
- End
- Begin VB.CheckBox chkExcelDoc
- Caption = "Spreadsheets (*.xls)"
- Height = 225
- Left = 2160
- TabIndex = 21
- Tag = "1211"
- Top = 3350
- Width = 3200
- End
- Begin VB.CheckBox chkExcelTemplate
- Caption = "Templates (*.xlt)"
- Height = 225
- Left = 2160
- TabIndex = 22
- Tag = "1212"
- Top = 3650
- Width = 3200
- End
- Begin VB.CommandButton btnBrowseDirInput
- Caption = "..."
- Height = 315
- Left = 4740
- TabIndex = 17
- Top = 900
- Width = 400
- End
- Begin VB.TextBox txtInputDir
- Height = 315
- Left = 450
- TabIndex = 16
- Tag = "1205"
- Text = "C:\"
- Top = 900
- Width = 4155
- End
- Begin VB.CheckBox chkIncludeSubdirs
- Caption = "Include subdirectories in the analysis"
- Height = 225
- Left = 450
- TabIndex = 18
- Tag = "1202"
- Top = 1300
- Width = 4965
- End
- Begin VB.Label lblDocTypes
- Caption = "Document types to analyze"
- Height = 225
- Left = 450
- TabIndex = 95
- Tag = "1206"
- Top = 2250
- Width = 4905
- End
- Begin VB.Label lblChooseDocs
- AutoSize = -1 'True
- Caption = "Choose the documents you want to analyze"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 195
- Left = 300
- TabIndex = 94
- Tag = "1200"
- Top = 240
- Width = 5115
- WordWrap = -1 'True
- End
- Begin VB.Label Label13
- AutoSize = -1 'True
- Caption = "PowerPoint"
- Height = 225
- Index = 2
- Left = 690
- TabIndex = 74
- Tag = "1213"
- Top = 4100
- Width = 1245
- WordWrap = -1 'True
- End
- Begin VB.Label Label13
- AutoSize = -1 'True
- Caption = "Excel"
- Height = 225
- Index = 1
- Left = 690
- TabIndex = 73
- Tag = "1210"
- Top = 3350
- Width = 1245
- WordWrap = -1 'True
- End
- Begin VB.Label Label13
- AutoSize = -1 'True
- Caption = "Word"
- Height = 225
- Index = 0
- Left = 690
- TabIndex = 72
- Tag = "1207"
- Top = 2600
- Width = 1245
- WordWrap = -1 'True
- End
- Begin VB.Label Label1
- Caption = "Location of Microsoft Office documents"
- Height = 200
- Left = 450
- TabIndex = 59
- Tag = "1201"
- Top = 600
- Width = 4935
- End
- End
- End
- Begin VB.Frame fraStep
- BorderStyle = 0 'None
- Caption = "Options"
- Enabled = 0 'False
- BeginProperty Font
- Name = "MS Sans Serif"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 4905
- Index = 2
- Left = -10000
- TabIndex = 33
- Tag = "2002"
- Top = 0
- Width = 8235
- Begin VB.PictureBox Picture11
- BorderStyle = 0 'None
- Height = 555
- Left = 7260
- ScaleHeight = 555
- ScaleWidth = 705
- TabIndex = 75
- Top = 1890
- Width = 705
- Begin VB.CommandButton btnBrowseDirOut
- Caption = "..."
- Height = 375
- Left = 90
- TabIndex = 28
- Top = 90
- Width = 495
- End
- End
- Begin VB.TextBox txtResultsName
- Height = 375
- Left = 3030
- TabIndex = 26
- Tag = "1302"
- Text = "Analysis Results.xls"
- Top = 1140
- Width = 3045
- End
- Begin VB.TextBox txtOutputDir
- Height = 375
- Left = 3030
- TabIndex = 27
- Top = 1980
- Width = 4185
- End
- Begin VB.PictureBox Picture5
- Appearance = 0 'Flat
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1365
- Left = 3300
- ScaleHeight = 1365
- ScaleWidth = 4635
- TabIndex = 57
- TabStop = 0 'False
- Top = 3210
- Width = 4635
- Begin VB.OptionButton rdbResultsPrompt
- Caption = "Ask me before overwriting"
- Height = 435
- Left = 0
- TabIndex = 29
- Tag = "1312"
- Top = 0
- Value = -1 'True
- Width = 4485
- End
- Begin VB.OptionButton rdbResultsOverwrite
- Caption = "Overwrite without asking me"
- Height = 435
- Left = 0
- TabIndex = 30
- Tag = "1313"
- Top = 450
- Width = 4455
- End
- Begin VB.OptionButton rdbResultsAppend
- Caption = "Append the new results to the existing results"
- Height = 675
- Left = 0
- TabIndex = 31
- Tag = "1314"
- Top = 780
- Visible = 0 'False
- Width = 4515
- End
- End
- Begin VB.Frame Frame3
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- Enabled = 0 'False
- ForeColor = &H0099A8AC&
- Height = 5175
- Index = 0
- Left = 0
- TabIndex = 39
- Top = 0
- Width = 2535
- Begin VB.PictureBox Picture1
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1200
- Index = 3
- Left = 350
- Picture = "Wizard.frx":56F97
- ScaleHeight = 1200
- ScaleWidth = 1980
- TabIndex = 40
- TabStop = 0 'False
- Top = 3690
- Width = 1980
- End
- Begin VB.Label lblStep3_4
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "4. Analyze"
- ForeColor = &H00BF4F59&
- Height = 195
- Left = 120
- TabIndex = 91
- Tag = "1044"
- Top = 1800
- Width = 2140
- End
- Begin VB.Label Label12
- BackStyle = 0 'Transparent
- Caption = "Steps"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 255
- Index = 0
- Left = 120
- TabIndex = 53
- Tag = "1040"
- Top = 240
- Width = 1335
- End
- Begin VB.Label Label9
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "2. Documents"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 0
- Left = 120
- TabIndex = 43
- Tag = "1042"
- Top = 1080
- Width = 2140
- End
- Begin VB.Label Label8
- BackColor = &H00EED3C2&
- Caption = "3. Results"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 0
- Left = 120
- TabIndex = 42
- Tag = "1043"
- Top = 1440
- Width = 2140
- End
- Begin VB.Label Label7
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "1. Introduction"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 0
- Left = 120
- TabIndex = 41
- Tag = "1041"
- Top = 720
- Width = 2140
- End
- Begin VB.Line Line3
- Index = 0
- X1 = 120
- X2 = 2280
- Y1 = 480
- Y2 = 480
- End
- End
- Begin VB.Label Label3
- Caption = "File name for the results spreadsheet"
- Height = 195
- Left = 3030
- TabIndex = 71
- Tag = "1301"
- Top = 840
- Width = 4785
- End
- Begin VB.Label lblResultsLocation
- Caption = "Location"
- Height = 195
- Left = 3030
- TabIndex = 70
- Tag = "1304"
- Top = 1710
- Width = 4755
- End
- Begin VB.Label Label13
- AutoSize = -1 'True
- Caption = "If results already exisit under the same name and location:"
- Height = 195
- Index = 5
- Left = 3030
- TabIndex = 38
- Tag = "1311"
- Top = 2730
- Width = 4230
- WordWrap = -1 'True
- End
- Begin VB.Line Line2
- BorderColor = &H00808080&
- Index = 0
- X1 = 2550
- X2 = 2550
- Y1 = 0
- Y2 = 4920
- End
- Begin VB.Label lblChooseResults
- AutoSize = -1 'True
- Caption = "Choose where and how to save the analysis results"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 195
- Left = 2880
- TabIndex = 37
- Tag = "1300"
- Top = 240
- Width = 5055
- WordWrap = -1 'True
- End
- End
- Begin VB.Frame fraStep
- BorderStyle = 0 'None
- Caption = "Analyze"
- Enabled = 0 'False
- BeginProperty Font
- Name = "MS Sans Serif"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 4905
- Index = 3
- Left = 0
- TabIndex = 34
- Tag = "3000"
- Top = 0
- Width = 2.45745e5
- Begin VB.PictureBox Picture12
- Appearance = 0 'Flat
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 4905
- Left = 10020
- ScaleHeight = 4905
- ScaleWidth = 8175
- TabIndex = 69
- TabStop = 0 'False
- Top = 0
- Width = 8175
- End
- Begin VB.CommandButton btnPrepare
- Caption = "Prepare"
- Enabled = 0 'False
- Height = 375
- Left = 3340
- TabIndex = 97
- Tag = "1411"
- Top = 4410
- Visible = 0 'False
- Width = 4000
- End
- Begin VB.CommandButton btnRunAnalysis
- Caption = "Run"
- Height = 375
- Left = 3340
- TabIndex = 35
- Tag = "1404"
- Top = 3410
- Width = 4000
- End
- Begin VB.CommandButton btnViewResults
- Caption = "View"
- Enabled = 0 'False
- Height = 375
- Left = 3340
- TabIndex = 36
- Tag = "1406"
- Top = 3910
- Width = 4000
- End
- Begin VB.Frame Frame3
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- Enabled = 0 'False
- ForeColor = &H0099A8AC&
- Height = 5175
- Index = 3
- Left = 0
- TabIndex = 44
- Top = 0
- Width = 2535
- Begin VB.PictureBox Picture4
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1575
- Index = 2
- Left = 150
- ScaleHeight = 1575
- ScaleWidth = 2385
- TabIndex = 55
- TabStop = 0 'False
- Top = 3390
- Width = 2385
- Begin VB.PictureBox Picture1
- Appearance = 0 'Flat
- BackColor = &H80000005&
- BorderStyle = 0 'None
- ForeColor = &H80000008&
- Height = 1200
- Index = 2
- Left = 200
- Picture = "Wizard.frx":5E58D
- ScaleHeight = 1200
- ScaleWidth = 2475
- TabIndex = 56
- TabStop = 0 'False
- Tag = "1060"
- Top = 300
- Width = 2480
- End
- End
- Begin VB.Label lblStep4_4
- BackColor = &H00EED3C2&
- Caption = "4. Analyze"
- ForeColor = &H00BF4F59&
- Height = 255
- Left = 120
- TabIndex = 92
- Tag = "1044"
- Top = 1800
- Width = 2140
- End
- Begin VB.Label Label12
- BackStyle = 0 'Transparent
- Caption = "Steps"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 255
- Index = 5
- Left = 120
- TabIndex = 54
- Tag = "1040"
- Top = 240
- Width = 1335
- End
- Begin VB.Label Label9
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "2. Documents"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 3
- Left = 120
- TabIndex = 47
- Tag = "1042"
- Top = 1080
- Width = 2140
- End
- Begin VB.Label Label8
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "3. Results"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 3
- Left = 120
- TabIndex = 46
- Tag = "1043"
- Top = 1440
- Width = 2140
- End
- Begin VB.Label Label7
- BackColor = &H00EED3C2&
- BackStyle = 0 'Transparent
- Caption = "1. Introduction"
- ForeColor = &H00BF4F59&
- Height = 255
- Index = 3
- Left = 120
- TabIndex = 45
- Tag = "1041"
- Top = 720
- Width = 2140
- End
- Begin VB.Line Line3
- Index = 3
- X1 = 120
- X2 = 2280
- Y1 = 480
- Y2 = 480
- End
- End
- Begin VB.Label lblSkippedOld
- Caption = "Skipped <TOPIC> documets, because they were too old"
- Height = 195
- Left = 3180
- TabIndex = 60
- Top = 2880
- Width = 4935
- End
- Begin VB.Label lblSetupDone
- AutoSize = -1 'True
- Caption = "Run the analysis and view the results"
- BeginProperty Font
- Name = "Arial"
- Size = 8.25
- Charset = 0
- Weight = 700
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- Height = 195
- Left = 2880
- TabIndex = 96
- Tag = "1400"
- Top = 240
- Width = 4905
- WordWrap = -1 'True
- End
- Begin VB.Label lblNumPPT
- Caption = "<TOPIC> Presentations"
- Height = 255
- Left = 4620
- TabIndex = 88
- Tag = "1409"
- Top = 2280
- Width = 3375
- End
- Begin VB.Label lblNumPOT
- Caption = "<TOPIC> Templates"
- Height = 255
- Left = 4620
- TabIndex = 87
- Tag = "1403"
- Top = 2550
- Width = 3375
- End
- Begin VB.Label lblNumXLS
- Caption = "<TOPIC> Spreadsheets"
- Height = 255
- Left = 4620
- TabIndex = 86
- Tag = "1408"
- Top = 1680
- Width = 3375
- End
- Begin VB.Label lblNumXLT
- Caption = "<TOPIC> Templates"
- Height = 255
- Left = 4620
- TabIndex = 85
- Tag = "1403"
- Top = 1950
- Width = 3375
- End
- Begin VB.Label Label16
- AutoSize = -1 'True
- Caption = "PowerPoint"
- Height = 195
- Left = 3360
- TabIndex = 82
- Tag = "1213"
- Top = 2280
- Width = 1095
- WordWrap = -1 'True
- End
- Begin VB.Label Label13
- Caption = "Word"
- Height = 705
- Index = 10
- Left = 0
- TabIndex = 81
- Tag = "1207"
- Top = 0
- Width = 1245
- End
- Begin VB.Label Label13
- Caption = "Excel"
- Height = 705
- Index = 9
- Left = 0
- TabIndex = 80
- Tag = "1210"
- Top = 810
- Width = 1245
- End
- Begin VB.Label Label13
- Caption = "PowerPoint"
- Height = 585
- Index = 8
- Left = 0
- TabIndex = 79
- Tag = "1213"
- Top = 1620
- Width = 1245
- End
- Begin VB.Label Label13
- Caption = "Word"
- Height = 585
- Index = 7
- Left = 0
- TabIndex = 78
- Tag = "1207"
- Top = 0
- Width = 1245
- End
- Begin VB.Label Label13
- Caption = "Excel"
- Height = 585
- Index = 6
- Left = 0
- TabIndex = 77
- Tag = "1210"
- Top = 810
- Width = 1245
- End
- Begin VB.Label Label13
- Caption = "PowerPoint"
- Height = 465
- Index = 4
- Left = 0
- TabIndex = 76
- Tag = "1213"
- Top = 1620
- Width = 1245
- End
- Begin VB.Label lblNumTemplates
- Caption = "<TOPIC> Templates"
- Height = 255
- Left = 4620
- TabIndex = 52
- Tag = "1403"
- Top = 1350
- Width = 3375
- End
- Begin VB.Label lblNumDocs
- Caption = "<TOPIC> Documents"
- Height = 255
- Left = 4620
- TabIndex = 51
- Tag = "1402"
- Top = 1080
- Width = 3375
- End
- Begin VB.Line Line6
- BorderColor = &H00808080&
- X1 = 2640
- X2 = 8040
- Y1 = 3270
- Y2 = 3270
- End
- Begin VB.Label Label15
- AutoSize = -1 'True
- Caption = "Excel"
- Height = 195
- Left = 3360
- TabIndex = 50
- Tag = "1210"
- Top = 1680
- Width = 1095
- WordWrap = -1 'True
- End
- Begin VB.Label Label14
- AutoSize = -1 'True
- Caption = "Word"
- Height = 195
- Left = 3360
- TabIndex = 49
- Tag = "1207"
- Top = 1080
- Width = 1110
- WordWrap = -1 'True
- End
- Begin VB.Label lblTotalNumDocs
- AutoSize = -1 'True
- Caption = "A total of <TOPIC> documents will be analyzed:"
- Height = 195
- Left = 3180
- TabIndex = 48
- Tag = "1401"
- Top = 660
- Width = 4800
- WordWrap = -1 'True
- End
- Begin VB.Line Line2
- BorderColor = &H00808080&
- Index = 3
- X1 = 2550
- X2 = 2550
- Y1 = 0
- Y2 = 4920
- End
- End
- Begin VB.PictureBox picNav
- Align = 2 'Align Bottom
- Appearance = 0 'Flat
- BorderStyle = 0 'None
- BeginProperty Font
- Name = "MS Sans Serif"
- Size = 8.25
- Charset = 0
- Weight = 400
- Underline = 0 'False
- Italic = 0 'False
- Strikethrough = 0 'False
- EndProperty
- ForeColor = &H80000008&
- Height = 570
- Left = 0
- ScaleHeight = 570
- ScaleWidth = 8175
- TabIndex = 4
- TabStop = 0 'False
- Top = 4950
- Width = 8175
- Begin VB.CommandButton cmdNav
- Caption = "Finish"
- Height = 312
- Index = 4
- Left = 5325
- MaskColor = &H00000000&
- TabIndex = 14
- Tag = "1023"
- Top = 120
- Width = 1320
- End
- Begin VB.CommandButton cmdNav
- Caption = "Next >>"
- Height = 312
- Index = 3
- Left = 3870
- MaskColor = &H00000000&
- TabIndex = 13
- Tag = "1022"
- Top = 120
- Width = 1320
- End
- Begin VB.CommandButton cmdNav
- Caption = "<< Back"
- Height = 312
- Index = 2
- Left = 2535
- MaskColor = &H00000000&
- TabIndex = 12
- Tag = "1021"
- Top = 120
- Width = 1320
- End
- Begin VB.CommandButton cmdNav
- Cancel = -1 'True
- Caption = "Cancel"
- Height = 312
- Index = 1
- Left = 6750
- MaskColor = &H00000000&
- TabIndex = 15
- Tag = "1024"
- Top = 120
- Width = 1320
- End
- End
- Begin VB.Label Label18
- Caption = "<TOPIC> Documents"
- Height = 255
- Left = 0
- TabIndex = 84
- Top = 0
- Width = 2085
- WordWrap = -1 'True
- End
- Begin VB.Label Label17
- Caption = "<TOPIC> Templates"
- Height = 255
- Left = 0
- TabIndex = 83
- Top = 390
- Width = 3615
- WordWrap = -1 'True
- End
- Begin VB.Line Line4
- BorderColor = &H00808080&
- X1 = 0
- X2 = 8160
- Y1 = 4920
- Y2 = 4920
- End
-End
-Attribute VB_Name = "frmWizard"
-Attribute VB_GlobalNameSpace = False
-Attribute VB_Creatable = False
-Attribute VB_PredeclaredId = True
-Attribute VB_Exposed = False
-' *******************************************************************************
-' *
-' * Copyright 2000, 2010 Oracle and/or its affiliates. All rights reserved. Use of this
-' * product is subject to license terms.
-' *
-' *******************************************************************************
-
-Option Explicit
-
-Const TOPIC_STR = "<TOPIC>"
-Const TOPIC2_STR = "<TOPIC2>"
-Const CR_STR = "<CR>"
-Const CDEBUG_LEVEL_DEFAULT = 1 'Will output all Debug output to analysis.log file
-Const CSUPPORTED_VERSION = 9#
-
-Const NUM_STEPS = 4
-
-Const CAPPNAME_WORD = "Word"
-Const CAPPNAME_EXCEL = "Excel"
-Const CAPPNAME_POWERPOINT = "PowerPoint"
-Const CANALYZING = "Analyzing"
-
-Const BTN_CANCEL = 1
-Const BTN_BACK = 2
-Const BTN_NEXT = 3
-Const BTN_FINISH = 4
-
-Const STEP_INTRO = 0
-Const STEP_1 = 1
-Const STEP_2 = 2
-Const STEP_FINISH = 3
-
-Const DIR_NONE = 0
-Const DIR_BACK = 1
-Const DIR_NEXT = 2
-
-Const CPRODUCTNAME_STR = "<PRODUCTNAME>"
-
-Const CSTR_ANALYSIS_LOG_DONE = "Done"
-
-Const CINPUT_DIR = "indir"
-Const COUTPUT_DIR = "outdir"
-Const CRESULTS_FILE = "resultsfile"
-Const CLOG_FILE = "logfile"
-Const CRESULTS_TEMPLATE = "resultstemplate"
-Const CRESULTS_EXIST = "resultsexist"
-Const CPROMPT_FILE = "promptfile"
-Const COVERWRITE_FILE = "overwritefile"
-Const CAPPEND_FILE = "appendfile"
-Const CNEW_RESULTS_FILE = "newresultsfile"
-Const CINCLUDE_SUBDIRS = "includesubdirs"
-Const CDEBUG_LEVEL = "debuglevel"
-Const CTYPE_WORDDOC = "typeworddoc"
-Const CTYPE_WORDDOT = "typeworddot"
-Const CTYPE_EXCELDOC = "typeexceldoc"
-Const CTYPE_EXCELDOT = "typeexceldot"
-Const CTYPE_PPDOC = "typepowerpointdoc"
-Const CTYPE_PPDOT = "typepowerpointdot"
-Const COUTPUT_TYPE = "outputtype"
-Const COUTPUT_TYPE_XLS = "xls"
-Const COUTPUT_TYPE_XML = "xml"
-Const COUTPUT_TYPE_BOTH = "both"
-Const CVERSION = "version"
-Const CDOPREPARE = "prepare"
-Const CTITLE = "title"
-Const CIGNORE_OLD_DOCS = "ignoreolddocuments"
-Const CISSUE_LIMIT = "issuesmonthlimit"
-Const CISSUE_LIMIT_DAW = 6
-Private mIssueLimit As Integer
-Const CDEFAULT_PASSWORD = "defaultpassword"
-Const CSTR_TEST_PASSWORD = "test"
-Private mDefaultPassword As String
-
-Const CLAST_CHECKPOINT As String = "LastCheckpoint"
-Const CNEXT_FILE As String = "NextFile"
-Const C_ABORT_ANALYSIS As String = "AbortAnalysis"
-
-Const CNUMBER_TOTAL_DOCS = "total_numberdocs"
-Const CNUMBER_DOCS_DOC = "numberdocs_doc"
-Const CNUMBER_TEMPLATES_DOT = "numbertemplates_dot"
-Const CNUMBER_DOCS_XLS = "numberdocs_xls"
-Const CNUMBER_TEMPLATES_XLT = "numbertemplates_xlt"
-Const CNUMBER_DOCS_PPT = "numberdocs_ppt"
-Const CNUMBER_TEMPLATES_POT = "numbertemplates_pot"
-Const CSTART_TIME = "start"
-Const CEND_TIME = "end"
-Const CELAPSED_TIME = "time_for_analysis"
-Const CWINVERSION = "win_version"
-Const CUSER_LOCALE_INFO = "user_locale"
-Const CSYS_LOCALE_INFO = "system_locale"
-Const CWORD_VERSION = "word_ver"
-Const CEXCEL_VERSION = "excel_ver"
-Const CPOWERPOINT_VERSION = "powerpoint_ver"
-Const CNOT_INSTALLED = "not installed"
-
-Const CRESULTS_FILE_EXTENSION = ".xls"
-Const CCONFIG_BACKUP_EXT = "_bak"
-Const CDEFAULT_README_NAME = "UserGuide"
-
-Const C_DOCS_LESS_3_MONTH = "DocumentsYoungerThan3Month"
-Const C_DOCS_LESS_6_MONTH = "DocumentsYoungerThan6Month"
-Const C_DOCS_LESS_12_MONTH = "DocumentsYoungerThan12Month"
-Const C_DOCS_MORE_12_MONTH = "DocumentsOlderThan12Month"
-
-'module level vars
-Dim mnCurStep As Integer
-Dim mbTrue As Boolean
-Dim mbFalse As Boolean
-Dim mLblSteps As String
-Dim mChbSubdirs As String
-
-Dim mWordDocCount As Long
-Dim mExcelDocCount As Long
-Dim mPPDocCount As Long
-
-Dim mWordTemplateCount As Long
-Dim mExcelTemplateCount As Long
-Dim mPPTemplateCount As Long
-Dim mTotalDocCount As Long
-Dim mIgnoredDocCount As Long
-
-Public VBInst As VBIDE.VBE
-Dim mbFinishOK As Boolean
-Dim mbAllowExit As Boolean
-Private mStrTrue As String
-Private mLogFilePath As String
-Private mDebugLevel As String
-Private mIniFilePath As String
-Private mbDocCountCurrent As Boolean
-Private mbDoPrepare As Boolean
-
-Dim mDocFiles As CollectedFiles
-
-Private Declare Sub InitCommonControls Lib "comctl32" ()
-Private Declare Function GetTickCount Lib "kernel32" () As Long
-Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
-
-Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
-
-Private Declare Function FormatMessage Lib "kernel32" Alias _
- "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _
- ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
- ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long
-
-
-Private Const HKEY_CURRENT_USER As Long = &H80000001
-Private Const HKEY_LOCAL_MACHINE As Long = &H80000002
-
-Const WORD_APP = "word"
-Const EXCEL_APP = "excel"
-Const PP_APP = "pp"
-Const REG_KEY_APP_PATH = "Software\Microsoft\Windows\CurrentVersion\App Paths\"
-
-
-Function GetAppPath(myApp As String) As String
- Dim myPath As String
-
- If (myApp = WORD_APP) Then
- myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "winword.exe", "")
- ElseIf (myApp = EXCEL_APP) Then
- myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "excel.exe", "")
- ElseIf (myApp = PP_APP) Then
- myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "powerpnt.exe", "")
- Else
- MsgBox "Unknown application: " & myApp, vbCritical
- Exit Function
- End If
-
- If (myPath = "") Then
- If (myApp = WORD_APP) Then
- myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "winword.exe", "")
- ElseIf (myApp = EXCEL_APP) Then
- myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "excel.exe", "")
- ElseIf (myApp = PP_APP) Then
- myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "powerpnt.exe", "")
- End If
- End If
-
- GetAppPath = myPath
-End Function
-
-Function GetDriverDoc(myApp As String) As String
- Dim myPath As String
- Dim errStr As String
- Dim fso As New FileSystemObject
-
- If (myApp = WORD_APP) Then
- myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE)
- ElseIf (myApp = EXCEL_APP) Then
- myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE)
- ElseIf (myApp = PP_APP) Then
- myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE)
- Else
- MsgBox "Unknown application: " & myApp, vbCritical
- GoTo FinalExit
- End If
-
- If Not fso.FileExists(myPath) Then
- errStr = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _
- TOPIC_STR, myPath, CR_STR, Chr(13))
- WriteDebug errStr
- MsgBox errStr, vbCritical
- GoTo FinalExit
- End If
-
- GetDriverDoc = myPath
-
-FinalExit:
- Set fso = Nothing
-End Function
-
-
-
-
-Private Function AutomationMessageText(lCode As Long) As String
- Dim sRtrnCode As String
- Dim lRet As Long
-
- sRtrnCode = Space$(256)
- lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, lCode, 0&, _
- sRtrnCode, 256&, 0&)
- If lRet > 0 Then
- AutomationMessageText = Left(sRtrnCode, lRet)
- Else
- AutomationMessageText = "Error not found."
- End If
-
-End Function
-
-Private Sub btnBrowseDirInput_Click()
- Dim folder As String
- Dim StartDir As String
-
- If Len(txtInputDir.Text) > 0 Then
- StartDir = txtInputDir.Text
- End If
-
- folder = BrowseForFolder(Me, GetResString(BROWSE_FOR_DOC_DIR_ID), StartDir)
- If Len(folder) = 0 Then
- Exit Sub 'User Selected Cancel
- End If
- txtInputDir.Text = folder
- txtInputDir.ToolTipText = folder
-
- If Len(txtOutputDir.Text) = 0 Then
- txtOutputDir.Text = folder
- txtOutputDir.ToolTipText = folder
- End If
-End Sub
-
-Private Sub btnBrowseDirOut_Click()
- Dim folder As String
- Dim StartDir As String
-
- If Len(txtOutputDir.Text) > 0 Then
- StartDir = txtOutputDir.Text
- End If
-
- folder = BrowseForFolder(Me, GetResString(BROWSE_FOR_RES_DIR_ID), StartDir)
- If Len(folder) = 0 Then
- Exit Sub 'User Selected Cancel
- End If
- txtOutputDir.Text = folder
- txtOutputDir.ToolTipText = folder
-End Sub
-
-Private Sub btnPrepare_Click()
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "btnPrepare_Click"
-
- mbDoPrepare = True
- mbAllowExit = True
-
- btnViewResults.Enabled = False
- btnRunAnalysis.Enabled = False
- btnPrepare.Enabled = False
-
- cmdNav(BTN_CANCEL).Enabled = False
- cmdNav(BTN_BACK).Enabled = False
- cmdNav(BTN_NEXT).Enabled = False
- cmdNav(BTN_FINISH).Enabled = False
- btnPrepare.Caption = GetResString(RUNBTN_RUNNING_ID)
-
- Dim str As String
-
- If RunAnalysis(True) Then
- cmdNav(BTN_FINISH).Enabled = True
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = True
- btnPrepare.Enabled = True
- btnViewResults.SetFocus
- str = ReplaceTopic2Tokens(GetResString(RID_STR_ENG_OTHER_PREPARE_COMPLETED_PREP_ID), _
- TOPIC_STR, getOutputDir, CR_STR, Chr(13))
- MsgBox str, vbInformation
- Else
- cmdNav(BTN_FINISH).Enabled = False
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = False
- btnPrepare.Enabled = False
- End If
-
-FinalExit:
- mbDoPrepare = False
- cmdNav(BTN_CANCEL).Enabled = True
- cmdNav(BTN_BACK).Enabled = True
- cmdNav(BTN_NEXT).Enabled = False
- btnPrepare.Caption = GetResString(PREPAREBTN_START_ID)
- Exit Sub
-
-HandleErrors:
- cmdNav(BTN_FINISH).Enabled = False
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = False
- btnPrepare.Enabled = False
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-
-Private Sub cmdNav_Click(Index As Integer)
- On Error GoTo HandleError
- Dim currentFunctionName As String
- currentFunctionName = "cmdNav_Click"
- Dim nAltStep As Integer
- Dim rc As Long
- Dim fso As Scripting.FileSystemObject
-
- Select Case Index
- Case BTN_CANCEL
- 'Copy backup configuration file over existing
- If fso Is Nothing Then
- Set fso = New Scripting.FileSystemObject
- End If
- If fso.FileExists(mIniFilePath & CCONFIG_BACKUP_EXT) Then
- DeleteFile mIniFilePath
- AttemptToCopyFile mIniFilePath & CCONFIG_BACKUP_EXT, mIniFilePath
- End If
- Set mDocFiles = Nothing
-
- Unload Me
-
- Case BTN_BACK
- nAltStep = mnCurStep - 1
- SetStep nAltStep, DIR_BACK
-
- Case BTN_NEXT
- nAltStep = mnCurStep + 1
- SetStep nAltStep, DIR_NEXT
-
- Case BTN_FINISH
- If (Not mbAllowExit) Then
- Dim str As String
- Dim response As Integer
-
- str = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYSE_NOT_RUN), CR_STR, Chr(13))
- response = MsgBox(str, vbOKCancel + vbInformation)
- If response = vbOK Then ' User chose Ok.
- mbAllowExit = True
- End If
- End If
-
- If (mbAllowExit) Then
- DeleteFile mIniFilePath & CCONFIG_BACKUP_EXT
- Set mDocFiles = Nothing
- Unload Me
- End If
- End Select
-
-FinalExit:
- Set fso = Nothing
- Exit Sub
-
-HandleError:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
-
- Resume FinalExit
-End Sub
-
-Private Sub btnRunAnalysis_Click()
- On Error GoTo HandleErrors
- Dim bViewResults As Boolean
- Dim str As String
- Dim response As Integer
-
- btnViewResults.Enabled = False
- btnRunAnalysis.Enabled = False
- btnPrepare.Enabled = False
- bViewResults = False
- mbAllowExit = True
-
- cmdNav(BTN_CANCEL).Enabled = False
- cmdNav(BTN_BACK).Enabled = False
- cmdNav(BTN_NEXT).Enabled = False
- cmdNav(BTN_FINISH).Enabled = False
- btnRunAnalysis.Caption = GetResString(RUNBTN_RUNNING_ID)
-
- If RunAnalysis(False) Then
- cmdNav(BTN_FINISH).Enabled = True
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = True
- btnPrepare.Enabled = True
- btnViewResults.SetFocus
- btnRunAnalysis.Caption = GetResString(RUNBTN_START_ID)
-
- str = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYZE_COMPLETED_ID), CR_STR, Chr(13))
- response = MsgBox(str, vbOKCancel + vbInformation)
- If response = vbOK Then ' User chose Ok.
- bViewResults = True
- End If
- Else
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = False
- btnPrepare.Enabled = False
- End If
-
-FinalExit:
- cmdNav(BTN_CANCEL).Enabled = True
- cmdNav(BTN_BACK).Enabled = True
- cmdNav(BTN_NEXT).Enabled = False
- btnRunAnalysis.Caption = GetResString(RUNBTN_START_ID)
-
- If bViewResults Then
- btnViewResults_Click
- End If
-
- Exit Sub
-
-HandleErrors:
- cmdNav(BTN_FINISH).Enabled = False
- btnRunAnalysis.Enabled = True
- btnViewResults.Enabled = False
- btnPrepare.Enabled = False
- WriteDebug "Document Analysis: View Analysis Results" & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Private Sub btnViewResults_Click()
- On Error GoTo HandleErrors
- Dim resultsFile As String
- Dim fso As New FileSystemObject
- Dim str As String
-
- mbAllowExit = True
-
- resultsFile = getOutputDir & "\" & txtResultsName.Text
-
- If GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_XML Or _
- GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_BOTH Then
-
- Dim base As String
- Dim path As String
- base = fso.GetParentFolderName(resultsFile) & "\" & fso.GetBaseName(txtResultsName.Text)
- If CheckWordDocsToAnalyze Then
- path = base & "_" & CAPPNAME_WORD & "." & COUTPUT_TYPE_XML
- End If
- If CheckExcelDocsToAnalyze Then
- If path <> "" Then path = path & vbLf
- path = path & base & "_" & CAPPNAME_EXCEL & "." & COUTPUT_TYPE_XML
- End If
- If CheckPPDocsToAnalyze Then
- If path <> "" Then path = path & vbLf
- path = path & base & "_" & CAPPNAME_POWERPOINT & "." & COUTPUT_TYPE_XML
- End If
-
- str = ReplaceTopic2Tokens(GetResString(XML_RESULTS_ID), _
- TOPIC_STR, path, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbInformation
- If GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_XML Then
- Resume FinalExit
- End If
- End If
-
- If Not fso.FileExists(resultsFile) Then
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_RESULTS_DOC), _
- TOPIC_STR, resultsFile, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- Resume FinalExit
- End If
-
- Dim xl As Excel.application
- Set xl = New Excel.application
- xl.Visible = True
- xl.Workbooks.Open resultsFile
-
-FinalExit:
- Set xl = Nothing
- Set fso = Nothing
-
- Exit Sub
-HandleErrors:
- WriteDebug "Document Analysis: View Analysis Results" & Err.Number & " " & Err.Description & " " & Err.Source
-End Sub
-
-Private Sub Form_Activate()
- Dim currentFunctionName As String
- Dim missingFile As String
- currentFunctionName = "Form_Activate"
- On Error GoTo HandleErrors
-
- If Not CheckNeededFiles(missingFile) Then
- Dim str As String
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _
- TOPIC_STR, missingFile, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
-
- End 'Exit application - some needed files are missing
- End If
-
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- GoTo FinalExit
-End Sub
-
-Private Sub Form_Initialize()
- Dim currentFunctionName As String
- currentFunctionName = "Form_Initialize"
- On Error GoTo ErrorHandler
- Call InitCommonControls 'Use Windows XP Visual Style
-
-FinalExit:
- Exit Sub
-
-ErrorHandler:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- GoTo FinalExit
-End Sub
-
-Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
- If KeyCode = vbKeyF1 Then
- 'cmdNav_Click BTN_HELP
- End If
-End Sub
-
-Private Sub Form_Load()
- Const COS_CHECK = "oscheck"
-
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "Form_Load"
-
- Dim fso As New FileSystemObject
- Dim i As Integer
- 'init all vars
- mbFinishOK = False
- mbTrue = True
- mbFalse = False
-
- mLogFilePath = GetLogFilePath
- mIniFilePath = GetIniFilePath
- mbDocCountCurrent = False
- mbDoPrepare = False
- mbAllowExit = False
-
- 'Check OS before running
- Dim bOSCheck As Boolean
- bOSCheck = IIf(GetIniSetting(COS_CHECK) = "False", False, True)
-
- If bOSCheck Then
- If Not IsWin98Plus Then
- Dim str As String
- Dim winVer As RGB_WINVER
- str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_OSVERSION), _
- TOPIC_STR, GetWinVersion(winVer), CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
-
- End 'Exit application - unsupported OS
- End If
- Else
- Err.Clear
- WriteDebug "IsWin2000Plus OS Check bypassed by analysis.ini oscheck=False setting"
- End If
-
-
- For i = 0 To NUM_STEPS - 1
- fraStep(i).Left = -10000
- Next
-
- 'Load All string info for Form
- LoadResStrings Me
-
- frmWizard.Caption = ReplaceTopicTokens(GetResString(TITLE_ID), CPRODUCTNAME_STR, _
- GetResString(PRODUCTNAME_ID))
- lblIntroduction1.Caption = ReplaceTopicTokens(GetResString(INTRO1_ID), CPRODUCTNAME_STR, _
- GetResString(PRODUCTNAME_ID))
- mLblSteps = GetResString(LBL_STEPS_ID)
- mChbSubdirs = GetResString(CHK_SUBDIRS_ID)
-
- ' Setup Doc Preparation specific strings
- If gBoolPreparation Then
- ' Steps
- lblStep1_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID)
- lblStep2_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID)
- lblStep3_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID)
- lblStep4_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID)
-
- ' Preparation - Step 1. Introduction
- lblIntroduction1.Caption = ReplaceTopicTokens(GetResString(RID_STR_ENG_INTRODUCTION_INTRO1_PREP_ID), CPRODUCTNAME_STR, _
- GetResString(PRODUCTNAME_ID))
- lblIntroduction2.Caption = GetResString(RID_STR_ENG_INTRODUCTION_INTRO2_PREP_ID)
- lblIntroduction3.Caption = GetResString(RID_STR_ENG_INTRODUCTION_INTRO3_PREP_ID)
-
- ' Preparation - Step 2. Documents
- lblChooseDocs.Caption = GetResString(RID_STR_ENG_DOCUMENTS_CHOOSE_DOCUMENTS_PREP_ID)
- lblDocTypes.Caption = GetResString(RID_STR_ENG_DOCUMENTS_CHOOSE_DOC_TYPES_PREP_ID)
- 'mChbSubdirs = GetResString(RID_STR_ENG_DOCUMENTS_INCLUDE_SUBDIRECTORIES_PREP_ID)
- chkIgnoreOld.Caption = GetResString(RID_STR_IGNORE_OLDER_CB_ID)
-
- cbIgnoreOld.Clear
- cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_3_MONTHS_ID))
- cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_6_MONTHS_ID))
- cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_12_MONTHS_ID))
- cbIgnoreOld.ListIndex = 0
-
- ' Preparation - Step 3. Results
- lblChooseResults.Caption = GetResString(RID_STR_ENG_RESULTS_CHOOSE_OPTIONS_PREP_ID)
- txtResultsName.Text = GetResString(RID_STR_ENG_RESULTS_ANALYSIS_XLS_PREP_ID)
-
- 'Show Append option
- rdbResultsAppend.Visible = True
-
- ' Preparation - Step 4. Analysis
- lblSetupDone.Caption = GetResString(RID_STR_ENG_ANALYZE_SETUP_COMPLETE_PREP_ID)
- btnPrepare.Visible = True
- Else
- ' The next line is a work around for a wrong translated string and should be removed
- ' when RID_STR_ENG_RESULTS_CHOOSE_OPTIONS has been corrected
- lblChooseResults.Caption = GetResString(RID_STR_ENG_RESULTS_CHOOSE_OPTIONS_PREP_ID)
- mDefaultPassword = IIf(GetIniSetting(CDEFAULT_PASSWORD) = "", _
- CSTR_TEST_PASSWORD, GetIniSetting(CDEFAULT_PASSWORD))
- End If
-
- SetStep 0, DIR_NEXT
- Dim tmpStr As String
-
- 'Setup Params
- tmpStr = GetIniSetting(CINPUT_DIR)
- If tmpStr <> "" Then
- txtInputDir.Text = tmpStr
- txtInputDir.ToolTipText = tmpStr
- End If
- tmpStr = GetIniSetting(COUTPUT_DIR)
- If tmpStr <> "" Then
- If Right(tmpStr, 1) = ":" And Len(tmpStr) = 2 Then
- tmpStr = tmpStr & "\"
- End If
- txtOutputDir.Text = tmpStr
- txtOutputDir.ToolTipText = tmpStr
- End If
- tmpStr = GetIniSetting(CRESULTS_FILE)
- If tmpStr <> "" Then txtResultsName.Text = tmpStr
-
- rdbResultsPrompt.value = False
- rdbResultsOverwrite.value = False
- rdbResultsAppend.value = False
- Dim resultsSetting As String
- resultsSetting = GetIniSetting(CRESULTS_EXIST)
- If resultsSetting = CPROMPT_FILE Then
- rdbResultsPrompt.value = True
- ElseIf resultsSetting = CAPPEND_FILE Then
- rdbResultsAppend.value = True
- Else
- rdbResultsOverwrite.value = True
- End If
-
- chkWordDoc.value = IIf(GetIniSetting(CTYPE_WORDDOC) = CStr(True), vbChecked, 0)
- chkWordTemplate.value = IIf(GetIniSetting(CTYPE_WORDDOT) = CStr(True), vbChecked, 0)
- chkExcelDoc.value = IIf(GetIniSetting(CTYPE_EXCELDOC) = CStr(True), vbChecked, 0)
- chkExcelTemplate.value = IIf(GetIniSetting(CTYPE_EXCELDOT) = CStr(True), vbChecked, 0)
- chkPPDoc.value = IIf(GetIniSetting(CTYPE_PPDOC) = CStr(True), vbChecked, 0)
- chkPPTemplate.value = IIf(GetIniSetting(CTYPE_PPDOT) = CStr(True), vbChecked, 0)
- chkIncludeSubdirs.value = IIf(GetIniSetting(CINCLUDE_SUBDIRS) = CStr(True), vbChecked, 0)
- mDebugLevel = IIf(GetIniSetting(CDEBUG_LEVEL) = "", CDEBUG_LEVEL_DEFAULT, GetIniSetting(CDEBUG_LEVEL))
- chkIgnoreOld.value = IIf(GetIniSetting(CIGNORE_OLD_DOCS) = CStr(True), vbChecked, 0)
-
- mIssueLimit = IIf(GetIniSetting(CISSUE_LIMIT) = "", CISSUE_LIMIT_DAW, GetIniSetting(CISSUE_LIMIT))
- If (mIssueLimit <= 3) Then
- cbIgnoreOld.ListIndex = 0
- ElseIf (mIssueLimit <= 6) Then
- cbIgnoreOld.ListIndex = 1
- Else
- cbIgnoreOld.ListIndex = 2
- End If
-
- 'Always ensure at least one doc type is selected on startup
- If (chkWordDoc.value <> vbChecked) And _
- (chkWordTemplate.value <> vbChecked) And _
- (chkExcelDoc.value <> vbChecked) And _
- (chkExcelTemplate.value <> vbChecked) And _
- (chkPPDoc.value <> vbChecked) And _
- (chkPPTemplate.value <> vbChecked) Then
-
- chkWordDoc.value = vbChecked
- End If
-
-FinalExit:
- Set fso = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Private Sub SetStep(nStep As Integer, nDirection As Integer)
- On Error GoTo HandleError
- Const driveTypeIsCDROM = 4
- Dim val As String
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
- Dim drive
-
-
- mbDocCountCurrent = False
-
- Select Case nStep
- Case STEP_INTRO
- 'MsgBox "Enter Intro"
- Case STEP_1
- 'Leave Introduction
- 'Workaround - resource bug for SubDir checkbox, have to set it explicitly
- chkIncludeSubdirs.Caption = mChbSubdirs
- Case STEP_2
- 'Leave Documents
-
- Set drive = fso.GetDrive(fso.GetDriveName(txtInputDir.Text))
- If drive.DriveType = driveTypeIsCDROM Then
- If Not drive.IsReady Then
- MsgBox GetResString(ERR_CDROM_NOT_READY), vbCritical
- Exit Sub
- End If
- End If
-
- If txtInputDir.Text = "" Or Not fso.FolderExists(txtInputDir.Text) Then ' fso.FolderExists() has replaced dir()
- MsgBox ReplaceTopicTokens(GetResString(ERR_NO_DOC_DIR), _
- CR_STR, Chr(13)), vbCritical
- Exit Sub
- End If
-
- If Not CheckUserChosenDocsToAnalyze Then
- MsgBox GetResString(ERR_NO_DOC_TYPES), vbCritical
- Exit Sub
- End If
- 'Expand directory name only without path to full path
- txtInputDir.Text = fso.GetAbsolutePathName(txtInputDir.Text)
-
- If txtOutputDir.Text = "" Then
- txtOutputDir.Text = txtInputDir.Text
- End If
-
- mbFinishOK = False
-
- 'Workaround - label resource bug for Steps, have to set it explicitly
- Label12(0).Caption = mLblSteps
- Label12(5).Caption = mLblSteps
- Case STEP_FINISH
- 'Leave Results
- If Not CheckResultsDir(getOutputDir) Then
- Exit Sub
- End If
-
- 'Expand directory name only without path to full path
- txtOutputDir.Text = fso.GetAbsolutePathName(txtOutputDir)
-
- 'Check Results file is there and has a valid extension
- If fso.GetBaseName(txtResultsName.Text) = "" Then
- txtResultsName.Text = GetResString(SETUP_ANALYSIS_XLS_ID)
- End If
- txtResultsName.Text = fso.GetBaseName(txtResultsName.Text) & CRESULTS_FILE_EXTENSION
-
- Screen.MousePointer = vbHourglass
- DeleteFile mLogFilePath
- Set mDocFiles = Nothing
- If Not CheckNumberDocsToAnalyze Then
- Screen.MousePointer = vbDefault
- Exit Sub
- End If
-
- Screen.MousePointer = vbDefault
-
- btnRunAnalysis.Enabled = True
-
- If GetNumberOfDocsToAnalyze = 0 Then
- btnRunAnalysis.Enabled = False
- End If
-
- 'Backup configuration
- If Not AttemptToCopyFile(mIniFilePath, mIniFilePath & CCONFIG_BACKUP_EXT) Then
- Exit Sub
- End If
-
- 'Save current Wizard Settings
- WriteWizardSettingsToLog mIniFilePath
-
- 'If results file already exists, enable View and Prepare
- If fso.FileExists(getOutputDir & "\" & txtResultsName.Text) Then
- btnViewResults.Enabled = True
- btnPrepare.Enabled = True
- End If
-
- mbFinishOK = True
- End Select
-
- 'move to new step
- fraStep(mnCurStep).Enabled = False
- fraStep(nStep).Left = 0
- If nStep <> mnCurStep Then
- fraStep(mnCurStep).Left = -10000
- fraStep(mnCurStep).Enabled = False
- End If
- fraStep(nStep).Enabled = True
-
- SetNavBtns nStep
- Exit Sub
-
-FinalExit:
- Set fso = Nothing
- Set drive = Nothing
- Exit Sub
-
-HandleError:
- Screen.MousePointer = vbDefault
- WriteDebug "Document Analysis: SetStep() " & Err.Number & " " & Err.Description & " " & Err.Source
-
- Resume FinalExit
-End Sub
-
-Function CheckResultsDir(resultsDir As String) As Boolean
- On Error GoTo HandleError
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
- Const driveTypeIsCDROM = 4
- Const readOnlyFolderRemainder = 1
- Dim drive
- CheckResultsDir = False
-
- If resultsDir = "" Then
- MsgBox ReplaceTopicTokens(GetResString(ERR_NO_RESULTS_DIRECTORY), _
- CR_STR, Chr(13)), vbCritical
- CheckResultsDir = False
- Exit Function
- End If
-
- Set drive = fso.GetDrive(fso.GetDriveName(resultsDir))
- If drive.DriveType = driveTypeIsCDROM Then 'If CD-ROM Drive Then
- Dim Msg1 As String
- Msg1 = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _
- TOPIC_STR, txtResultsName.Text, CR_STR, Chr(13))
- MsgBox Msg1, vbCritical
- CheckResultsDir = False
- Exit Function
- End If
-
-
- If Not fso.FolderExists(resultsDir) Then
- Dim Msg, Style, response
-
- Msg = ReplaceTopicTokens(GetResString(ERR_NO_RES_DIR), CR_STR, Chr(13))
- Style = vbYesNo + vbQuestion + vbDefaultButton1 ' Define buttons.
-
- response = MsgBox(Msg, Style)
- If response = vbYes Then ' User chose Yes.
- If Not CreateDir(getOutputDir) Then
- CheckResultsDir = False
- Exit Function
- End If
- Else ' User chose No.
- CheckResultsDir = False
- Exit Function
- End If
- End If
-
- Dim testFile As String
- testFile = resultsDir & "\" & fso.GetTempName
- Do While fso.FileExists(testFile)
- testFile = resultsDir & "\" & fso.GetTempName
- Loop
-
- On Error GoTo HandleReadOnly
- Dim aText As TextStream
- Set aText = fso.CreateTextFile(testFile, False, False)
- aText.WriteLine ("Dies ist ein Test.")
- aText.Close
- fso.DeleteFile (testFile)
-
-' GetAttr doesn't work reliable ( returns read only for 'my Documents' and rw for read only network folder
-' If ((GetAttr(resultsDir) Mod 2) = readOnlyFolderRemainder) Then 'If the attribute is odd then the folder is read-only
-' MsgBox GetResString(ERR_NO_WRITE_TO_READ_ONLY_FOLDER), vbCritical
-' CheckResultsDir = False
-' Exit Function
-' End If
-
- CheckResultsDir = True
-
- Exit Function
-HandleError:
- WriteDebug "Document Analysis: CheckResultsDir() " & Err.Number & " " & Err.Description & " " & Err.Source
- CheckResultsDir = False
- Exit Function
-HandleReadOnly:
- Dim str As String
- str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _
- TOPIC_STR, txtResultsName.Text, CR_STR, Chr(13))
- MsgBox str, vbCritical
- CheckResultsDir = False
- Exit Function
-End Function
-
-Function CheckUserChosenDocsToAnalyze() As Boolean
- CheckUserChosenDocsToAnalyze = Not ((chkWordDoc.value <> vbChecked) And (chkWordTemplate.value <> vbChecked) And _
- (chkExcelDoc.value <> vbChecked) And (chkExcelTemplate.value <> vbChecked) And _
- (chkPPDoc.value <> vbChecked) And (chkPPTemplate.value <> vbChecked))
-End Function
-
-Function AttemptToCopyFile(Source As String, dest As String) As Boolean
- On Error GoTo HandleErrors
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
-
- If fso.FileExists(Source) Then
- fso.CopyFile Source, dest
- End If
-
- 'True if no source or copy succeded
- AttemptToCopyFile = True
-
-FinalExit:
- Set fso = Nothing
- Exit Function
-
-HandleErrors:
- AttemptToCopyFile = False
- Dim str As String
- str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _
- TOPIC_STR, mIniFilePath & CCONFIG_BACKUP_EXT, CR_STR, Chr(13))
- Resume FinalExit
-
-End Function
-
-Function CreateDir(dir As String) As Boolean
- On Error GoTo HandleErrors
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
-
- fso.CreateFolder (dir)
-
- CreateDir = True
-
-FinalExit:
- Set fso = Nothing
- Exit Function
-
-HandleErrors:
- Dim str As String
- str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_DIR), _
- TOPIC_STR, dir, CR_STR, Chr(13))
- Select Case Err.Number
- Case 76
- WriteDebug str
- MsgBox str, vbCritical
- CreateDir = False
- Case 58
- 'Don't care if it exists already
- CreateDir = True
- Case Else
- WriteDebug str
- MsgBox str, vbCritical
- CreateDir = False
- End Select
- Resume FinalExit
-
-End Function
-Private Sub SetNavBtns(nStep As Integer)
- mnCurStep = nStep
-
- If mnCurStep = 0 Then
- cmdNav(BTN_BACK).Enabled = False
- cmdNav(BTN_NEXT).Enabled = True
- ElseIf mnCurStep = NUM_STEPS - 1 Then
- cmdNav(BTN_NEXT).Enabled = False
- cmdNav(BTN_BACK).Enabled = True
- Else
- cmdNav(BTN_BACK).Enabled = True
- cmdNav(BTN_NEXT).Enabled = True
- End If
-
- If mbFinishOK Then
- cmdNav(BTN_FINISH).Enabled = True
- Else
- cmdNav(BTN_FINISH).Enabled = False
- End If
-End Sub
-Function CheckForSupportedApp(app As String, lowerVerLimit As Long) As Boolean
- Dim appRegStr As String
- Dim appVer As Long
- appRegStr = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "")
- appVer = val(Right(appRegStr, Len(appRegStr) - Len(app & ".Application.")))
- If appVer >= lowerVerLimit Then
- CheckForSupportedApp = True
- Else
- CheckForSupportedApp = False
- End If
-End Function
-Function GetAppVersion(app As String) As Long
- Dim appRegStr As String
- Dim appVer As Long
- appRegStr = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "")
- GetAppVersion = val(Right(appRegStr, Len(appRegStr) - Len(app & ".Application.")))
-End Function
-Function GetInstalledApp(app As String) As String
- GetInstalledApp = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "")
-End Function
-
-Sub WriteInfoToApplicationLog(wordAppStr As String, excelAppStr As String, ppAppStr As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteInfoToApplicationLog"
-
- Dim userLCID As Long
- userLCID = GetUserDefaultLCID()
- Dim sysLCID As Long
- sysLCID = GetSystemDefaultLCID()
-
- WriteToLog CWORD_VERSION, IIf(wordAppStr <> "", wordAppStr, CNOT_INSTALLED)
- WriteToLog CEXCEL_VERSION, IIf(excelAppStr <> "", excelAppStr, CNOT_INSTALLED)
- WriteToLog CPOWERPOINT_VERSION, IIf(ppAppStr <> "", ppAppStr, CNOT_INSTALLED)
-
- WriteToLog CUSER_LOCALE_INFO, _
- "langid: " & GetUserLocaleInfo(userLCID, LOCALE_ILANGUAGE) & ": " & _
- GetUserLocaleInfo(userLCID, LOCALE_SENGLANGUAGE) & _
- "-" & GetUserLocaleInfo(userLCID, LOCALE_SENGCOUNTRY) & _
- " abrv: " & GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME) & _
- "-" & GetUserLocaleInfo(userLCID, LOCALE_SISO3166CTRYNAME) & _
- " sdate: " & GetUserLocaleInfo(userLCID, LOCALE_SSHORTDATE)
-
- WriteToLog CSYS_LOCALE_INFO, _
- "langid: " & GetUserLocaleInfo(sysLCID, LOCALE_ILANGUAGE) & ": " & _
- GetUserLocaleInfo(sysLCID, LOCALE_SENGLANGUAGE) & _
- "-" & GetUserLocaleInfo(sysLCID, LOCALE_SENGCOUNTRY) & _
- " abrv: " & GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME) & _
- "-" & GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME) & _
- " sdate: " & GetUserLocaleInfo(userLCID, LOCALE_SSHORTDATE)
-
- Dim myWinVer As RGB_WINVER
- GetWinVersion myWinVer
- WriteToLog CWINVERSION, myWinVer.VersionName & " " & myWinVer.VersionNo & _
- " " & myWinVer.ServicePack & _
- " build " & myWinVer.BuildNo
- WriteToLog CNUMBER_TOTAL_DOCS, CStr(mTotalDocCount)
- WriteToLog CNUMBER_DOCS_DOC, CStr(mWordDocCount)
- WriteToLog CNUMBER_TEMPLATES_DOT, CStr(mWordTemplateCount)
- WriteToLog CNUMBER_DOCS_XLS, CStr(mExcelDocCount)
- WriteToLog CNUMBER_TEMPLATES_XLT, CStr(mExcelTemplateCount)
- WriteToLog CNUMBER_DOCS_PPT, CStr(mPPDocCount)
- WriteToLog CNUMBER_TEMPLATES_POT, CStr(mPPTemplateCount)
-FinalExit:
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Function CheckTemplatePath(sMigrationResultsTemplatePath As String, fso As FileSystemObject) As Boolean
- If Not fso.FileExists(sMigrationResultsTemplatePath) Then
- Dim str As String
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_RESULTS_TEMPLATE), _
- TOPIC_STR, sMigrationResultsTemplatePath, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- CheckTemplatePath = False
- Else
- CheckTemplatePath = True
- End If
-End Function
-
-Function RunAnalysis(bDoPrepare) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "RunAnalysis"
- Dim tstart As Single 'timer var for this routine only
- Dim tend As Single 'timer var for this routine only
- Dim fso As New FileSystemObject
- Dim wordAppStr As String
- Dim excelAppStr As String
- Dim ppAppStr As String
- Dim sMigrationResultsTemplatePath As String
- Dim startDate As Variant
- Dim bSuccess
-
- bSuccess = True
- startDate = Now
- tstart = GetTickCount()
-
- app.OleRequestPendingMsgText = GetResString(RUNBTN_RUNNING_ID)
- app.OleRequestPendingMsgTitle = frmWizard.Caption
-
- wordAppStr = GetInstalledApp(CAPPNAME_WORD)
- excelAppStr = GetInstalledApp(CAPPNAME_EXCEL)
- ppAppStr = GetInstalledApp(CAPPNAME_POWERPOINT)
- 'Write locale, version info and settings to the Application log
- WriteInfoToApplicationLog wordAppStr, excelAppStr, ppAppStr
-
- 'Check for template
- sMigrationResultsTemplatePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESULTS_TEMPLATE_FILE)
- If Not CheckTemplatePath(sMigrationResultsTemplatePath, fso) Then
- bSuccess = False
- GoTo FinalExit
- End If
-
- 'Check for installed Apps
- If Not CheckInstalledApps(wordAppStr, excelAppStr, ppAppStr) Then
- bSuccess = False
- GoTo FinalExit
- End If
-
- If bDoPrepare Then
- 'Show MsgBox ( to give apps some time to quit )
- Dim strMsgBox As String
- Dim response As Integer
-
- strMsgBox = ReplaceTopic2Tokens(GetResString(RID_STR_ENG_OTHER_PREPARE_PROMPT_PREP_ID), _
- TOPIC_STR, getOutputDir & "\" & txtResultsName.Text, TOPIC2_STR, getOutputDir)
- strMsgBox = ReplaceTopicTokens(strMsgBox, CR_STR, Chr(13))
- response = MsgBox(strMsgBox, Buttons:=vbOKCancel + vbInformation)
-
- If response <> vbOK Then
- bSuccess = False
- GoTo FinalExit
- End If
- End If
-
- 'Write Wizard Setting to Application log
- WriteWizardSettingsToLog mLogFilePath
-
- 'Write to Analysis ini file - used by driver docs
- WriteCommonParamsToLog sMigrationResultsTemplatePath, mLogFilePath, mIniFilePath, fso
-
- Screen.MousePointer = vbHourglass
- ' Doc Counts are setup by CheckNumberDocsToAnalyze() when user moves to Analysis Panel
- ' Takes account of user Options selected and inspects source directory
- Dim analysisAborted As Boolean
- analysisAborted = False
-
- SetupInputVariables mLogFilePath, fso
-
- Load ShowProgress
- Call ShowProgress.SP_Init(mDocFiles.WordFiles.count + _
- mDocFiles.ExcelFiles.count + _
- mDocFiles.PowerPointFiles.count)
-
- Dim myOffset As Long
- myOffset = 0
- If (mDocFiles.WordFiles.count > 0) Then
- bSuccess = AnalyseList(mDocFiles.WordFiles, "word", mIniFilePath, myOffset, analysisAborted)
- 'bSuccess = RunWordAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso)
- End If
-
- myOffset = mDocFiles.WordFiles.count
- If ((mDocFiles.ExcelFiles.count > 0) And (Not analysisAborted)) Then
- bSuccess = bSuccess And _
- AnalyseList(mDocFiles.ExcelFiles, "excel", mIniFilePath, myOffset, analysisAborted)
- 'bSuccess = RunExcelAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso)
- End If
-
- myOffset = myOffset + mDocFiles.ExcelFiles.count
- If ((mDocFiles.PowerPointFiles.count > 0) And (Not analysisAborted)) Then
- bSuccess = bSuccess And _
- AnalyseList(mDocFiles.PowerPointFiles, "pp", mIniFilePath, myOffset, analysisAborted)
- 'bSuccess = RunPPAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso)
- End If
-
- SetupInputVariables mLogFilePath, fso
-
- tend = GetTickCount()
- WriteToLog CELAPSED_TIME, (FormatNumber((tend - tstart) / 1000, 0) & " seconds: ") & _
- (FormatNumber((tend - tstart), 0) & " miliseconds")
-
-FinalExit:
- Unload ShowProgress
- Screen.MousePointer = vbDefault
- WriteToLog CSTART_TIME, CDate(startDate)
- WriteToLog CEND_TIME, Now
- Set fso = Nothing
-
- RunAnalysis = bSuccess
- Exit Function
-
-HandleErrors:
- bSuccess = False
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function CheckInstalledApps(wordAppStr As String, excelAppStr As String, ppAppStr As String) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- Dim str As String
- currentFunctionName = "CheckInstalledApps"
-
- Dim missingInstalledApps As String
- Dim unsupportedApps As String
- Dim runningApps As String
- Dim bSuccess As Boolean
-
- bSuccess = False
-
- If mWordDocCount > 0 Or mWordTemplateCount > 0 Then
- If wordAppStr = "" Then 'Word not installed
- missingInstalledApps = CAPPNAME_WORD
- ElseIf Not CheckForSupportedApp(CAPPNAME_WORD, CSUPPORTED_VERSION) Then
- unsupportedApps = CAPPNAME_WORD
- ElseIf IsOfficeAppRunning(CAPPNAME_WORD) Then
- runningApps = CAPPNAME_WORD
- End If
- End If
-
- If excelAppStr = "" Then
- If missingInstalledApps <> "" Then missingInstalledApps = missingInstalledApps & ", "
- missingInstalledApps = missingInstalledApps & CAPPNAME_EXCEL
- ElseIf Not CheckForSupportedApp(CAPPNAME_EXCEL, CSUPPORTED_VERSION) Then
- If unsupportedApps <> "" Then unsupportedApps = unsupportedApps & ", "
- unsupportedApps = unsupportedApps & CAPPNAME_EXCEL
- ElseIf IsOfficeAppRunning(CAPPNAME_EXCEL) Then
- If runningApps <> "" Then runningApps = runningApps & ", "
- runningApps = runningApps & CAPPNAME_EXCEL
- End If
-
- If mPPDocCount > 0 Or mPPTemplateCount > 0 Then
- If ppAppStr = "" Then 'PP not installed
- If missingInstalledApps <> "" Then missingInstalledApps = missingInstalledApps & ", "
- missingInstalledApps = missingInstalledApps & CAPPNAME_POWERPOINT
- ElseIf Not CheckForSupportedApp(CAPPNAME_POWERPOINT, CSUPPORTED_VERSION) Then
- If unsupportedApps <> "" Then unsupportedApps = unsupportedApps & ", "
- unsupportedApps = unsupportedApps & CAPPNAME_POWERPOINT
- ElseIf IsOfficeAppRunning(CAPPNAME_POWERPOINT) Then
- If runningApps <> "" Then runningApps = runningApps & ", "
- runningApps = runningApps & CAPPNAME_POWERPOINT
- End If
- End If
-
- If missingInstalledApps <> "" Then
- str = ReplaceTopic2Tokens(GetResString(ERR_NOT_INSTALLED), _
- TOPIC_STR, missingInstalledApps, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- GoTo FinalExit
- End If
-
- If unsupportedApps <> "" Then
- str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _
- TOPIC_STR, unsupportedApps, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- GoTo FinalExit
- End If
-
- If runningApps <> "" Then
- str = ReplaceTopic2Tokens(GetResString(ERR_APPLICATION_IN_USE), _
- TOPIC_STR, runningApps, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- GoTo FinalExit
- End If
-
- 'Check for Excel automation server
- If CheckForExcel Then
- str = ReplaceTopicTokens(GetResString(ERR_EXCEL_OPEN), _
- CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- bSuccess = True
-
-FinalExit:
- CheckInstalledApps = bSuccess
- Exit Function
-
-HandleErrors:
- bSuccess = False
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function RunPPAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean
-'DV: do we need this? get some error handling ideas here
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "RunPPAnalysis"
- Const APP_PP = "PowerPoint"
- Dim str As String
- Dim bSuccess
- bSuccess = False
-
- If (chkPPDoc.value <> vbChecked) And (chkPPTemplate.value <> vbChecked) Then
- RunPPAnalysis = True
- Exit Function
- End If
-
- Dim sPPDriverDocPath As String
-
- sPPDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE)
- If Not fsObject.FileExists(sPPDriverDocPath) Then
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_PP_DRIVER), _
- TOPIC_STR, sPPDriverDocPath, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- Dim pp As PowerPoint.application
- Dim po As Object
- Dim aPres As PowerPoint.Presentation
- Dim RegValue As Long
- Set po = GetObject(sPPDriverDocPath)
- Set pp = po.application
-
- If val(pp.Version) < CSUPPORTED_VERSION Then
- str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _
- TOPIC_STR, pp.Version, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- If Not CheckForAccesToPPVBProject(pp, aPres) Then
- RegValue = -1
- If Not GiveAccessToMacroProject(APP_PP, pp.Version, RegValue) Then
- Dim Style, response
- str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _
- TOPIC_STR, CAPPNAME_POWERPOINT, CR_STR, Chr(13))
- WriteDebug str
- Style = vbYesNo + vbQuestion + vbDefaultButton1
-
- response = MsgBox(str, Style)
- If response <> vbYes Then
- bSuccess = False
- GoTo FinalExit
- End If
- End If
- End If
-
- Set aPres = pp.Presentations(1)
- Dim ppSlideHidden As PowerPoint.Slide
- Set ppSlideHidden = aPres.Slides(2)
-
- 'Setup Input Variables
- 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_POWERPOINT
-
- 'Run PowerPoint Analysis
- pp.Run (fsObject.GetFileName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) & "!AnalysisDriver.AnalyseDirectory")
-
- bSuccess = True
-
-FinalExit:
- 'Cannot seem to close it down from VB
- 'Workaround is to close it in macro
- '
- 'If Not aPres Is Nothing Then
- ' aPres.Saved = msoTrue
- 'End If
- 'If Not pp Is Nothing Then pp.Quit
-
- 'Swallow error as we are closing down PP from macro
- 'Does not seem to be possible to close it down from VB
- On Error Resume Next
- If RegValue <> -1 Then
- SetDefaultRegValue APP_PP, pp.Version, RegValue
- End If
- If RegValue = 0 Then
- DeleteRegValue APP_PP, pp.Version
- End If
-
- If Not pp Is Nothing Then
- pp.Run (fsObject.GetFileName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) & "!ApplicationSpecific.QuitPowerPoint")
- End If
-
-
- Set aPres = Nothing
- Set pp = Nothing
- Set po = Nothing
-
- RunPPAnalysis = bSuccess
- Exit Function
-
-HandleErrors:
- bSuccess = False
- Set pp = Nothing
- Dim failedDoc As String
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
-
- failedDoc = GetDebug(CAPPNAME_POWERPOINT, CANALYZING)
- If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then
- str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _
- TOPIC_STR, CAPPNAME_POWERPOINT, CR_STR, Chr(13))
- Else
- str = ReplaceTopic2Tokens(GetResString(ERR_PP_DRIVER_CRASH), _
- TOPIC_STR, failedDoc, CR_STR, Chr(13))
- End If
-
- WriteDebug str
- MsgBox str, vbCritical
-
- Resume FinalExit
-End Function
-
-Sub SetupInputVariables(logFile As String, fso As FileSystemObject)
- Dim bNewResultsFile As Boolean
-
- bNewResultsFile = CheckCreateNewResultsFile(fso)
-
- WriteToLog CNEW_RESULTS_FILE, IIf(bNewResultsFile, "True", "False"), mIniFilePath
- WriteToLog CNEW_RESULTS_FILE, IIf(bNewResultsFile, "True", "False"), logFile
-End Sub
-
-
-
-Function RunExcelAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "RunExcelAnalysis"
- Const APP_EXCEL = "Excel"
- Dim str As String
- Dim bSuccess
- bSuccess = False
-
- If (chkExcelDoc.value <> vbChecked) And (chkExcelTemplate.value <> vbChecked) Then
- RunExcelAnalysis = True
- Exit Function
- End If
-
- Dim xl As Excel.application
- Dim aWb As Excel.Workbook
- Dim sExcelDriverDocPath As String
- Dim RegValue As Long
-
- sExcelDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE)
- If Not fsObject.FileExists(sExcelDriverDocPath) Then
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_EXCEL_DRIVER), _
- TOPIC_STR, sExcelDriverDocPath, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- Set xl = GetExcelInstance
- If val(xl.Version) < CSUPPORTED_VERSION Then
- str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _
- TOPIC_STR, xl.Version, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- If Not CheckForAccesToExcelVBProject(xl) Then
- RegValue = -1
- If Not GiveAccessToMacroProject(APP_EXCEL, xl.Version, RegValue) Then
- Dim Style, response
- str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _
- TOPIC_STR, CAPPNAME_EXCEL, CR_STR, Chr(13))
- WriteDebug str
- Style = vbYesNo + vbQuestion + vbDefaultButton1
-
- response = MsgBox(str, Style)
- If response <> vbYes Then
- bSuccess = False
- GoTo FinalExit
- End If
- End If
- End If
-
- Set aWb = xl.Workbooks.Open(fileName:=sExcelDriverDocPath)
- 'Setup Input Variables
- 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_EXCEL
-
- 'Run Excel Analysis
- xl.Run ("AnalysisTool.AnalysisDriver.AnalyseDirectory")
-
- bSuccess = True
-FinalExit:
- If RegValue <> -1 Then
- SetDefaultRegValue APP_EXCEL, xl.Version, RegValue
- End If
- If RegValue = 0 Then
- DeleteRegValue APP_EXCEL, xl.Version
- End If
-
- If Not aWb Is Nothing Then
- If xl.Workbooks.count = 1 Then
- xl.Visible = False
- End If
- aWb.Close (False)
- End If
- Set aWb = Nothing
-
- If Not xl Is Nothing Then
- If xl.Workbooks.count = 0 Then
- xl.Quit
- End If
- End If
-
- Set xl = Nothing
-
- RunExcelAnalysis = bSuccess
- Exit Function
-
-HandleErrors:
- bSuccess = False
- Set aWb = Nothing
- Set xl = Nothing
- Dim failedDoc As String
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
-
- failedDoc = GetDebug(CAPPNAME_EXCEL, CANALYZING)
- If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then
- str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _
- TOPIC_STR, CAPPNAME_EXCEL, CR_STR, Chr(13))
- Else
- str = ReplaceTopic2Tokens(GetResString(ERR_EXCEL_DRIVER_CRASH), _
- TOPIC_STR, failedDoc, CR_STR, Chr(13))
- End If
-
- WriteDebug str
- MsgBox str, vbCritical
-
- On Error Resume Next
- Resume FinalExit
-End Function
-
-Sub WriteWizardSettingsToLog(path As String)
- '### DO NOT USE Boolean True/ False it is loaclised by the OS - use "True"/ "False"
- WriteToLog CINPUT_DIR, getInputDir, path
- WriteToLog CINCLUDE_SUBDIRS, IIf(chkIncludeSubdirs.value, "True", "False"), path
- WriteToLog COUTPUT_DIR, getOutputDir, path
- WriteToLog CRESULTS_FILE, txtResultsName.Text, path
-
- WriteToLog CTYPE_WORDDOC, IIf(chkWordDoc.value, "True", "False"), path
- WriteToLog CTYPE_WORDDOT, IIf(chkWordTemplate.value, "True", "False"), path
- WriteToLog CTYPE_EXCELDOC, IIf(chkExcelDoc.value, "True", "False"), path
- WriteToLog CTYPE_EXCELDOT, IIf(chkExcelTemplate.value, "True", "False"), path
- WriteToLog CTYPE_PPDOC, IIf(chkPPDoc.value, "True", "False"), path
- WriteToLog CTYPE_PPDOT, IIf(chkPPTemplate.value, "True", "False"), path
-
- Dim resultsSetting As String
- If rdbResultsPrompt.value Then
- resultsSetting = CPROMPT_FILE
- ElseIf rdbResultsAppend.value Then
- resultsSetting = CAPPEND_FILE
- Else
- resultsSetting = COVERWRITE_FILE
- End If
- WriteToLog CRESULTS_EXIST, resultsSetting, path
-
- WriteToLog CIGNORE_OLD_DOCS, IIf(chkIgnoreOld.value, "True", "False"), path
- WriteToLog CISSUE_LIMIT, CStr(mIssueLimit), path
-
- 'WriteToLog CVERSION, Version, path
-End Sub
-
-Sub WriteCommonParamsToLog(resultsTemplate As String, logFile As String, path As String, fso As Scripting.FileSystemObject)
- WriteToLog CLOG_FILE, logFile, path
- WriteToLog CRESULTS_TEMPLATE, resultsTemplate, path
- WriteToLog CDEBUG_LEVEL, CLng(mDebugLevel), path
- WriteToLog CDOPREPARE, IIf(mbDoPrepare, "True", "False"), path
- WriteToLog CTITLE, frmWizard.Caption, path
- WriteToLog CLAST_CHECKPOINT, ""
- WriteToLog CNEXT_FILE, ""
- WriteToLog C_ABORT_ANALYSIS, ""
-End Sub
-
-Function GetNumberOfDocsToAnalyze() As Long
- Dim count As Long
-
- count = 0
-
- If CheckWordDocsToAnalyze Then
- count = mWordDocCount + mWordTemplateCount
- End If
- If CheckExcelDocsToAnalyze Then
- count = count + mExcelDocCount + mExcelTemplateCount
- End If
- If CheckPPDocsToAnalyze Then
- count = count + mPPDocCount + mPPTemplateCount
- End If
-
- GetNumberOfDocsToAnalyze = count
-End Function
-
-Function CheckWordDocsToAnalyze() As Boolean
-
- CheckWordDocsToAnalyze = mbDocCountCurrent And (chkWordDoc.value = vbChecked And mWordDocCount > 0) Or _
- (chkWordTemplate.value = vbChecked And mWordTemplateCount > 0)
-End Function
-
-Function CheckExcelDocsToAnalyze() As Boolean
- CheckExcelDocsToAnalyze = mbDocCountCurrent And (chkExcelDoc.value = vbChecked And mExcelDocCount > 0) Or _
- (chkExcelTemplate.value = vbChecked And mExcelTemplateCount > 0)
-End Function
-
-Function CheckPPDocsToAnalyze() As Boolean
- CheckPPDocsToAnalyze = mbDocCountCurrent And (chkPPDoc.value = vbChecked And mPPDocCount > 0) Or _
- (chkPPTemplate.value = vbChecked And mPPTemplateCount > 0)
-End Function
-
-Function CheckNumberDocsToAnalyze() As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckNumberDocsToAnalyze"
-
- Set mDocFiles = New CollectedFiles
-
- Dim docSearchTypes As Collection
- Set docSearchTypes = New Collection
-
- mbDocCountCurrent = False
-
- SetupDocSearchTypes docSearchTypes
-
- If (cbIgnoreOld.ListIndex = 0) Then
- mIssueLimit = 3
- ElseIf (cbIgnoreOld.ListIndex = 1) Then
- mIssueLimit = 6
- Else
- mIssueLimit = 12
- End If
-
- If Not mDocFiles.Search(rootDir:=getInputDir, FileSpecs:=docSearchTypes, _
- IncludeSubdirs:=IIf(chkIncludeSubdirs.value, mbTrue, mbFalse), _
- ignoreOld:=IIf(chkIgnoreOld.value, mbTrue, mbFalse), Months:=mIssueLimit) Then
- CheckNumberDocsToAnalyze = False
- GoTo FinalExit
- End If
-
- SetDocCountsFromFileSearch mDocFiles
- WriteFileDateCountsToLog mDocFiles
-
- 'WriteDocsToAnalyzeToLog mDocFiles 'UNCOMMENT Recovery - want to list out files to analyze
-
- mbDocCountCurrent = True
-
- lblNumDocs.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_ID), TOPIC_STR, _
- CStr(mWordDocCount))
- lblNumTemplates.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _
- CStr(mWordTemplateCount))
-
- lblNumXLS.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_XLS_ID), TOPIC_STR, _
- CStr(mExcelDocCount))
- lblNumXLT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _
- CStr(mExcelTemplateCount))
-
- lblNumPPT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_PPT_ID), TOPIC_STR, _
- CStr(mPPDocCount))
- lblNumPOT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _
- CStr(mPPTemplateCount))
-
- lblTotalNumDocs.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TOTAL_NUM_DOCS_ID), TOPIC_STR, _
- CStr(mTotalDocCount))
-
- If (mIgnoredDocCount > 0) Then
- lblSkippedOld.Caption = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYZE_IGNORED_DOCS_ID), _
- TOPIC_STR, CStr(mIgnoredDocCount))
- lblSkippedOld.Visible = True
- Else
- lblSkippedOld.Visible = False
- End If
-
- CheckNumberDocsToAnalyze = True
-
-FinalExit:
- Set docSearchTypes = Nothing
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Sub SetDocCountsFromFileSearch(myDocFiles As CollectedFiles)
- 'No Error handling required
- mWordDocCount = myDocFiles.DocCount
- mWordTemplateCount = myDocFiles.DotCount
- mExcelDocCount = myDocFiles.XlsCount
- mExcelTemplateCount = myDocFiles.XltCount
- mPPDocCount = myDocFiles.PptCount
- mPPTemplateCount = myDocFiles.PotCount
- mTotalDocCount = mWordDocCount + mWordTemplateCount + mExcelDocCount + mExcelTemplateCount + _
- mPPDocCount + mPPTemplateCount
- mIgnoredDocCount = myDocFiles.IgnoredDocCount
-End Sub
-
-Sub SetupDocSearchTypes(docSearchTypes As Collection)
- 'No Error handling required
- If chkWordDoc.value Then docSearchTypes.add ("*.doc")
- If chkWordTemplate.value Then docSearchTypes.add ("*.dot")
- If chkExcelDoc.value Then docSearchTypes.add ("*.xls")
- If chkExcelTemplate.value Then docSearchTypes.add ("*.xlt")
- If chkPPDoc.value Then docSearchTypes.add ("*.ppt")
- If chkPPTemplate.value Then docSearchTypes.add ("*.pot")
-End Sub
-
-Sub WriteDocsToAnalyzeToLog(myDocFiles As CollectedFiles)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteDocsToAnalyzeToLog"
-
- Dim vFileName As Variant
- Dim Index As Long
- Dim limit As Long
- limit = myDocFiles.WordFiles.count
- For Index = 1 To limit
- vFileName = myDocFiles.WordFiles(Index)
- WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_WORD)
- Next
- limit = myDocFiles.ExcelFiles.count
- For Index = 1 To limit
- vFileName = myDocFiles.ExcelFiles(Index)
- WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_EXCEL)
- Next
- limit = myDocFiles.PowerPointFiles.count
- For Index = 1 To limit
- vFileName = myDocFiles.PowerPointFiles(Index)
- WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_POWERPOINT)
- Next
-
-FinalExit:
- Exit Sub
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Sub WriteFileDateCountsToLog(myDocFiles As CollectedFiles)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "WriteFileDateCountsToLog"
-
- WriteToLog C_DOCS_LESS_3_MONTH, CStr(myDocFiles.DocsLessThan3Months), mIniFilePath
- WriteToLog C_DOCS_LESS_6_MONTH, CStr(myDocFiles.DocsLessThan6Months), mIniFilePath
- WriteToLog C_DOCS_LESS_12_MONTH, CStr(myDocFiles.DocsLessThan12Months), mIniFilePath
- WriteToLog C_DOCS_MORE_12_MONTH, CStr(myDocFiles.DocsMoreThan12Months), mIniFilePath
-
-FinalExit:
- Exit Sub
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-
-Function RunWordAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "RunWordAnalysis"
- Const APP_WORD = "Word"
- Dim str As String
- Dim bSuccess
- bSuccess = False
-
- Dim wrd As Word.application
- Dim aDoc As Word.Document
- Dim sWordDriverDocPath As String
- Dim RegValue As Long
-
- If (chkWordDoc.value <> vbChecked) And (chkWordTemplate.value <> vbChecked) Then
- 'No Word doc filters selected
- RunWordAnalysis = True
- Exit Function
- End If
-
- sWordDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE)
- If Not fsObject.FileExists(sWordDriverDocPath) Then
- str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _
- TOPIC_STR, sWordDriverDocPath, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- Set wrd = New Word.application
- If val(wrd.Version) < CSUPPORTED_VERSION Then
- str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _
- TOPIC_STR, wrd.Version, CR_STR, Chr(13))
- WriteDebug str
- MsgBox str, vbCritical
- bSuccess = False
- GoTo FinalExit
- End If
-
- If Not CheckForAccesToWordVBProject(wrd) Then
- RegValue = -1
- If Not GiveAccessToMacroProject(APP_WORD, wrd.Version, RegValue) Then
- Dim Style, response
- str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _
- TOPIC_STR, CAPPNAME_WORD, CR_STR, Chr(13))
- WriteDebug str
- Style = vbYesNo + vbQuestion + vbDefaultButton1
-
- response = MsgBox(str, Style)
- If response <> vbYes Then
- bSuccess = False
- GoTo FinalExit
- End If
- End If
- End If
-
- Set aDoc = wrd.Documents.Open(fileName:=sWordDriverDocPath)
- 'Clear out any doc vars
- Dim MyObj As Variable
- For Each MyObj In aDoc.Variables
- MyObj.Delete
- Next
-
- 'Setup Input Variables
- 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_WORD
-
- wrd.Run ("AnalysisTool.AnalysisDriver.AnalyseDirectory")
-
- wrd.Visible = False
- bSuccess = True
-
-FinalExit:
- If RegValue <> -1 Then
- SetDefaultRegValue APP_WORD, wrd.Version, RegValue
- End If
- If RegValue = 0 Then
- DeleteRegValue APP_WORD, wrd.Version
- End If
- If Not aDoc Is Nothing Then aDoc.Close (False)
- Set aDoc = Nothing
-
- If Not wrd Is Nothing Then wrd.Quit (False)
- Set wrd = Nothing
-
- RunWordAnalysis = bSuccess
- Exit Function
-
-HandleErrors:
- On Error Resume Next
-
- bSuccess = False
- Set aDoc = Nothing
- Set wrd = Nothing
-
- Dim failedDoc As String
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
-
- failedDoc = GetDebug(CAPPNAME_WORD, CANALYZING)
- If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then
- str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _
- TOPIC_STR, CAPPNAME_WORD, CR_STR, Chr(13))
- Else
- str = ReplaceTopic2Tokens(GetResString(ERR_WORD_DRIVER_CRASH), _
- TOPIC_STR, failedDoc, CR_STR, Chr(13))
- End If
-
- WriteDebug str
- MsgBox str, vbCritical
-
- Resume FinalExit
-End Function
-
-Function stripLastBackslash(inputStr As String) As String
- Const MIN_DIR_SIZE = 3
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "stripLastBackslash"
-
- If Len(inputStr) > MIN_DIR_SIZE Then
- Dim lastStrChar As String
- lastStrChar = Right(inputStr, 1)
- If lastStrChar = "\" Then
- inputStr = Left(inputStr, Len(inputStr) - 1)
- End If
- End If
- stripLastBackslash = inputStr
-
- Exit Function
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- stripLastBackslash = inputStr
-End Function
-
-Function getInputDir() As String
- getInputDir = stripLastBackslash(txtInputDir.Text)
-End Function
-
-Function getOutputDir() As String
- Dim tmpStr As String
-
- tmpStr = stripLastBackslash(txtOutputDir.Text)
-
- 'Bug when specifying C:\
- If tmpStr <> "" Then
- If Right(tmpStr, 1) = "\" Then
- tmpStr = Left(tmpStr, Len(tmpStr) - 1)
- End If
- End If
- getOutputDir = tmpStr
-End Function
-
-Function CheckCreateNewResultsFile(fsObject As FileSystemObject) As Boolean
- If Not fsObject.FileExists(getOutputDir & "\" & txtResultsName.Text) Then
- 'No Results File - Create it
- CheckCreateNewResultsFile = True
- ElseIf rdbResultsAppend.value Then
- 'Results File exists and user wants to append to it
- CheckCreateNewResultsFile = False
- Else
- 'Results File exists and user has elected not to append
- CheckCreateNewResultsFile = True
- End If
-End Function
-
-Sub DeleteFile(file As String)
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "DeleteFile"
- Dim fso As Scripting.FileSystemObject
- Set fso = New Scripting.FileSystemObject
- Dim filePath As String
-
- filePath = fso.GetAbsolutePathName(file)
- If fso.FileExists(filePath) Then
- fso.DeleteFile filePath, True
- End If
-
-FinalExit:
- Set fso = Nothing
- Exit Sub
-
-HandleErrors:
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Sub
-
-Public Property Get Version() As String
- Version = app.Major & "." & app.Minor & "." & app.Revision
-End Property
-
-Function GetExcelInstance() As Excel.application
- Dim xl As Excel.application
- On Error Resume Next
- 'Try and get an existing instance
- Set xl = GetObject(, "Excel.Application")
- If Err.Number = 429 Then
- Set xl = CreateObject("Excel.Application")
- ElseIf Err.Number <> 0 Then
- Set xl = Nothing
- MsgBox "Error: " & Err.Description
- Exit Function
- End If
- Set GetExcelInstance = xl
- Set xl = Nothing
-End Function
-
-Function CheckForAnalysisResultsWorkbook(analysisResultsName As String) As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckForAnalysisResultsWorkbook"
-
- CheckForAnalysisResultsWorkbook = False
-
- Dim xl As Excel.application
- Set xl = GetExcelInstance
-
- Dim aWb As Excel.Workbook
- For Each aWb In xl.Workbooks
-
- If aWb.Name = analysisResultsName Then
- CheckForAnalysisResultsWorkbook = True
- Exit For
- End If
- Next aWb
-
-FinalExit:
- If Not xl Is Nothing Then
- If xl.Workbooks.count = 0 Then
- xl.Quit
- End If
- End If
-
- Set xl = Nothing
-
- Exit Function
-
-HandleErrors:
- Set xl = Nothing
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Function CheckForExcel() As Boolean
- On Error GoTo HandleErrors
- Dim currentFunctionName As String
- currentFunctionName = "CheckForExcel"
-
- CheckForExcel = False
-
- Dim xl As Excel.application
- Set xl = GetExcelInstance
-
-
- If xl.Workbooks.count > 0 Then
- CheckForExcel = True
- End If
-
-FinalExit:
- If Not xl Is Nothing Then
- If xl.Workbooks.count = 0 Then
- xl.Quit
- End If
- End If
-
- Set xl = Nothing
-
- Exit Function
-
-HandleErrors:
- Set xl = Nothing
-
- WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source
- Resume FinalExit
-End Function
-
-Public Function GetIniSetting(key As String) As String
-
- If mIniFilePath = "" Or key = "" Then Exit Function
-
- GetIniSetting = ProfileGetItem(WIZARD_NAME, key, "", mIniFilePath)
-End Function
-
-Sub WriteIniSetting(key As String, value As String)
-
- If mIniFilePath = "" Or key = "" Then Exit Sub
-
- Call WritePrivateProfileString(WIZARD_NAME, key, value, mIniFilePath)
-End Sub
-
-Private Sub lblSetupComplete_Click(Index As Integer)
-
-End Sub
-
-Private Function CheckNeededFiles(missingFile As String) As Boolean
-
- Dim fso As New FileSystemObject
- Dim filePath As String
-
- CheckNeededFiles = False
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CLAUNCH_DRIVERS_EXE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CMSO_KILL_EXE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESULTS_TEMPLATE_FILE)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESOURCE_DLL)
- If Not fso.FileExists(filePath) Then
- missingFile = filePath
- Exit Function
- End If
-
- CheckNeededFiles = True
-End Function
+VERSION 5.00 +Begin VB.Form frmWizard + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 1 'Fixed Single + Caption = "OpenOffice.org Document Analysis Wizard" + ClientHeight = 5520 + ClientLeft = 1965 + ClientTop = 1815 + ClientWidth = 8175 + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Icon = "Wizard.frx":0000 + KeyPreview = -1 'True + LinkTopic = "Form1" + LockControls = -1 'True + MaxButton = 0 'False + MinButton = 0 'False + ScaleHeight = 5520 + ScaleWidth = 8175 + Tag = "1000" + Begin VB.Frame fraStep + BorderStyle = 0 'None + Caption = "Introduction" + ClipControls = 0 'False + Enabled = 0 'False + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 4905 + Index = 0 + Left = -10000 + TabIndex = 25 + Tag = "1000" + Top = 0 + Width = 8235 + Begin VB.PictureBox Picture4 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 4935 + Index = 0 + Left = 0 + ScaleHeight = 4935 + ScaleWidth = 2565 + TabIndex = 2 + TabStop = 0 'False + Top = 0 + Width = 2565 + Begin VB.PictureBox Picture10 + Height = 735 + Left = 2580 + ScaleHeight = 735 + ScaleWidth = 30 + TabIndex = 68 + TabStop = 0 'False + Top = 2610 + Width = 30 + End + Begin VB.PictureBox Picture6 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1485 + Left = 150 + ScaleHeight = 1485 + ScaleWidth = 2355 + TabIndex = 67 + TabStop = 0 'False + Top = 3390 + Width = 2355 + Begin VB.PictureBox Picture1 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1200 + Index = 0 + Left = 200 + Picture = "Wizard.frx":482C2 + ScaleHeight = 1200 + ScaleWidth = 1980 + TabIndex = 7 + TabStop = 0 'False + Tag = "1060" + Top = 300 + Width = 1980 + End + End + Begin VB.Label lblStep1_4 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "4. Analyze" + ForeColor = &H00BF4F59& + Height = 195 + Left = 120 + TabIndex = 89 + Tag = "1044" + Top = 1800 + Width = 2140 + End + Begin VB.Line Line2 + BorderColor = &H00808080& + Index = 2 + X1 = 2550 + X2 = 2550 + Y1 = 0 + Y2 = 4920 + End + Begin VB.Line Line3 + Index = 1 + X1 = 120 + X2 = 2280 + Y1 = 480 + Y2 = 480 + End + Begin VB.Label Label7 + BackColor = &H00EED3C2& + Caption = "1. Introduction" + ForeColor = &H00BF4F59& + Height = 255 + Index = 1 + Left = 120 + TabIndex = 11 + Tag = "1041" + Top = 720 + Width = 2140 + End + Begin VB.Label Label8 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "3. Results" + ForeColor = &H00BF4F59& + Height = 255 + Index = 1 + Left = 120 + TabIndex = 9 + Tag = "1043" + Top = 1440 + Width = 2140 + End + Begin VB.Label Label9 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "2. Documents" + ForeColor = &H00BF4F59& + Height = 255 + Index = 1 + Left = 120 + TabIndex = 10 + Tag = "1042" + Top = 1080 + Width = 2140 + End + Begin VB.Label Label12 + BackStyle = 0 'Transparent + Caption = "Steps" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 255 + Index = 1 + Left = 120 + TabIndex = 8 + Tag = "1040" + Top = 240 + Width = 2115 + End + End + Begin VB.PictureBox Picture8 + Appearance = 0 'Flat + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 4935 + Left = 2400 + ScaleHeight = 4935 + ScaleWidth = 5925 + TabIndex = 3 + TabStop = 0 'False + Top = -30 + Width = 5925 + Begin VB.CheckBox chkShowIntro + Caption = "Do not show this introduction again" + Enabled = 0 'False + Height = 315 + Left = 690 + MaskColor = &H00000000& + TabIndex = 6 + Tag = "1103" + Top = 4890 + Visible = 0 'False + Width = 3810 + End + Begin VB.Label lblIntroduction1 + AutoSize = -1 'True + Caption = $"Wizard.frx":4F8B8 + Height = 585 + Left = 690 + TabIndex = 93 + Tag = "1101" + Top = 750 + Width = 4890 + WordWrap = -1 'True + End + Begin VB.Label lblIntroduction3 + AutoSize = -1 'True + Caption = "The wizard will remain on screen while the analysis is carried out." + Height = 195 + Left = 690 + TabIndex = 0 + Tag = "1104" + Top = 2670 + Width = 4845 + WordWrap = -1 'True + End + Begin VB.Label lblIntroduction2 + AutoSize = -1 'True + Caption = "You will be able to select which documents you want to analyze as well as where you want the results to the analysis to be saved. " + Height = 390 + Left = 690 + TabIndex = 1 + Tag = "1102" + Top = 1800 + Width = 4875 + WordWrap = -1 'True + End + Begin VB.Label Label12 + BackStyle = 0 'Transparent + Caption = "Introduction" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 255 + Index = 2 + Left = 450 + TabIndex = 5 + Tag = "1100" + Top = 270 + Width = 4000 + End + End + End + Begin VB.Frame fraStep + BorderStyle = 0 'None + Caption = "Setup" + Enabled = 0 'False + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 4905 + Index = 1 + Left = -10000 + TabIndex = 32 + Tag = "2000" + Top = 0 + Width = 8235 + Begin VB.PictureBox Picture4 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 4905 + Index = 1 + Left = 0 + ScaleHeight = 4905 + ScaleWidth = 2565 + TabIndex = 61 + TabStop = 0 'False + Top = 0 + Width = 2565 + Begin VB.PictureBox Picture1 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1200 + Index = 1 + Left = 350 + Picture = "Wizard.frx":4F971 + ScaleHeight = 1200 + ScaleWidth = 1980 + TabIndex = 62 + TabStop = 0 'False + Tag = "1060" + Top = 3690 + Width = 1980 + End + Begin VB.Label lblStep2_4 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "4. Analyze" + ForeColor = &H00BF4F59& + Height = 195 + Left = 120 + TabIndex = 90 + Tag = "1044" + Top = 1800 + Width = 2140 + End + Begin VB.Line Line2 + BorderColor = &H00808080& + Index = 1 + X1 = 2550 + X2 = 2550 + Y1 = 0 + Y2 = 4920 + End + Begin VB.Label Label12 + BackStyle = 0 'Transparent + Caption = "Steps" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 255 + Index = 3 + Left = 120 + TabIndex = 66 + Tag = "1040" + Top = 240 + Width = 1335 + End + Begin VB.Label Label9 + BackColor = &H00EED3C2& + Caption = "2. Documents" + ForeColor = &H00BF4F59& + Height = 255 + Index = 2 + Left = 120 + TabIndex = 65 + Tag = "1042" + Top = 1080 + Width = 2140 + End + Begin VB.Label Label8 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "3. Results" + ForeColor = &H00BF4F59& + Height = 255 + Index = 2 + Left = 120 + TabIndex = 64 + Tag = "1043" + Top = 1440 + Width = 2140 + End + Begin VB.Label Label7 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "1. Introduction" + ForeColor = &H00BF4F59& + Height = 255 + Index = 2 + Left = 120 + TabIndex = 63 + Tag = "1041" + Top = 720 + Width = 2140 + End + Begin VB.Line Line3 + Index = 2 + X1 = 120 + X2 = 2280 + Y1 = 480 + Y2 = 480 + End + End + Begin VB.PictureBox Picture7 + Appearance = 0 'Flat + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 4725 + Left = 2580 + ScaleHeight = 4725 + ScaleWidth = 5535 + TabIndex = 58 + TabStop = 0 'False + Top = 0 + Width = 5535 + Begin VB.ComboBox cbIgnoreOld + Height = 330 + ItemData = "Wizard.frx":56F67 + Left = 3950 + List = "Wizard.frx":56F74 + Style = 2 'Dropdown List + TabIndex = 99 + Top = 1570 + Width = 1215 + End + Begin VB.CheckBox chkIgnoreOld + Caption = "Ignore documents older than" + Height = 225 + Left = 450 + TabIndex = 98 + Top = 1600 + Width = 3400 + End + Begin VB.CheckBox chkWordDoc + Caption = "Documents (*.doc)" + Height = 225 + Left = 2160 + TabIndex = 19 + Tag = "1208" + Top = 2600 + Value = 1 'Checked + Width = 3200 + End + Begin VB.CheckBox chkWordTemplate + Caption = "Templates (*.dot)" + Height = 225 + Left = 2160 + TabIndex = 20 + Tag = "1209" + Top = 2900 + Width = 3200 + End + Begin VB.CheckBox chkPPTemplate + Caption = "Templates (*.pot)" + Height = 225 + Left = 2160 + TabIndex = 24 + Tag = "1215" + Top = 4400 + Width = 3200 + End + Begin VB.CheckBox chkPPDoc + Caption = "Presentations (*.ppt)" + Height = 225 + Left = 2160 + TabIndex = 23 + Tag = "1214" + Top = 4100 + Width = 3200 + End + Begin VB.CheckBox chkExcelDoc + Caption = "Spreadsheets (*.xls)" + Height = 225 + Left = 2160 + TabIndex = 21 + Tag = "1211" + Top = 3350 + Width = 3200 + End + Begin VB.CheckBox chkExcelTemplate + Caption = "Templates (*.xlt)" + Height = 225 + Left = 2160 + TabIndex = 22 + Tag = "1212" + Top = 3650 + Width = 3200 + End + Begin VB.CommandButton btnBrowseDirInput + Caption = "..." + Height = 315 + Left = 4740 + TabIndex = 17 + Top = 900 + Width = 400 + End + Begin VB.TextBox txtInputDir + Height = 315 + Left = 450 + TabIndex = 16 + Tag = "1205" + Text = "C:\" + Top = 900 + Width = 4155 + End + Begin VB.CheckBox chkIncludeSubdirs + Caption = "Include subdirectories in the analysis" + Height = 225 + Left = 450 + TabIndex = 18 + Tag = "1202" + Top = 1300 + Width = 4965 + End + Begin VB.Label lblDocTypes + Caption = "Document types to analyze" + Height = 225 + Left = 450 + TabIndex = 95 + Tag = "1206" + Top = 2250 + Width = 4905 + End + Begin VB.Label lblChooseDocs + AutoSize = -1 'True + Caption = "Choose the documents you want to analyze" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 195 + Left = 300 + TabIndex = 94 + Tag = "1200" + Top = 240 + Width = 5115 + WordWrap = -1 'True + End + Begin VB.Label Label13 + AutoSize = -1 'True + Caption = "PowerPoint" + Height = 225 + Index = 2 + Left = 690 + TabIndex = 74 + Tag = "1213" + Top = 4100 + Width = 1245 + WordWrap = -1 'True + End + Begin VB.Label Label13 + AutoSize = -1 'True + Caption = "Excel" + Height = 225 + Index = 1 + Left = 690 + TabIndex = 73 + Tag = "1210" + Top = 3350 + Width = 1245 + WordWrap = -1 'True + End + Begin VB.Label Label13 + AutoSize = -1 'True + Caption = "Word" + Height = 225 + Index = 0 + Left = 690 + TabIndex = 72 + Tag = "1207" + Top = 2600 + Width = 1245 + WordWrap = -1 'True + End + Begin VB.Label Label1 + Caption = "Location of Microsoft Office documents" + Height = 200 + Left = 450 + TabIndex = 59 + Tag = "1201" + Top = 600 + Width = 4935 + End + End + End + Begin VB.Frame fraStep + BorderStyle = 0 'None + Caption = "Options" + Enabled = 0 'False + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 4905 + Index = 2 + Left = -10000 + TabIndex = 33 + Tag = "2002" + Top = 0 + Width = 8235 + Begin VB.PictureBox Picture11 + BorderStyle = 0 'None + Height = 555 + Left = 7260 + ScaleHeight = 555 + ScaleWidth = 705 + TabIndex = 75 + Top = 1890 + Width = 705 + Begin VB.CommandButton btnBrowseDirOut + Caption = "..." + Height = 375 + Left = 90 + TabIndex = 28 + Top = 90 + Width = 495 + End + End + Begin VB.TextBox txtResultsName + Height = 375 + Left = 3030 + TabIndex = 26 + Tag = "1302" + Text = "Analysis Results.xls" + Top = 1140 + Width = 3045 + End + Begin VB.TextBox txtOutputDir + Height = 375 + Left = 3030 + TabIndex = 27 + Top = 1980 + Width = 4185 + End + Begin VB.PictureBox Picture5 + Appearance = 0 'Flat + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1365 + Left = 3300 + ScaleHeight = 1365 + ScaleWidth = 4635 + TabIndex = 57 + TabStop = 0 'False + Top = 3210 + Width = 4635 + Begin VB.OptionButton rdbResultsPrompt + Caption = "Ask me before overwriting" + Height = 435 + Left = 0 + TabIndex = 29 + Tag = "1312" + Top = 0 + Value = -1 'True + Width = 4485 + End + Begin VB.OptionButton rdbResultsOverwrite + Caption = "Overwrite without asking me" + Height = 435 + Left = 0 + TabIndex = 30 + Tag = "1313" + Top = 450 + Width = 4455 + End + Begin VB.OptionButton rdbResultsAppend + Caption = "Append the new results to the existing results" + Height = 675 + Left = 0 + TabIndex = 31 + Tag = "1314" + Top = 780 + Visible = 0 'False + Width = 4515 + End + End + Begin VB.Frame Frame3 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + Enabled = 0 'False + ForeColor = &H0099A8AC& + Height = 5175 + Index = 0 + Left = 0 + TabIndex = 39 + Top = 0 + Width = 2535 + Begin VB.PictureBox Picture1 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1200 + Index = 3 + Left = 350 + Picture = "Wizard.frx":56F97 + ScaleHeight = 1200 + ScaleWidth = 1980 + TabIndex = 40 + TabStop = 0 'False + Top = 3690 + Width = 1980 + End + Begin VB.Label lblStep3_4 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "4. Analyze" + ForeColor = &H00BF4F59& + Height = 195 + Left = 120 + TabIndex = 91 + Tag = "1044" + Top = 1800 + Width = 2140 + End + Begin VB.Label Label12 + BackStyle = 0 'Transparent + Caption = "Steps" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 255 + Index = 0 + Left = 120 + TabIndex = 53 + Tag = "1040" + Top = 240 + Width = 1335 + End + Begin VB.Label Label9 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "2. Documents" + ForeColor = &H00BF4F59& + Height = 255 + Index = 0 + Left = 120 + TabIndex = 43 + Tag = "1042" + Top = 1080 + Width = 2140 + End + Begin VB.Label Label8 + BackColor = &H00EED3C2& + Caption = "3. Results" + ForeColor = &H00BF4F59& + Height = 255 + Index = 0 + Left = 120 + TabIndex = 42 + Tag = "1043" + Top = 1440 + Width = 2140 + End + Begin VB.Label Label7 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "1. Introduction" + ForeColor = &H00BF4F59& + Height = 255 + Index = 0 + Left = 120 + TabIndex = 41 + Tag = "1041" + Top = 720 + Width = 2140 + End + Begin VB.Line Line3 + Index = 0 + X1 = 120 + X2 = 2280 + Y1 = 480 + Y2 = 480 + End + End + Begin VB.Label Label3 + Caption = "File name for the results spreadsheet" + Height = 195 + Left = 3030 + TabIndex = 71 + Tag = "1301" + Top = 840 + Width = 4785 + End + Begin VB.Label lblResultsLocation + Caption = "Location" + Height = 195 + Left = 3030 + TabIndex = 70 + Tag = "1304" + Top = 1710 + Width = 4755 + End + Begin VB.Label Label13 + AutoSize = -1 'True + Caption = "If results already exisit under the same name and location:" + Height = 195 + Index = 5 + Left = 3030 + TabIndex = 38 + Tag = "1311" + Top = 2730 + Width = 4230 + WordWrap = -1 'True + End + Begin VB.Line Line2 + BorderColor = &H00808080& + Index = 0 + X1 = 2550 + X2 = 2550 + Y1 = 0 + Y2 = 4920 + End + Begin VB.Label lblChooseResults + AutoSize = -1 'True + Caption = "Choose where and how to save the analysis results" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 195 + Left = 2880 + TabIndex = 37 + Tag = "1300" + Top = 240 + Width = 5055 + WordWrap = -1 'True + End + End + Begin VB.Frame fraStep + BorderStyle = 0 'None + Caption = "Analyze" + Enabled = 0 'False + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 4905 + Index = 3 + Left = 0 + TabIndex = 34 + Tag = "3000" + Top = 0 + Width = 2.45745e5 + Begin VB.PictureBox Picture12 + Appearance = 0 'Flat + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 4905 + Left = 10020 + ScaleHeight = 4905 + ScaleWidth = 8175 + TabIndex = 69 + TabStop = 0 'False + Top = 0 + Width = 8175 + End + Begin VB.CommandButton btnPrepare + Caption = "Prepare" + Enabled = 0 'False + Height = 375 + Left = 3340 + TabIndex = 97 + Tag = "1411" + Top = 4410 + Visible = 0 'False + Width = 4000 + End + Begin VB.CommandButton btnRunAnalysis + Caption = "Run" + Height = 375 + Left = 3340 + TabIndex = 35 + Tag = "1404" + Top = 3410 + Width = 4000 + End + Begin VB.CommandButton btnViewResults + Caption = "View" + Enabled = 0 'False + Height = 375 + Left = 3340 + TabIndex = 36 + Tag = "1406" + Top = 3910 + Width = 4000 + End + Begin VB.Frame Frame3 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + Enabled = 0 'False + ForeColor = &H0099A8AC& + Height = 5175 + Index = 3 + Left = 0 + TabIndex = 44 + Top = 0 + Width = 2535 + Begin VB.PictureBox Picture4 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1575 + Index = 2 + Left = 150 + ScaleHeight = 1575 + ScaleWidth = 2385 + TabIndex = 55 + TabStop = 0 'False + Top = 3390 + Width = 2385 + Begin VB.PictureBox Picture1 + Appearance = 0 'Flat + BackColor = &H80000005& + BorderStyle = 0 'None + ForeColor = &H80000008& + Height = 1200 + Index = 2 + Left = 200 + Picture = "Wizard.frx":5E58D + ScaleHeight = 1200 + ScaleWidth = 2475 + TabIndex = 56 + TabStop = 0 'False + Tag = "1060" + Top = 300 + Width = 2480 + End + End + Begin VB.Label lblStep4_4 + BackColor = &H00EED3C2& + Caption = "4. Analyze" + ForeColor = &H00BF4F59& + Height = 255 + Left = 120 + TabIndex = 92 + Tag = "1044" + Top = 1800 + Width = 2140 + End + Begin VB.Label Label12 + BackStyle = 0 'Transparent + Caption = "Steps" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 255 + Index = 5 + Left = 120 + TabIndex = 54 + Tag = "1040" + Top = 240 + Width = 1335 + End + Begin VB.Label Label9 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "2. Documents" + ForeColor = &H00BF4F59& + Height = 255 + Index = 3 + Left = 120 + TabIndex = 47 + Tag = "1042" + Top = 1080 + Width = 2140 + End + Begin VB.Label Label8 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "3. Results" + ForeColor = &H00BF4F59& + Height = 255 + Index = 3 + Left = 120 + TabIndex = 46 + Tag = "1043" + Top = 1440 + Width = 2140 + End + Begin VB.Label Label7 + BackColor = &H00EED3C2& + BackStyle = 0 'Transparent + Caption = "1. Introduction" + ForeColor = &H00BF4F59& + Height = 255 + Index = 3 + Left = 120 + TabIndex = 45 + Tag = "1041" + Top = 720 + Width = 2140 + End + Begin VB.Line Line3 + Index = 3 + X1 = 120 + X2 = 2280 + Y1 = 480 + Y2 = 480 + End + End + Begin VB.Label lblSkippedOld + Caption = "Skipped <TOPIC> documets, because they were too old" + Height = 195 + Left = 3180 + TabIndex = 60 + Top = 2880 + Width = 4935 + End + Begin VB.Label lblSetupDone + AutoSize = -1 'True + Caption = "Run the analysis and view the results" + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 195 + Left = 2880 + TabIndex = 96 + Tag = "1400" + Top = 240 + Width = 4905 + WordWrap = -1 'True + End + Begin VB.Label lblNumPPT + Caption = "<TOPIC> Presentations" + Height = 255 + Left = 4620 + TabIndex = 88 + Tag = "1409" + Top = 2280 + Width = 3375 + End + Begin VB.Label lblNumPOT + Caption = "<TOPIC> Templates" + Height = 255 + Left = 4620 + TabIndex = 87 + Tag = "1403" + Top = 2550 + Width = 3375 + End + Begin VB.Label lblNumXLS + Caption = "<TOPIC> Spreadsheets" + Height = 255 + Left = 4620 + TabIndex = 86 + Tag = "1408" + Top = 1680 + Width = 3375 + End + Begin VB.Label lblNumXLT + Caption = "<TOPIC> Templates" + Height = 255 + Left = 4620 + TabIndex = 85 + Tag = "1403" + Top = 1950 + Width = 3375 + End + Begin VB.Label Label16 + AutoSize = -1 'True + Caption = "PowerPoint" + Height = 195 + Left = 3360 + TabIndex = 82 + Tag = "1213" + Top = 2280 + Width = 1095 + WordWrap = -1 'True + End + Begin VB.Label Label13 + Caption = "Word" + Height = 705 + Index = 10 + Left = 0 + TabIndex = 81 + Tag = "1207" + Top = 0 + Width = 1245 + End + Begin VB.Label Label13 + Caption = "Excel" + Height = 705 + Index = 9 + Left = 0 + TabIndex = 80 + Tag = "1210" + Top = 810 + Width = 1245 + End + Begin VB.Label Label13 + Caption = "PowerPoint" + Height = 585 + Index = 8 + Left = 0 + TabIndex = 79 + Tag = "1213" + Top = 1620 + Width = 1245 + End + Begin VB.Label Label13 + Caption = "Word" + Height = 585 + Index = 7 + Left = 0 + TabIndex = 78 + Tag = "1207" + Top = 0 + Width = 1245 + End + Begin VB.Label Label13 + Caption = "Excel" + Height = 585 + Index = 6 + Left = 0 + TabIndex = 77 + Tag = "1210" + Top = 810 + Width = 1245 + End + Begin VB.Label Label13 + Caption = "PowerPoint" + Height = 465 + Index = 4 + Left = 0 + TabIndex = 76 + Tag = "1213" + Top = 1620 + Width = 1245 + End + Begin VB.Label lblNumTemplates + Caption = "<TOPIC> Templates" + Height = 255 + Left = 4620 + TabIndex = 52 + Tag = "1403" + Top = 1350 + Width = 3375 + End + Begin VB.Label lblNumDocs + Caption = "<TOPIC> Documents" + Height = 255 + Left = 4620 + TabIndex = 51 + Tag = "1402" + Top = 1080 + Width = 3375 + End + Begin VB.Line Line6 + BorderColor = &H00808080& + X1 = 2640 + X2 = 8040 + Y1 = 3270 + Y2 = 3270 + End + Begin VB.Label Label15 + AutoSize = -1 'True + Caption = "Excel" + Height = 195 + Left = 3360 + TabIndex = 50 + Tag = "1210" + Top = 1680 + Width = 1095 + WordWrap = -1 'True + End + Begin VB.Label Label14 + AutoSize = -1 'True + Caption = "Word" + Height = 195 + Left = 3360 + TabIndex = 49 + Tag = "1207" + Top = 1080 + Width = 1110 + WordWrap = -1 'True + End + Begin VB.Label lblTotalNumDocs + AutoSize = -1 'True + Caption = "A total of <TOPIC> documents will be analyzed:" + Height = 195 + Left = 3180 + TabIndex = 48 + Tag = "1401" + Top = 660 + Width = 4800 + WordWrap = -1 'True + End + Begin VB.Line Line2 + BorderColor = &H00808080& + Index = 3 + X1 = 2550 + X2 = 2550 + Y1 = 0 + Y2 = 4920 + End + End + Begin VB.PictureBox picNav + Align = 2 'Align Bottom + Appearance = 0 'Flat + BorderStyle = 0 'None + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000008& + Height = 570 + Left = 0 + ScaleHeight = 570 + ScaleWidth = 8175 + TabIndex = 4 + TabStop = 0 'False + Top = 4950 + Width = 8175 + Begin VB.CommandButton cmdNav + Caption = "Finish" + Height = 312 + Index = 4 + Left = 5325 + MaskColor = &H00000000& + TabIndex = 14 + Tag = "1023" + Top = 120 + Width = 1320 + End + Begin VB.CommandButton cmdNav + Caption = "Next >>" + Height = 312 + Index = 3 + Left = 3870 + MaskColor = &H00000000& + TabIndex = 13 + Tag = "1022" + Top = 120 + Width = 1320 + End + Begin VB.CommandButton cmdNav + Caption = "<< Back" + Height = 312 + Index = 2 + Left = 2535 + MaskColor = &H00000000& + TabIndex = 12 + Tag = "1021" + Top = 120 + Width = 1320 + End + Begin VB.CommandButton cmdNav + Cancel = -1 'True + Caption = "Cancel" + Height = 312 + Index = 1 + Left = 6750 + MaskColor = &H00000000& + TabIndex = 15 + Tag = "1024" + Top = 120 + Width = 1320 + End + End + Begin VB.Label Label18 + Caption = "<TOPIC> Documents" + Height = 255 + Left = 0 + TabIndex = 84 + Top = 0 + Width = 2085 + WordWrap = -1 'True + End + Begin VB.Label Label17 + Caption = "<TOPIC> Templates" + Height = 255 + Left = 0 + TabIndex = 83 + Top = 390 + Width = 3615 + WordWrap = -1 'True + End + Begin VB.Line Line4 + BorderColor = &H00808080& + X1 = 0 + X2 = 8160 + Y1 = 4920 + Y2 = 4920 + End +End +Attribute VB_Name = "frmWizard" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +' ******************************************************************************* +' * +' * Copyright 2000, 2010 Oracle and/or its affiliates. All rights reserved. Use of this +' * product is subject to license terms. +' * +' ******************************************************************************* + +Option Explicit + +Const TOPIC_STR = "<TOPIC>" +Const TOPIC2_STR = "<TOPIC2>" +Const CR_STR = "<CR>" +Const CDEBUG_LEVEL_DEFAULT = 1 'Will output all Debug output to analysis.log file +Const CSUPPORTED_VERSION = 9# + +Const NUM_STEPS = 4 + +Const CAPPNAME_WORD = "Word" +Const CAPPNAME_EXCEL = "Excel" +Const CAPPNAME_POWERPOINT = "PowerPoint" +Const CANALYZING = "Analyzing" + +Const BTN_CANCEL = 1 +Const BTN_BACK = 2 +Const BTN_NEXT = 3 +Const BTN_FINISH = 4 + +Const STEP_INTRO = 0 +Const STEP_1 = 1 +Const STEP_2 = 2 +Const STEP_FINISH = 3 + +Const DIR_NONE = 0 +Const DIR_BACK = 1 +Const DIR_NEXT = 2 + +Const CPRODUCTNAME_STR = "<PRODUCTNAME>" + +Const CSTR_ANALYSIS_LOG_DONE = "Done" + +Const CINPUT_DIR = "indir" +Const COUTPUT_DIR = "outdir" +Const CRESULTS_FILE = "resultsfile" +Const CLOG_FILE = "logfile" +Const CRESULTS_TEMPLATE = "resultstemplate" +Const CRESULTS_EXIST = "resultsexist" +Const CPROMPT_FILE = "promptfile" +Const COVERWRITE_FILE = "overwritefile" +Const CAPPEND_FILE = "appendfile" +Const CNEW_RESULTS_FILE = "newresultsfile" +Const CINCLUDE_SUBDIRS = "includesubdirs" +Const CDEBUG_LEVEL = "debuglevel" +Const CTYPE_WORDDOC = "typeworddoc" +Const CTYPE_WORDDOT = "typeworddot" +Const CTYPE_EXCELDOC = "typeexceldoc" +Const CTYPE_EXCELDOT = "typeexceldot" +Const CTYPE_PPDOC = "typepowerpointdoc" +Const CTYPE_PPDOT = "typepowerpointdot" +Const COUTPUT_TYPE = "outputtype" +Const COUTPUT_TYPE_XLS = "xls" +Const COUTPUT_TYPE_XML = "xml" +Const COUTPUT_TYPE_BOTH = "both" +Const CVERSION = "version" +Const CDOPREPARE = "prepare" +Const CTITLE = "title" +Const CIGNORE_OLD_DOCS = "ignoreolddocuments" +Const CISSUE_LIMIT = "issuesmonthlimit" +Const CISSUE_LIMIT_DAW = 6 +Private mIssueLimit As Integer +Const CDEFAULT_PASSWORD = "defaultpassword" +Const CSTR_TEST_PASSWORD = "test" +Private mDefaultPassword As String + +Const CLAST_CHECKPOINT As String = "LastCheckpoint" +Const CNEXT_FILE As String = "NextFile" +Const C_ABORT_ANALYSIS As String = "AbortAnalysis" + +Const CNUMBER_TOTAL_DOCS = "total_numberdocs" +Const CNUMBER_DOCS_DOC = "numberdocs_doc" +Const CNUMBER_TEMPLATES_DOT = "numbertemplates_dot" +Const CNUMBER_DOCS_XLS = "numberdocs_xls" +Const CNUMBER_TEMPLATES_XLT = "numbertemplates_xlt" +Const CNUMBER_DOCS_PPT = "numberdocs_ppt" +Const CNUMBER_TEMPLATES_POT = "numbertemplates_pot" +Const CSTART_TIME = "start" +Const CEND_TIME = "end" +Const CELAPSED_TIME = "time_for_analysis" +Const CWINVERSION = "win_version" +Const CUSER_LOCALE_INFO = "user_locale" +Const CSYS_LOCALE_INFO = "system_locale" +Const CWORD_VERSION = "word_ver" +Const CEXCEL_VERSION = "excel_ver" +Const CPOWERPOINT_VERSION = "powerpoint_ver" +Const CNOT_INSTALLED = "not installed" + +Const CRESULTS_FILE_EXTENSION = ".xls" +Const CCONFIG_BACKUP_EXT = "_bak" +Const CDEFAULT_README_NAME = "UserGuide" + +Const C_DOCS_LESS_3_MONTH = "DocumentsYoungerThan3Month" +Const C_DOCS_LESS_6_MONTH = "DocumentsYoungerThan6Month" +Const C_DOCS_LESS_12_MONTH = "DocumentsYoungerThan12Month" +Const C_DOCS_MORE_12_MONTH = "DocumentsOlderThan12Month" + +'module level vars +Dim mnCurStep As Integer +Dim mbTrue As Boolean +Dim mbFalse As Boolean +Dim mLblSteps As String +Dim mChbSubdirs As String + +Dim mWordDocCount As Long +Dim mExcelDocCount As Long +Dim mPPDocCount As Long + +Dim mWordTemplateCount As Long +Dim mExcelTemplateCount As Long +Dim mPPTemplateCount As Long +Dim mTotalDocCount As Long +Dim mIgnoredDocCount As Long + +Public VBInst As VBIDE.VBE +Dim mbFinishOK As Boolean +Dim mbAllowExit As Boolean +Private mStrTrue As String +Private mLogFilePath As String +Private mDebugLevel As String +Private mIniFilePath As String +Private mbDocCountCurrent As Boolean +Private mbDoPrepare As Boolean + +Dim mDocFiles As CollectedFiles + +Private Declare Sub InitCommonControls Lib "comctl32" () +Private Declare Function GetTickCount Lib "kernel32" () As Long +Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) + +Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 + +Private Declare Function FormatMessage Lib "kernel32" Alias _ + "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _ + ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _ + ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long + + +Private Const HKEY_CURRENT_USER As Long = &H80000001 +Private Const HKEY_LOCAL_MACHINE As Long = &H80000002 + +Const WORD_APP = "word" +Const EXCEL_APP = "excel" +Const PP_APP = "pp" +Const REG_KEY_APP_PATH = "Software\Microsoft\Windows\CurrentVersion\App Paths\" + + +Function GetAppPath(myApp As String) As String + Dim myPath As String + + If (myApp = WORD_APP) Then + myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "winword.exe", "") + ElseIf (myApp = EXCEL_APP) Then + myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "excel.exe", "") + ElseIf (myApp = PP_APP) Then + myPath = GetRegistryInfo(HKEY_LOCAL_MACHINE, REG_KEY_APP_PATH & "powerpnt.exe", "") + Else + MsgBox "Unknown application: " & myApp, vbCritical + Exit Function + End If + + If (myPath = "") Then + If (myApp = WORD_APP) Then + myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "winword.exe", "") + ElseIf (myApp = EXCEL_APP) Then + myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "excel.exe", "") + ElseIf (myApp = PP_APP) Then + myPath = GetRegistryInfo(HKEY_CURRENT_USER, REG_KEY_APP_PATH & "powerpnt.exe", "") + End If + End If + + GetAppPath = myPath +End Function + +Function GetDriverDoc(myApp As String) As String + Dim myPath As String + Dim errStr As String + Dim fso As New FileSystemObject + + If (myApp = WORD_APP) Then + myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE) + ElseIf (myApp = EXCEL_APP) Then + myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE) + ElseIf (myApp = PP_APP) Then + myPath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) + Else + MsgBox "Unknown application: " & myApp, vbCritical + GoTo FinalExit + End If + + If Not fso.FileExists(myPath) Then + errStr = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _ + TOPIC_STR, myPath, CR_STR, Chr(13)) + WriteDebug errStr + MsgBox errStr, vbCritical + GoTo FinalExit + End If + + GetDriverDoc = myPath + +FinalExit: + Set fso = Nothing +End Function + + + + +Private Function AutomationMessageText(lCode As Long) As String + Dim sRtrnCode As String + Dim lRet As Long + + sRtrnCode = Space$(256) + lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, lCode, 0&, _ + sRtrnCode, 256&, 0&) + If lRet > 0 Then + AutomationMessageText = Left(sRtrnCode, lRet) + Else + AutomationMessageText = "Error not found." + End If + +End Function + +Private Sub btnBrowseDirInput_Click() + Dim folder As String + Dim StartDir As String + + If Len(txtInputDir.Text) > 0 Then + StartDir = txtInputDir.Text + End If + + folder = BrowseForFolder(Me, GetResString(BROWSE_FOR_DOC_DIR_ID), StartDir) + If Len(folder) = 0 Then + Exit Sub 'User Selected Cancel + End If + txtInputDir.Text = folder + txtInputDir.ToolTipText = folder + + If Len(txtOutputDir.Text) = 0 Then + txtOutputDir.Text = folder + txtOutputDir.ToolTipText = folder + End If +End Sub + +Private Sub btnBrowseDirOut_Click() + Dim folder As String + Dim StartDir As String + + If Len(txtOutputDir.Text) > 0 Then + StartDir = txtOutputDir.Text + End If + + folder = BrowseForFolder(Me, GetResString(BROWSE_FOR_RES_DIR_ID), StartDir) + If Len(folder) = 0 Then + Exit Sub 'User Selected Cancel + End If + txtOutputDir.Text = folder + txtOutputDir.ToolTipText = folder +End Sub + +Private Sub btnPrepare_Click() + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "btnPrepare_Click" + + mbDoPrepare = True + mbAllowExit = True + + btnViewResults.Enabled = False + btnRunAnalysis.Enabled = False + btnPrepare.Enabled = False + + cmdNav(BTN_CANCEL).Enabled = False + cmdNav(BTN_BACK).Enabled = False + cmdNav(BTN_NEXT).Enabled = False + cmdNav(BTN_FINISH).Enabled = False + btnPrepare.Caption = GetResString(RUNBTN_RUNNING_ID) + + Dim str As String + + If RunAnalysis(True) Then + cmdNav(BTN_FINISH).Enabled = True + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = True + btnPrepare.Enabled = True + btnViewResults.SetFocus + str = ReplaceTopic2Tokens(GetResString(RID_STR_ENG_OTHER_PREPARE_COMPLETED_PREP_ID), _ + TOPIC_STR, getOutputDir, CR_STR, Chr(13)) + MsgBox str, vbInformation + Else + cmdNav(BTN_FINISH).Enabled = False + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = False + btnPrepare.Enabled = False + End If + +FinalExit: + mbDoPrepare = False + cmdNav(BTN_CANCEL).Enabled = True + cmdNav(BTN_BACK).Enabled = True + cmdNav(BTN_NEXT).Enabled = False + btnPrepare.Caption = GetResString(PREPAREBTN_START_ID) + Exit Sub + +HandleErrors: + cmdNav(BTN_FINISH).Enabled = False + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = False + btnPrepare.Enabled = False + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + + +Private Sub cmdNav_Click(Index As Integer) + On Error GoTo HandleError + Dim currentFunctionName As String + currentFunctionName = "cmdNav_Click" + Dim nAltStep As Integer + Dim rc As Long + Dim fso As Scripting.FileSystemObject + + Select Case Index + Case BTN_CANCEL + 'Copy backup configuration file over existing + If fso Is Nothing Then + Set fso = New Scripting.FileSystemObject + End If + If fso.FileExists(mIniFilePath & CCONFIG_BACKUP_EXT) Then + DeleteFile mIniFilePath + AttemptToCopyFile mIniFilePath & CCONFIG_BACKUP_EXT, mIniFilePath + End If + Set mDocFiles = Nothing + + Unload Me + + Case BTN_BACK + nAltStep = mnCurStep - 1 + SetStep nAltStep, DIR_BACK + + Case BTN_NEXT + nAltStep = mnCurStep + 1 + SetStep nAltStep, DIR_NEXT + + Case BTN_FINISH + If (Not mbAllowExit) Then + Dim str As String + Dim response As Integer + + str = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYSE_NOT_RUN), CR_STR, Chr(13)) + response = MsgBox(str, vbOKCancel + vbInformation) + If response = vbOK Then ' User chose Ok. + mbAllowExit = True + End If + End If + + If (mbAllowExit) Then + DeleteFile mIniFilePath & CCONFIG_BACKUP_EXT + Set mDocFiles = Nothing + Unload Me + End If + End Select + +FinalExit: + Set fso = Nothing + Exit Sub + +HandleError: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + + Resume FinalExit +End Sub + +Private Sub btnRunAnalysis_Click() + On Error GoTo HandleErrors + Dim bViewResults As Boolean + Dim str As String + Dim response As Integer + + btnViewResults.Enabled = False + btnRunAnalysis.Enabled = False + btnPrepare.Enabled = False + bViewResults = False + mbAllowExit = True + + cmdNav(BTN_CANCEL).Enabled = False + cmdNav(BTN_BACK).Enabled = False + cmdNav(BTN_NEXT).Enabled = False + cmdNav(BTN_FINISH).Enabled = False + btnRunAnalysis.Caption = GetResString(RUNBTN_RUNNING_ID) + + If RunAnalysis(False) Then + cmdNav(BTN_FINISH).Enabled = True + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = True + btnPrepare.Enabled = True + btnViewResults.SetFocus + btnRunAnalysis.Caption = GetResString(RUNBTN_START_ID) + + str = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYZE_COMPLETED_ID), CR_STR, Chr(13)) + response = MsgBox(str, vbOKCancel + vbInformation) + If response = vbOK Then ' User chose Ok. + bViewResults = True + End If + Else + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = False + btnPrepare.Enabled = False + End If + +FinalExit: + cmdNav(BTN_CANCEL).Enabled = True + cmdNav(BTN_BACK).Enabled = True + cmdNav(BTN_NEXT).Enabled = False + btnRunAnalysis.Caption = GetResString(RUNBTN_START_ID) + + If bViewResults Then + btnViewResults_Click + End If + + Exit Sub + +HandleErrors: + cmdNav(BTN_FINISH).Enabled = False + btnRunAnalysis.Enabled = True + btnViewResults.Enabled = False + btnPrepare.Enabled = False + WriteDebug "Document Analysis: View Analysis Results" & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Private Sub btnViewResults_Click() + On Error GoTo HandleErrors + Dim resultsFile As String + Dim fso As New FileSystemObject + Dim str As String + + mbAllowExit = True + + resultsFile = getOutputDir & "\" & txtResultsName.Text + + If GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_XML Or _ + GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_BOTH Then + + Dim base As String + Dim path As String + base = fso.GetParentFolderName(resultsFile) & "\" & fso.GetBaseName(txtResultsName.Text) + If CheckWordDocsToAnalyze Then + path = base & "_" & CAPPNAME_WORD & "." & COUTPUT_TYPE_XML + End If + If CheckExcelDocsToAnalyze Then + If path <> "" Then path = path & vbLf + path = path & base & "_" & CAPPNAME_EXCEL & "." & COUTPUT_TYPE_XML + End If + If CheckPPDocsToAnalyze Then + If path <> "" Then path = path & vbLf + path = path & base & "_" & CAPPNAME_POWERPOINT & "." & COUTPUT_TYPE_XML + End If + + str = ReplaceTopic2Tokens(GetResString(XML_RESULTS_ID), _ + TOPIC_STR, path, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbInformation + If GetIniSetting(COUTPUT_TYPE) = COUTPUT_TYPE_XML Then + Resume FinalExit + End If + End If + + If Not fso.FileExists(resultsFile) Then + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_RESULTS_DOC), _ + TOPIC_STR, resultsFile, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + Resume FinalExit + End If + + Dim xl As Excel.application + Set xl = New Excel.application + xl.Visible = True + xl.Workbooks.Open resultsFile + +FinalExit: + Set xl = Nothing + Set fso = Nothing + + Exit Sub +HandleErrors: + WriteDebug "Document Analysis: View Analysis Results" & Err.Number & " " & Err.Description & " " & Err.Source +End Sub + +Private Sub Form_Activate() + Dim currentFunctionName As String + Dim missingFile As String + currentFunctionName = "Form_Activate" + On Error GoTo HandleErrors + + If Not CheckNeededFiles(missingFile) Then + Dim str As String + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _ + TOPIC_STR, missingFile, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + + End 'Exit application - some needed files are missing + End If + +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + GoTo FinalExit +End Sub + +Private Sub Form_Initialize() + Dim currentFunctionName As String + currentFunctionName = "Form_Initialize" + On Error GoTo ErrorHandler + Call InitCommonControls 'Use Windows XP Visual Style + +FinalExit: + Exit Sub + +ErrorHandler: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + GoTo FinalExit +End Sub + +Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) + If KeyCode = vbKeyF1 Then + 'cmdNav_Click BTN_HELP + End If +End Sub + +Private Sub Form_Load() + Const COS_CHECK = "oscheck" + + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "Form_Load" + + Dim fso As New FileSystemObject + Dim i As Integer + 'init all vars + mbFinishOK = False + mbTrue = True + mbFalse = False + + mLogFilePath = GetLogFilePath + mIniFilePath = GetIniFilePath + mbDocCountCurrent = False + mbDoPrepare = False + mbAllowExit = False + + 'Check OS before running + Dim bOSCheck As Boolean + bOSCheck = IIf(GetIniSetting(COS_CHECK) = "False", False, True) + + If bOSCheck Then + If Not IsWin98Plus Then + Dim str As String + Dim winVer As RGB_WINVER + str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_OSVERSION), _ + TOPIC_STR, GetWinVersion(winVer), CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + + End 'Exit application - unsupported OS + End If + Else + Err.Clear + WriteDebug "IsWin2000Plus OS Check bypassed by analysis.ini oscheck=False setting" + End If + + + For i = 0 To NUM_STEPS - 1 + fraStep(i).Left = -10000 + Next + + 'Load All string info for Form + LoadResStrings Me + + frmWizard.Caption = ReplaceTopicTokens(GetResString(TITLE_ID), CPRODUCTNAME_STR, _ + GetResString(PRODUCTNAME_ID)) + lblIntroduction1.Caption = ReplaceTopicTokens(GetResString(INTRO1_ID), CPRODUCTNAME_STR, _ + GetResString(PRODUCTNAME_ID)) + mLblSteps = GetResString(LBL_STEPS_ID) + mChbSubdirs = GetResString(CHK_SUBDIRS_ID) + + ' Setup Doc Preparation specific strings + If gBoolPreparation Then + ' Steps + lblStep1_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID) + lblStep2_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID) + lblStep3_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID) + lblStep4_4.Caption = GetResString(RID_STR_ENG_SIDEBAR_ANALYZE_PREP_ID) + + ' Preparation - Step 1. Introduction + lblIntroduction1.Caption = ReplaceTopicTokens(GetResString(RID_STR_ENG_INTRODUCTION_INTRO1_PREP_ID), CPRODUCTNAME_STR, _ + GetResString(PRODUCTNAME_ID)) + lblIntroduction2.Caption = GetResString(RID_STR_ENG_INTRODUCTION_INTRO2_PREP_ID) + lblIntroduction3.Caption = GetResString(RID_STR_ENG_INTRODUCTION_INTRO3_PREP_ID) + + ' Preparation - Step 2. Documents + lblChooseDocs.Caption = GetResString(RID_STR_ENG_DOCUMENTS_CHOOSE_DOCUMENTS_PREP_ID) + lblDocTypes.Caption = GetResString(RID_STR_ENG_DOCUMENTS_CHOOSE_DOC_TYPES_PREP_ID) + 'mChbSubdirs = GetResString(RID_STR_ENG_DOCUMENTS_INCLUDE_SUBDIRECTORIES_PREP_ID) + chkIgnoreOld.Caption = GetResString(RID_STR_IGNORE_OLDER_CB_ID) + + cbIgnoreOld.Clear + cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_3_MONTHS_ID)) + cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_6_MONTHS_ID)) + cbIgnoreOld.AddItem (GetResString(RID_STR_IGNORE_OLDER_12_MONTHS_ID)) + cbIgnoreOld.ListIndex = 0 + + ' Preparation - Step 3. Results + lblChooseResults.Caption = GetResString(RID_STR_ENG_RESULTS_CHOOSE_OPTIONS_PREP_ID) + txtResultsName.Text = GetResString(RID_STR_ENG_RESULTS_ANALYSIS_XLS_PREP_ID) + + 'Show Append option + rdbResultsAppend.Visible = True + + ' Preparation - Step 4. Analysis + lblSetupDone.Caption = GetResString(RID_STR_ENG_ANALYZE_SETUP_COMPLETE_PREP_ID) + btnPrepare.Visible = True + Else + ' The next line is a work around for a wrong translated string and should be removed + ' when RID_STR_ENG_RESULTS_CHOOSE_OPTIONS has been corrected + lblChooseResults.Caption = GetResString(RID_STR_ENG_RESULTS_CHOOSE_OPTIONS_PREP_ID) + mDefaultPassword = IIf(GetIniSetting(CDEFAULT_PASSWORD) = "", _ + CSTR_TEST_PASSWORD, GetIniSetting(CDEFAULT_PASSWORD)) + End If + + SetStep 0, DIR_NEXT + Dim tmpStr As String + + 'Setup Params + tmpStr = GetIniSetting(CINPUT_DIR) + If tmpStr <> "" Then + txtInputDir.Text = tmpStr + txtInputDir.ToolTipText = tmpStr + End If + tmpStr = GetIniSetting(COUTPUT_DIR) + If tmpStr <> "" Then + If Right(tmpStr, 1) = ":" And Len(tmpStr) = 2 Then + tmpStr = tmpStr & "\" + End If + txtOutputDir.Text = tmpStr + txtOutputDir.ToolTipText = tmpStr + End If + tmpStr = GetIniSetting(CRESULTS_FILE) + If tmpStr <> "" Then txtResultsName.Text = tmpStr + + rdbResultsPrompt.value = False + rdbResultsOverwrite.value = False + rdbResultsAppend.value = False + Dim resultsSetting As String + resultsSetting = GetIniSetting(CRESULTS_EXIST) + If resultsSetting = CPROMPT_FILE Then + rdbResultsPrompt.value = True + ElseIf resultsSetting = CAPPEND_FILE Then + rdbResultsAppend.value = True + Else + rdbResultsOverwrite.value = True + End If + + chkWordDoc.value = IIf(GetIniSetting(CTYPE_WORDDOC) = CStr(True), vbChecked, 0) + chkWordTemplate.value = IIf(GetIniSetting(CTYPE_WORDDOT) = CStr(True), vbChecked, 0) + chkExcelDoc.value = IIf(GetIniSetting(CTYPE_EXCELDOC) = CStr(True), vbChecked, 0) + chkExcelTemplate.value = IIf(GetIniSetting(CTYPE_EXCELDOT) = CStr(True), vbChecked, 0) + chkPPDoc.value = IIf(GetIniSetting(CTYPE_PPDOC) = CStr(True), vbChecked, 0) + chkPPTemplate.value = IIf(GetIniSetting(CTYPE_PPDOT) = CStr(True), vbChecked, 0) + chkIncludeSubdirs.value = IIf(GetIniSetting(CINCLUDE_SUBDIRS) = CStr(True), vbChecked, 0) + mDebugLevel = IIf(GetIniSetting(CDEBUG_LEVEL) = "", CDEBUG_LEVEL_DEFAULT, GetIniSetting(CDEBUG_LEVEL)) + chkIgnoreOld.value = IIf(GetIniSetting(CIGNORE_OLD_DOCS) = CStr(True), vbChecked, 0) + + mIssueLimit = IIf(GetIniSetting(CISSUE_LIMIT) = "", CISSUE_LIMIT_DAW, GetIniSetting(CISSUE_LIMIT)) + If (mIssueLimit <= 3) Then + cbIgnoreOld.ListIndex = 0 + ElseIf (mIssueLimit <= 6) Then + cbIgnoreOld.ListIndex = 1 + Else + cbIgnoreOld.ListIndex = 2 + End If + + 'Always ensure at least one doc type is selected on startup + If (chkWordDoc.value <> vbChecked) And _ + (chkWordTemplate.value <> vbChecked) And _ + (chkExcelDoc.value <> vbChecked) And _ + (chkExcelTemplate.value <> vbChecked) And _ + (chkPPDoc.value <> vbChecked) And _ + (chkPPTemplate.value <> vbChecked) Then + + chkWordDoc.value = vbChecked + End If + +FinalExit: + Set fso = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Private Sub SetStep(nStep As Integer, nDirection As Integer) + On Error GoTo HandleError + Const driveTypeIsCDROM = 4 + Dim val As String + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + Dim drive + + + mbDocCountCurrent = False + + Select Case nStep + Case STEP_INTRO + 'MsgBox "Enter Intro" + Case STEP_1 + 'Leave Introduction + 'Workaround - resource bug for SubDir checkbox, have to set it explicitly + chkIncludeSubdirs.Caption = mChbSubdirs + Case STEP_2 + 'Leave Documents + + Set drive = fso.GetDrive(fso.GetDriveName(txtInputDir.Text)) + If drive.DriveType = driveTypeIsCDROM Then + If Not drive.IsReady Then + MsgBox GetResString(ERR_CDROM_NOT_READY), vbCritical + Exit Sub + End If + End If + + If txtInputDir.Text = "" Or Not fso.FolderExists(txtInputDir.Text) Then ' fso.FolderExists() has replaced dir() + MsgBox ReplaceTopicTokens(GetResString(ERR_NO_DOC_DIR), _ + CR_STR, Chr(13)), vbCritical + Exit Sub + End If + + If Not CheckUserChosenDocsToAnalyze Then + MsgBox GetResString(ERR_NO_DOC_TYPES), vbCritical + Exit Sub + End If + 'Expand directory name only without path to full path + txtInputDir.Text = fso.GetAbsolutePathName(txtInputDir.Text) + + If txtOutputDir.Text = "" Then + txtOutputDir.Text = txtInputDir.Text + End If + + mbFinishOK = False + + 'Workaround - label resource bug for Steps, have to set it explicitly + Label12(0).Caption = mLblSteps + Label12(5).Caption = mLblSteps + Case STEP_FINISH + 'Leave Results + If Not CheckResultsDir(getOutputDir) Then + Exit Sub + End If + + 'Expand directory name only without path to full path + txtOutputDir.Text = fso.GetAbsolutePathName(txtOutputDir) + + 'Check Results file is there and has a valid extension + If fso.GetBaseName(txtResultsName.Text) = "" Then + txtResultsName.Text = GetResString(SETUP_ANALYSIS_XLS_ID) + End If + txtResultsName.Text = fso.GetBaseName(txtResultsName.Text) & CRESULTS_FILE_EXTENSION + + Screen.MousePointer = vbHourglass + DeleteFile mLogFilePath + Set mDocFiles = Nothing + If Not CheckNumberDocsToAnalyze Then + Screen.MousePointer = vbDefault + Exit Sub + End If + + Screen.MousePointer = vbDefault + + btnRunAnalysis.Enabled = True + + If GetNumberOfDocsToAnalyze = 0 Then + btnRunAnalysis.Enabled = False + End If + + 'Backup configuration + If Not AttemptToCopyFile(mIniFilePath, mIniFilePath & CCONFIG_BACKUP_EXT) Then + Exit Sub + End If + + 'Save current Wizard Settings + WriteWizardSettingsToLog mIniFilePath + + 'If results file already exists, enable View and Prepare + If fso.FileExists(getOutputDir & "\" & txtResultsName.Text) Then + btnViewResults.Enabled = True + btnPrepare.Enabled = True + End If + + mbFinishOK = True + End Select + + 'move to new step + fraStep(mnCurStep).Enabled = False + fraStep(nStep).Left = 0 + If nStep <> mnCurStep Then + fraStep(mnCurStep).Left = -10000 + fraStep(mnCurStep).Enabled = False + End If + fraStep(nStep).Enabled = True + + SetNavBtns nStep + Exit Sub + +FinalExit: + Set fso = Nothing + Set drive = Nothing + Exit Sub + +HandleError: + Screen.MousePointer = vbDefault + WriteDebug "Document Analysis: SetStep() " & Err.Number & " " & Err.Description & " " & Err.Source + + Resume FinalExit +End Sub + +Function CheckResultsDir(resultsDir As String) As Boolean + On Error GoTo HandleError + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + Const driveTypeIsCDROM = 4 + Const readOnlyFolderRemainder = 1 + Dim drive + CheckResultsDir = False + + If resultsDir = "" Then + MsgBox ReplaceTopicTokens(GetResString(ERR_NO_RESULTS_DIRECTORY), _ + CR_STR, Chr(13)), vbCritical + CheckResultsDir = False + Exit Function + End If + + Set drive = fso.GetDrive(fso.GetDriveName(resultsDir)) + If drive.DriveType = driveTypeIsCDROM Then 'If CD-ROM Drive Then + Dim Msg1 As String + Msg1 = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _ + TOPIC_STR, txtResultsName.Text, CR_STR, Chr(13)) + MsgBox Msg1, vbCritical + CheckResultsDir = False + Exit Function + End If + + + If Not fso.FolderExists(resultsDir) Then + Dim Msg, Style, response + + Msg = ReplaceTopicTokens(GetResString(ERR_NO_RES_DIR), CR_STR, Chr(13)) + Style = vbYesNo + vbQuestion + vbDefaultButton1 ' Define buttons. + + response = MsgBox(Msg, Style) + If response = vbYes Then ' User chose Yes. + If Not CreateDir(getOutputDir) Then + CheckResultsDir = False + Exit Function + End If + Else ' User chose No. + CheckResultsDir = False + Exit Function + End If + End If + + Dim testFile As String + testFile = resultsDir & "\" & fso.GetTempName + Do While fso.FileExists(testFile) + testFile = resultsDir & "\" & fso.GetTempName + Loop + + On Error GoTo HandleReadOnly + Dim aText As TextStream + Set aText = fso.CreateTextFile(testFile, False, False) + aText.WriteLine ("Dies ist ein Test.") + aText.Close + fso.DeleteFile (testFile) + +' GetAttr doesn't work reliable ( returns read only for 'my Documents' and rw for read only network folder +' If ((GetAttr(resultsDir) Mod 2) = readOnlyFolderRemainder) Then 'If the attribute is odd then the folder is read-only +' MsgBox GetResString(ERR_NO_WRITE_TO_READ_ONLY_FOLDER), vbCritical +' CheckResultsDir = False +' Exit Function +' End If + + CheckResultsDir = True + + Exit Function +HandleError: + WriteDebug "Document Analysis: CheckResultsDir() " & Err.Number & " " & Err.Description & " " & Err.Source + CheckResultsDir = False + Exit Function +HandleReadOnly: + Dim str As String + str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _ + TOPIC_STR, txtResultsName.Text, CR_STR, Chr(13)) + MsgBox str, vbCritical + CheckResultsDir = False + Exit Function +End Function + +Function CheckUserChosenDocsToAnalyze() As Boolean + CheckUserChosenDocsToAnalyze = Not ((chkWordDoc.value <> vbChecked) And (chkWordTemplate.value <> vbChecked) And _ + (chkExcelDoc.value <> vbChecked) And (chkExcelTemplate.value <> vbChecked) And _ + (chkPPDoc.value <> vbChecked) And (chkPPTemplate.value <> vbChecked)) +End Function + +Function AttemptToCopyFile(Source As String, dest As String) As Boolean + On Error GoTo HandleErrors + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + + If fso.FileExists(Source) Then + fso.CopyFile Source, dest + End If + + 'True if no source or copy succeeded + AttemptToCopyFile = True + +FinalExit: + Set fso = Nothing + Exit Function + +HandleErrors: + AttemptToCopyFile = False + Dim str As String + str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_FILE), _ + TOPIC_STR, mIniFilePath & CCONFIG_BACKUP_EXT, CR_STR, Chr(13)) + Resume FinalExit + +End Function + +Function CreateDir(dir As String) As Boolean + On Error GoTo HandleErrors + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + + fso.CreateFolder (dir) + + CreateDir = True + +FinalExit: + Set fso = Nothing + Exit Function + +HandleErrors: + Dim str As String + str = ReplaceTopic2Tokens(GetResString(ERR_CREATE_DIR), _ + TOPIC_STR, dir, CR_STR, Chr(13)) + Select Case Err.Number + Case 76 + WriteDebug str + MsgBox str, vbCritical + CreateDir = False + Case 58 + 'Don't care if it exists already + CreateDir = True + Case Else + WriteDebug str + MsgBox str, vbCritical + CreateDir = False + End Select + Resume FinalExit + +End Function +Private Sub SetNavBtns(nStep As Integer) + mnCurStep = nStep + + If mnCurStep = 0 Then + cmdNav(BTN_BACK).Enabled = False + cmdNav(BTN_NEXT).Enabled = True + ElseIf mnCurStep = NUM_STEPS - 1 Then + cmdNav(BTN_NEXT).Enabled = False + cmdNav(BTN_BACK).Enabled = True + Else + cmdNav(BTN_BACK).Enabled = True + cmdNav(BTN_NEXT).Enabled = True + End If + + If mbFinishOK Then + cmdNav(BTN_FINISH).Enabled = True + Else + cmdNav(BTN_FINISH).Enabled = False + End If +End Sub +Function CheckForSupportedApp(app As String, lowerVerLimit As Long) As Boolean + Dim appRegStr As String + Dim appVer As Long + appRegStr = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "") + appVer = val(Right(appRegStr, Len(appRegStr) - Len(app & ".Application."))) + If appVer >= lowerVerLimit Then + CheckForSupportedApp = True + Else + CheckForSupportedApp = False + End If +End Function +Function GetAppVersion(app As String) As Long + Dim appRegStr As String + Dim appVer As Long + appRegStr = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "") + GetAppVersion = val(Right(appRegStr, Len(appRegStr) - Len(app & ".Application."))) +End Function +Function GetInstalledApp(app As String) As String + GetInstalledApp = GetRegistryInfo(HKEY_CLASSES_ROOT, app & ".Application\CurVer", "") +End Function + +Sub WriteInfoToApplicationLog(wordAppStr As String, excelAppStr As String, ppAppStr As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteInfoToApplicationLog" + + Dim userLCID As Long + userLCID = GetUserDefaultLCID() + Dim sysLCID As Long + sysLCID = GetSystemDefaultLCID() + + WriteToLog CWORD_VERSION, IIf(wordAppStr <> "", wordAppStr, CNOT_INSTALLED) + WriteToLog CEXCEL_VERSION, IIf(excelAppStr <> "", excelAppStr, CNOT_INSTALLED) + WriteToLog CPOWERPOINT_VERSION, IIf(ppAppStr <> "", ppAppStr, CNOT_INSTALLED) + + WriteToLog CUSER_LOCALE_INFO, _ + "langid: " & GetUserLocaleInfo(userLCID, LOCALE_ILANGUAGE) & ": " & _ + GetUserLocaleInfo(userLCID, LOCALE_SENGLANGUAGE) & _ + "-" & GetUserLocaleInfo(userLCID, LOCALE_SENGCOUNTRY) & _ + " abrv: " & GetUserLocaleInfo(userLCID, LOCALE_SISO639LANGNAME) & _ + "-" & GetUserLocaleInfo(userLCID, LOCALE_SISO3166CTRYNAME) & _ + " sdate: " & GetUserLocaleInfo(userLCID, LOCALE_SSHORTDATE) + + WriteToLog CSYS_LOCALE_INFO, _ + "langid: " & GetUserLocaleInfo(sysLCID, LOCALE_ILANGUAGE) & ": " & _ + GetUserLocaleInfo(sysLCID, LOCALE_SENGLANGUAGE) & _ + "-" & GetUserLocaleInfo(sysLCID, LOCALE_SENGCOUNTRY) & _ + " abrv: " & GetUserLocaleInfo(sysLCID, LOCALE_SISO639LANGNAME) & _ + "-" & GetUserLocaleInfo(sysLCID, LOCALE_SISO3166CTRYNAME) & _ + " sdate: " & GetUserLocaleInfo(userLCID, LOCALE_SSHORTDATE) + + Dim myWinVer As RGB_WINVER + GetWinVersion myWinVer + WriteToLog CWINVERSION, myWinVer.VersionName & " " & myWinVer.VersionNo & _ + " " & myWinVer.ServicePack & _ + " build " & myWinVer.BuildNo + WriteToLog CNUMBER_TOTAL_DOCS, CStr(mTotalDocCount) + WriteToLog CNUMBER_DOCS_DOC, CStr(mWordDocCount) + WriteToLog CNUMBER_TEMPLATES_DOT, CStr(mWordTemplateCount) + WriteToLog CNUMBER_DOCS_XLS, CStr(mExcelDocCount) + WriteToLog CNUMBER_TEMPLATES_XLT, CStr(mExcelTemplateCount) + WriteToLog CNUMBER_DOCS_PPT, CStr(mPPDocCount) + WriteToLog CNUMBER_TEMPLATES_POT, CStr(mPPTemplateCount) +FinalExit: + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Function CheckTemplatePath(sMigrationResultsTemplatePath As String, fso As FileSystemObject) As Boolean + If Not fso.FileExists(sMigrationResultsTemplatePath) Then + Dim str As String + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_RESULTS_TEMPLATE), _ + TOPIC_STR, sMigrationResultsTemplatePath, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + CheckTemplatePath = False + Else + CheckTemplatePath = True + End If +End Function + +Function RunAnalysis(bDoPrepare) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "RunAnalysis" + Dim tstart As Single 'timer var for this routine only + Dim tend As Single 'timer var for this routine only + Dim fso As New FileSystemObject + Dim wordAppStr As String + Dim excelAppStr As String + Dim ppAppStr As String + Dim sMigrationResultsTemplatePath As String + Dim startDate As Variant + Dim bSuccess + + bSuccess = True + startDate = Now + tstart = GetTickCount() + + app.OleRequestPendingMsgText = GetResString(RUNBTN_RUNNING_ID) + app.OleRequestPendingMsgTitle = frmWizard.Caption + + wordAppStr = GetInstalledApp(CAPPNAME_WORD) + excelAppStr = GetInstalledApp(CAPPNAME_EXCEL) + ppAppStr = GetInstalledApp(CAPPNAME_POWERPOINT) + 'Write locale, version info and settings to the Application log + WriteInfoToApplicationLog wordAppStr, excelAppStr, ppAppStr + + 'Check for template + sMigrationResultsTemplatePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESULTS_TEMPLATE_FILE) + If Not CheckTemplatePath(sMigrationResultsTemplatePath, fso) Then + bSuccess = False + GoTo FinalExit + End If + + 'Check for installed Apps + If Not CheckInstalledApps(wordAppStr, excelAppStr, ppAppStr) Then + bSuccess = False + GoTo FinalExit + End If + + If bDoPrepare Then + 'Show MsgBox ( to give apps some time to quit ) + Dim strMsgBox As String + Dim response As Integer + + strMsgBox = ReplaceTopic2Tokens(GetResString(RID_STR_ENG_OTHER_PREPARE_PROMPT_PREP_ID), _ + TOPIC_STR, getOutputDir & "\" & txtResultsName.Text, TOPIC2_STR, getOutputDir) + strMsgBox = ReplaceTopicTokens(strMsgBox, CR_STR, Chr(13)) + response = MsgBox(strMsgBox, Buttons:=vbOKCancel + vbInformation) + + If response <> vbOK Then + bSuccess = False + GoTo FinalExit + End If + End If + + 'Write Wizard Setting to Application log + WriteWizardSettingsToLog mLogFilePath + + 'Write to Analysis ini file - used by driver docs + WriteCommonParamsToLog sMigrationResultsTemplatePath, mLogFilePath, mIniFilePath, fso + + Screen.MousePointer = vbHourglass + ' Doc Counts are setup by CheckNumberDocsToAnalyze() when user moves to Analysis Panel + ' Takes account of user Options selected and inspects source directory + Dim analysisAborted As Boolean + analysisAborted = False + + SetupInputVariables mLogFilePath, fso + + Load ShowProgress + Call ShowProgress.SP_Init(mDocFiles.WordFiles.count + _ + mDocFiles.ExcelFiles.count + _ + mDocFiles.PowerPointFiles.count) + + Dim myOffset As Long + myOffset = 0 + If (mDocFiles.WordFiles.count > 0) Then + bSuccess = AnalyseList(mDocFiles.WordFiles, "word", mIniFilePath, myOffset, analysisAborted) + 'bSuccess = RunWordAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso) + End If + + myOffset = mDocFiles.WordFiles.count + If ((mDocFiles.ExcelFiles.count > 0) And (Not analysisAborted)) Then + bSuccess = bSuccess And _ + AnalyseList(mDocFiles.ExcelFiles, "excel", mIniFilePath, myOffset, analysisAborted) + 'bSuccess = RunExcelAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso) + End If + + myOffset = myOffset + mDocFiles.ExcelFiles.count + If ((mDocFiles.PowerPointFiles.count > 0) And (Not analysisAborted)) Then + bSuccess = bSuccess And _ + AnalyseList(mDocFiles.PowerPointFiles, "pp", mIniFilePath, myOffset, analysisAborted) + 'bSuccess = RunPPAnalysis(sMigrationResultsTemplatePath, mLogFilePath, fso) + End If + + SetupInputVariables mLogFilePath, fso + + tend = GetTickCount() + WriteToLog CELAPSED_TIME, (FormatNumber((tend - tstart) / 1000, 0) & " seconds: ") & _ + (FormatNumber((tend - tstart), 0) & " miliseconds") + +FinalExit: + Unload ShowProgress + Screen.MousePointer = vbDefault + WriteToLog CSTART_TIME, CDate(startDate) + WriteToLog CEND_TIME, Now + Set fso = Nothing + + RunAnalysis = bSuccess + Exit Function + +HandleErrors: + bSuccess = False + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function CheckInstalledApps(wordAppStr As String, excelAppStr As String, ppAppStr As String) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + Dim str As String + currentFunctionName = "CheckInstalledApps" + + Dim missingInstalledApps As String + Dim unsupportedApps As String + Dim runningApps As String + Dim bSuccess As Boolean + + bSuccess = False + + If mWordDocCount > 0 Or mWordTemplateCount > 0 Then + If wordAppStr = "" Then 'Word not installed + missingInstalledApps = CAPPNAME_WORD + ElseIf Not CheckForSupportedApp(CAPPNAME_WORD, CSUPPORTED_VERSION) Then + unsupportedApps = CAPPNAME_WORD + ElseIf IsOfficeAppRunning(CAPPNAME_WORD) Then + runningApps = CAPPNAME_WORD + End If + End If + + If excelAppStr = "" Then + If missingInstalledApps <> "" Then missingInstalledApps = missingInstalledApps & ", " + missingInstalledApps = missingInstalledApps & CAPPNAME_EXCEL + ElseIf Not CheckForSupportedApp(CAPPNAME_EXCEL, CSUPPORTED_VERSION) Then + If unsupportedApps <> "" Then unsupportedApps = unsupportedApps & ", " + unsupportedApps = unsupportedApps & CAPPNAME_EXCEL + ElseIf IsOfficeAppRunning(CAPPNAME_EXCEL) Then + If runningApps <> "" Then runningApps = runningApps & ", " + runningApps = runningApps & CAPPNAME_EXCEL + End If + + If mPPDocCount > 0 Or mPPTemplateCount > 0 Then + If ppAppStr = "" Then 'PP not installed + If missingInstalledApps <> "" Then missingInstalledApps = missingInstalledApps & ", " + missingInstalledApps = missingInstalledApps & CAPPNAME_POWERPOINT + ElseIf Not CheckForSupportedApp(CAPPNAME_POWERPOINT, CSUPPORTED_VERSION) Then + If unsupportedApps <> "" Then unsupportedApps = unsupportedApps & ", " + unsupportedApps = unsupportedApps & CAPPNAME_POWERPOINT + ElseIf IsOfficeAppRunning(CAPPNAME_POWERPOINT) Then + If runningApps <> "" Then runningApps = runningApps & ", " + runningApps = runningApps & CAPPNAME_POWERPOINT + End If + End If + + If missingInstalledApps <> "" Then + str = ReplaceTopic2Tokens(GetResString(ERR_NOT_INSTALLED), _ + TOPIC_STR, missingInstalledApps, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + GoTo FinalExit + End If + + If unsupportedApps <> "" Then + str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _ + TOPIC_STR, unsupportedApps, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + GoTo FinalExit + End If + + If runningApps <> "" Then + str = ReplaceTopic2Tokens(GetResString(ERR_APPLICATION_IN_USE), _ + TOPIC_STR, runningApps, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + GoTo FinalExit + End If + + 'Check for Excel automation server + If CheckForExcel Then + str = ReplaceTopicTokens(GetResString(ERR_EXCEL_OPEN), _ + CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + bSuccess = True + +FinalExit: + CheckInstalledApps = bSuccess + Exit Function + +HandleErrors: + bSuccess = False + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function RunPPAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean +'DV: do we need this? get some error handling ideas here + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "RunPPAnalysis" + Const APP_PP = "PowerPoint" + Dim str As String + Dim bSuccess + bSuccess = False + + If (chkPPDoc.value <> vbChecked) And (chkPPTemplate.value <> vbChecked) Then + RunPPAnalysis = True + Exit Function + End If + + Dim sPPDriverDocPath As String + + sPPDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) + If Not fsObject.FileExists(sPPDriverDocPath) Then + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_PP_DRIVER), _ + TOPIC_STR, sPPDriverDocPath, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + Dim pp As PowerPoint.application + Dim po As Object + Dim aPres As PowerPoint.Presentation + Dim RegValue As Long + Set po = GetObject(sPPDriverDocPath) + Set pp = po.application + + If val(pp.Version) < CSUPPORTED_VERSION Then + str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _ + TOPIC_STR, pp.Version, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + If Not CheckForAccesToPPVBProject(pp, aPres) Then + RegValue = -1 + If Not GiveAccessToMacroProject(APP_PP, pp.Version, RegValue) Then + Dim Style, response + str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _ + TOPIC_STR, CAPPNAME_POWERPOINT, CR_STR, Chr(13)) + WriteDebug str + Style = vbYesNo + vbQuestion + vbDefaultButton1 + + response = MsgBox(str, Style) + If response <> vbYes Then + bSuccess = False + GoTo FinalExit + End If + End If + End If + + Set aPres = pp.Presentations(1) + Dim ppSlideHidden As PowerPoint.Slide + Set ppSlideHidden = aPres.Slides(2) + + 'Setup Input Variables + 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_POWERPOINT + + 'Run PowerPoint Analysis + pp.Run (fsObject.GetFileName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) & "!AnalysisDriver.AnalyseDirectory") + + bSuccess = True + +FinalExit: + 'Cannot seem to close it down from VB + 'Workaround is to close it in macro + ' + 'If Not aPres Is Nothing Then + ' aPres.Saved = msoTrue + 'End If + 'If Not pp Is Nothing Then pp.Quit + + 'Swallow error as we are closing down PP from macro + 'Does not seem to be possible to close it down from VB + On Error Resume Next + If RegValue <> -1 Then + SetDefaultRegValue APP_PP, pp.Version, RegValue + End If + If RegValue = 0 Then + DeleteRegValue APP_PP, pp.Version + End If + + If Not pp Is Nothing Then + pp.Run (fsObject.GetFileName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) & "!ApplicationSpecific.QuitPowerPoint") + End If + + + Set aPres = Nothing + Set pp = Nothing + Set po = Nothing + + RunPPAnalysis = bSuccess + Exit Function + +HandleErrors: + bSuccess = False + Set pp = Nothing + Dim failedDoc As String + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + + failedDoc = GetDebug(CAPPNAME_POWERPOINT, CANALYZING) + If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then + str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _ + TOPIC_STR, CAPPNAME_POWERPOINT, CR_STR, Chr(13)) + Else + str = ReplaceTopic2Tokens(GetResString(ERR_PP_DRIVER_CRASH), _ + TOPIC_STR, failedDoc, CR_STR, Chr(13)) + End If + + WriteDebug str + MsgBox str, vbCritical + + Resume FinalExit +End Function + +Sub SetupInputVariables(logFile As String, fso As FileSystemObject) + Dim bNewResultsFile As Boolean + + bNewResultsFile = CheckCreateNewResultsFile(fso) + + WriteToLog CNEW_RESULTS_FILE, IIf(bNewResultsFile, "True", "False"), mIniFilePath + WriteToLog CNEW_RESULTS_FILE, IIf(bNewResultsFile, "True", "False"), logFile +End Sub + + + +Function RunExcelAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "RunExcelAnalysis" + Const APP_EXCEL = "Excel" + Dim str As String + Dim bSuccess + bSuccess = False + + If (chkExcelDoc.value <> vbChecked) And (chkExcelTemplate.value <> vbChecked) Then + RunExcelAnalysis = True + Exit Function + End If + + Dim xl As Excel.application + Dim aWb As Excel.Workbook + Dim sExcelDriverDocPath As String + Dim RegValue As Long + + sExcelDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE) + If Not fsObject.FileExists(sExcelDriverDocPath) Then + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_EXCEL_DRIVER), _ + TOPIC_STR, sExcelDriverDocPath, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + Set xl = GetExcelInstance + If val(xl.Version) < CSUPPORTED_VERSION Then + str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _ + TOPIC_STR, xl.Version, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + If Not CheckForAccesToExcelVBProject(xl) Then + RegValue = -1 + If Not GiveAccessToMacroProject(APP_EXCEL, xl.Version, RegValue) Then + Dim Style, response + str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _ + TOPIC_STR, CAPPNAME_EXCEL, CR_STR, Chr(13)) + WriteDebug str + Style = vbYesNo + vbQuestion + vbDefaultButton1 + + response = MsgBox(str, Style) + If response <> vbYes Then + bSuccess = False + GoTo FinalExit + End If + End If + End If + + Set aWb = xl.Workbooks.Open(fileName:=sExcelDriverDocPath) + 'Setup Input Variables + 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_EXCEL + + 'Run Excel Analysis + xl.Run ("AnalysisTool.AnalysisDriver.AnalyseDirectory") + + bSuccess = True +FinalExit: + If RegValue <> -1 Then + SetDefaultRegValue APP_EXCEL, xl.Version, RegValue + End If + If RegValue = 0 Then + DeleteRegValue APP_EXCEL, xl.Version + End If + + If Not aWb Is Nothing Then + If xl.Workbooks.count = 1 Then + xl.Visible = False + End If + aWb.Close (False) + End If + Set aWb = Nothing + + If Not xl Is Nothing Then + If xl.Workbooks.count = 0 Then + xl.Quit + End If + End If + + Set xl = Nothing + + RunExcelAnalysis = bSuccess + Exit Function + +HandleErrors: + bSuccess = False + Set aWb = Nothing + Set xl = Nothing + Dim failedDoc As String + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + + failedDoc = GetDebug(CAPPNAME_EXCEL, CANALYZING) + If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then + str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _ + TOPIC_STR, CAPPNAME_EXCEL, CR_STR, Chr(13)) + Else + str = ReplaceTopic2Tokens(GetResString(ERR_EXCEL_DRIVER_CRASH), _ + TOPIC_STR, failedDoc, CR_STR, Chr(13)) + End If + + WriteDebug str + MsgBox str, vbCritical + + On Error Resume Next + Resume FinalExit +End Function + +Sub WriteWizardSettingsToLog(path As String) + '### DO NOT USE Boolean True/ False it is loaclised by the OS - use "True"/ "False" + WriteToLog CINPUT_DIR, getInputDir, path + WriteToLog CINCLUDE_SUBDIRS, IIf(chkIncludeSubdirs.value, "True", "False"), path + WriteToLog COUTPUT_DIR, getOutputDir, path + WriteToLog CRESULTS_FILE, txtResultsName.Text, path + + WriteToLog CTYPE_WORDDOC, IIf(chkWordDoc.value, "True", "False"), path + WriteToLog CTYPE_WORDDOT, IIf(chkWordTemplate.value, "True", "False"), path + WriteToLog CTYPE_EXCELDOC, IIf(chkExcelDoc.value, "True", "False"), path + WriteToLog CTYPE_EXCELDOT, IIf(chkExcelTemplate.value, "True", "False"), path + WriteToLog CTYPE_PPDOC, IIf(chkPPDoc.value, "True", "False"), path + WriteToLog CTYPE_PPDOT, IIf(chkPPTemplate.value, "True", "False"), path + + Dim resultsSetting As String + If rdbResultsPrompt.value Then + resultsSetting = CPROMPT_FILE + ElseIf rdbResultsAppend.value Then + resultsSetting = CAPPEND_FILE + Else + resultsSetting = COVERWRITE_FILE + End If + WriteToLog CRESULTS_EXIST, resultsSetting, path + + WriteToLog CIGNORE_OLD_DOCS, IIf(chkIgnoreOld.value, "True", "False"), path + WriteToLog CISSUE_LIMIT, CStr(mIssueLimit), path + + 'WriteToLog CVERSION, Version, path +End Sub + +Sub WriteCommonParamsToLog(resultsTemplate As String, logFile As String, path As String, fso As Scripting.FileSystemObject) + WriteToLog CLOG_FILE, logFile, path + WriteToLog CRESULTS_TEMPLATE, resultsTemplate, path + WriteToLog CDEBUG_LEVEL, CLng(mDebugLevel), path + WriteToLog CDOPREPARE, IIf(mbDoPrepare, "True", "False"), path + WriteToLog CTITLE, frmWizard.Caption, path + WriteToLog CLAST_CHECKPOINT, "" + WriteToLog CNEXT_FILE, "" + WriteToLog C_ABORT_ANALYSIS, "" +End Sub + +Function GetNumberOfDocsToAnalyze() As Long + Dim count As Long + + count = 0 + + If CheckWordDocsToAnalyze Then + count = mWordDocCount + mWordTemplateCount + End If + If CheckExcelDocsToAnalyze Then + count = count + mExcelDocCount + mExcelTemplateCount + End If + If CheckPPDocsToAnalyze Then + count = count + mPPDocCount + mPPTemplateCount + End If + + GetNumberOfDocsToAnalyze = count +End Function + +Function CheckWordDocsToAnalyze() As Boolean + + CheckWordDocsToAnalyze = mbDocCountCurrent And (chkWordDoc.value = vbChecked And mWordDocCount > 0) Or _ + (chkWordTemplate.value = vbChecked And mWordTemplateCount > 0) +End Function + +Function CheckExcelDocsToAnalyze() As Boolean + CheckExcelDocsToAnalyze = mbDocCountCurrent And (chkExcelDoc.value = vbChecked And mExcelDocCount > 0) Or _ + (chkExcelTemplate.value = vbChecked And mExcelTemplateCount > 0) +End Function + +Function CheckPPDocsToAnalyze() As Boolean + CheckPPDocsToAnalyze = mbDocCountCurrent And (chkPPDoc.value = vbChecked And mPPDocCount > 0) Or _ + (chkPPTemplate.value = vbChecked And mPPTemplateCount > 0) +End Function + +Function CheckNumberDocsToAnalyze() As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckNumberDocsToAnalyze" + + Set mDocFiles = New CollectedFiles + + Dim docSearchTypes As Collection + Set docSearchTypes = New Collection + + mbDocCountCurrent = False + + SetupDocSearchTypes docSearchTypes + + If (cbIgnoreOld.ListIndex = 0) Then + mIssueLimit = 3 + ElseIf (cbIgnoreOld.ListIndex = 1) Then + mIssueLimit = 6 + Else + mIssueLimit = 12 + End If + + If Not mDocFiles.Search(rootDir:=getInputDir, FileSpecs:=docSearchTypes, _ + IncludeSubdirs:=IIf(chkIncludeSubdirs.value, mbTrue, mbFalse), _ + ignoreOld:=IIf(chkIgnoreOld.value, mbTrue, mbFalse), Months:=mIssueLimit) Then + CheckNumberDocsToAnalyze = False + GoTo FinalExit + End If + + SetDocCountsFromFileSearch mDocFiles + WriteFileDateCountsToLog mDocFiles + + 'WriteDocsToAnalyzeToLog mDocFiles 'UNCOMMENT Recovery - want to list out files to analyze + + mbDocCountCurrent = True + + lblNumDocs.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_ID), TOPIC_STR, _ + CStr(mWordDocCount)) + lblNumTemplates.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _ + CStr(mWordTemplateCount)) + + lblNumXLS.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_XLS_ID), TOPIC_STR, _ + CStr(mExcelDocCount)) + lblNumXLT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _ + CStr(mExcelTemplateCount)) + + lblNumPPT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_DOCUMENTS_PPT_ID), TOPIC_STR, _ + CStr(mPPDocCount)) + lblNumPOT.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TEMPLATES_ID), TOPIC_STR, _ + CStr(mPPTemplateCount)) + + lblTotalNumDocs.Caption = ReplaceTopicTokens(GetResString(ANALYZE_TOTAL_NUM_DOCS_ID), TOPIC_STR, _ + CStr(mTotalDocCount)) + + If (mIgnoredDocCount > 0) Then + lblSkippedOld.Caption = ReplaceTopicTokens(GetResString(RID_STR_ENG_ANALYZE_IGNORED_DOCS_ID), _ + TOPIC_STR, CStr(mIgnoredDocCount)) + lblSkippedOld.Visible = True + Else + lblSkippedOld.Visible = False + End If + + CheckNumberDocsToAnalyze = True + +FinalExit: + Set docSearchTypes = Nothing + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Sub SetDocCountsFromFileSearch(myDocFiles As CollectedFiles) + 'No Error handling required + mWordDocCount = myDocFiles.DocCount + mWordTemplateCount = myDocFiles.DotCount + mExcelDocCount = myDocFiles.XlsCount + mExcelTemplateCount = myDocFiles.XltCount + mPPDocCount = myDocFiles.PptCount + mPPTemplateCount = myDocFiles.PotCount + mTotalDocCount = mWordDocCount + mWordTemplateCount + mExcelDocCount + mExcelTemplateCount + _ + mPPDocCount + mPPTemplateCount + mIgnoredDocCount = myDocFiles.IgnoredDocCount +End Sub + +Sub SetupDocSearchTypes(docSearchTypes As Collection) + 'No Error handling required + If chkWordDoc.value Then docSearchTypes.add ("*.doc") + If chkWordTemplate.value Then docSearchTypes.add ("*.dot") + If chkExcelDoc.value Then docSearchTypes.add ("*.xls") + If chkExcelTemplate.value Then docSearchTypes.add ("*.xlt") + If chkPPDoc.value Then docSearchTypes.add ("*.ppt") + If chkPPTemplate.value Then docSearchTypes.add ("*.pot") +End Sub + +Sub WriteDocsToAnalyzeToLog(myDocFiles As CollectedFiles) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteDocsToAnalyzeToLog" + + Dim vFileName As Variant + Dim Index As Long + Dim limit As Long + limit = myDocFiles.WordFiles.count + For Index = 1 To limit + vFileName = myDocFiles.WordFiles(Index) + WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_WORD) + Next + limit = myDocFiles.ExcelFiles.count + For Index = 1 To limit + vFileName = myDocFiles.ExcelFiles(Index) + WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_EXCEL) + Next + limit = myDocFiles.PowerPointFiles.count + For Index = 1 To limit + vFileName = myDocFiles.PowerPointFiles(Index) + WriteToLog "Doc" & Index, CStr(vFileName), section:=(WIZARD_NAME & "ListFor" & CAPPNAME_POWERPOINT) + Next + +FinalExit: + Exit Sub +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Sub WriteFileDateCountsToLog(myDocFiles As CollectedFiles) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "WriteFileDateCountsToLog" + + WriteToLog C_DOCS_LESS_3_MONTH, CStr(myDocFiles.DocsLessThan3Months), mIniFilePath + WriteToLog C_DOCS_LESS_6_MONTH, CStr(myDocFiles.DocsLessThan6Months), mIniFilePath + WriteToLog C_DOCS_LESS_12_MONTH, CStr(myDocFiles.DocsLessThan12Months), mIniFilePath + WriteToLog C_DOCS_MORE_12_MONTH, CStr(myDocFiles.DocsMoreThan12Months), mIniFilePath + +FinalExit: + Exit Sub +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + + +Function RunWordAnalysis(resultsTemplate As String, logFile As String, fsObject As FileSystemObject) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "RunWordAnalysis" + Const APP_WORD = "Word" + Dim str As String + Dim bSuccess + bSuccess = False + + Dim wrd As Word.application + Dim aDoc As Word.Document + Dim sWordDriverDocPath As String + Dim RegValue As Long + + If (chkWordDoc.value <> vbChecked) And (chkWordTemplate.value <> vbChecked) Then + 'No Word doc filters selected + RunWordAnalysis = True + Exit Function + End If + + sWordDriverDocPath = fsObject.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE) + If Not fsObject.FileExists(sWordDriverDocPath) Then + str = ReplaceTopic2Tokens(GetResString(ERR_MISSING_WORD_DRIVER), _ + TOPIC_STR, sWordDriverDocPath, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + Set wrd = New Word.application + If val(wrd.Version) < CSUPPORTED_VERSION Then + str = ReplaceTopic2Tokens(GetResString(ERR_SUPPORTED_VERSION), _ + TOPIC_STR, wrd.Version, CR_STR, Chr(13)) + WriteDebug str + MsgBox str, vbCritical + bSuccess = False + GoTo FinalExit + End If + + If Not CheckForAccesToWordVBProject(wrd) Then + RegValue = -1 + If Not GiveAccessToMacroProject(APP_WORD, wrd.Version, RegValue) Then + Dim Style, response + str = ReplaceTopic2Tokens(GetResString(ERR_NO_ACCESS_TO_VBPROJECT), _ + TOPIC_STR, CAPPNAME_WORD, CR_STR, Chr(13)) + WriteDebug str + Style = vbYesNo + vbQuestion + vbDefaultButton1 + + response = MsgBox(str, Style) + If response <> vbYes Then + bSuccess = False + GoTo FinalExit + End If + End If + End If + + Set aDoc = wrd.Documents.Open(fileName:=sWordDriverDocPath) + 'Clear out any doc vars + Dim MyObj As Variable + For Each MyObj In aDoc.Variables + MyObj.Delete + Next + + 'Setup Input Variables + 'SetupInputVariables resultsTemplate, logFile, fsObject, CAPPNAME_WORD + + wrd.Run ("AnalysisTool.AnalysisDriver.AnalyseDirectory") + + wrd.Visible = False + bSuccess = True + +FinalExit: + If RegValue <> -1 Then + SetDefaultRegValue APP_WORD, wrd.Version, RegValue + End If + If RegValue = 0 Then + DeleteRegValue APP_WORD, wrd.Version + End If + If Not aDoc Is Nothing Then aDoc.Close (False) + Set aDoc = Nothing + + If Not wrd Is Nothing Then wrd.Quit (False) + Set wrd = Nothing + + RunWordAnalysis = bSuccess + Exit Function + +HandleErrors: + On Error Resume Next + + bSuccess = False + Set aDoc = Nothing + Set wrd = Nothing + + Dim failedDoc As String + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + + failedDoc = GetDebug(CAPPNAME_WORD, CANALYZING) + If failedDoc = "" Or failedDoc = CSTR_ANALYSIS_LOG_DONE Then + str = ReplaceTopic2Tokens(GetResString(ERR_AUTOMATION_FAILURE), _ + TOPIC_STR, CAPPNAME_WORD, CR_STR, Chr(13)) + Else + str = ReplaceTopic2Tokens(GetResString(ERR_WORD_DRIVER_CRASH), _ + TOPIC_STR, failedDoc, CR_STR, Chr(13)) + End If + + WriteDebug str + MsgBox str, vbCritical + + Resume FinalExit +End Function + +Function stripLastBackslash(inputStr As String) As String + Const MIN_DIR_SIZE = 3 + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "stripLastBackslash" + + If Len(inputStr) > MIN_DIR_SIZE Then + Dim lastStrChar As String + lastStrChar = Right(inputStr, 1) + If lastStrChar = "\" Then + inputStr = Left(inputStr, Len(inputStr) - 1) + End If + End If + stripLastBackslash = inputStr + + Exit Function + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + stripLastBackslash = inputStr +End Function + +Function getInputDir() As String + getInputDir = stripLastBackslash(txtInputDir.Text) +End Function + +Function getOutputDir() As String + Dim tmpStr As String + + tmpStr = stripLastBackslash(txtOutputDir.Text) + + 'Bug when specifying C:\ + If tmpStr <> "" Then + If Right(tmpStr, 1) = "\" Then + tmpStr = Left(tmpStr, Len(tmpStr) - 1) + End If + End If + getOutputDir = tmpStr +End Function + +Function CheckCreateNewResultsFile(fsObject As FileSystemObject) As Boolean + If Not fsObject.FileExists(getOutputDir & "\" & txtResultsName.Text) Then + 'No Results File - Create it + CheckCreateNewResultsFile = True + ElseIf rdbResultsAppend.value Then + 'Results File exists and user wants to append to it + CheckCreateNewResultsFile = False + Else + 'Results File exists and user has elected not to append + CheckCreateNewResultsFile = True + End If +End Function + +Sub DeleteFile(file As String) + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "DeleteFile" + Dim fso As Scripting.FileSystemObject + Set fso = New Scripting.FileSystemObject + Dim filePath As String + + filePath = fso.GetAbsolutePathName(file) + If fso.FileExists(filePath) Then + fso.DeleteFile filePath, True + End If + +FinalExit: + Set fso = Nothing + Exit Sub + +HandleErrors: + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Sub + +Public Property Get Version() As String + Version = app.Major & "." & app.Minor & "." & app.Revision +End Property + +Function GetExcelInstance() As Excel.application + Dim xl As Excel.application + On Error Resume Next + 'Try and get an existing instance + Set xl = GetObject(, "Excel.Application") + If Err.Number = 429 Then + Set xl = CreateObject("Excel.Application") + ElseIf Err.Number <> 0 Then + Set xl = Nothing + MsgBox "Error: " & Err.Description + Exit Function + End If + Set GetExcelInstance = xl + Set xl = Nothing +End Function + +Function CheckForAnalysisResultsWorkbook(analysisResultsName As String) As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckForAnalysisResultsWorkbook" + + CheckForAnalysisResultsWorkbook = False + + Dim xl As Excel.application + Set xl = GetExcelInstance + + Dim aWb As Excel.Workbook + For Each aWb In xl.Workbooks + + If aWb.Name = analysisResultsName Then + CheckForAnalysisResultsWorkbook = True + Exit For + End If + Next aWb + +FinalExit: + If Not xl Is Nothing Then + If xl.Workbooks.count = 0 Then + xl.Quit + End If + End If + + Set xl = Nothing + + Exit Function + +HandleErrors: + Set xl = Nothing + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Function CheckForExcel() As Boolean + On Error GoTo HandleErrors + Dim currentFunctionName As String + currentFunctionName = "CheckForExcel" + + CheckForExcel = False + + Dim xl As Excel.application + Set xl = GetExcelInstance + + + If xl.Workbooks.count > 0 Then + CheckForExcel = True + End If + +FinalExit: + If Not xl Is Nothing Then + If xl.Workbooks.count = 0 Then + xl.Quit + End If + End If + + Set xl = Nothing + + Exit Function + +HandleErrors: + Set xl = Nothing + + WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source + Resume FinalExit +End Function + +Public Function GetIniSetting(key As String) As String + + If mIniFilePath = "" Or key = "" Then Exit Function + + GetIniSetting = ProfileGetItem(WIZARD_NAME, key, "", mIniFilePath) +End Function + +Sub WriteIniSetting(key As String, value As String) + + If mIniFilePath = "" Or key = "" Then Exit Sub + + Call WritePrivateProfileString(WIZARD_NAME, key, value, mIniFilePath) +End Sub + +Private Sub lblSetupComplete_Click(Index As Integer) + +End Sub + +Private Function CheckNeededFiles(missingFile As String) As Boolean + + Dim fso As New FileSystemObject + Dim filePath As String + + CheckNeededFiles = False + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CWORD_DRIVER_FILE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CEXCEL_DRIVER_FILE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CPP_DRIVER_FILE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CLAUNCH_DRIVERS_EXE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CMSO_KILL_EXE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESULTS_TEMPLATE_FILE) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + filePath = fso.GetAbsolutePathName(CBASE_RESOURCE_DIR & "\" & CRESOURCE_DLL) + If Not fso.FileExists(filePath) Then + missingFile = filePath + Exit Function + End If + + CheckNeededFiles = True +End Function |