MEET FEATURE REQUIREMENTS, SCHEDULE, and BUDGET! Consulting available to teach your organization to apply this methodology and tools for powerful quantitative management of your business processes.
- Instruction of your staff at your site, using courseware, application example, and a functional template.
- Mentoring your key staff on an ongoing or periodic basis, on these tools or on Quantitative Program Management.
- Contracting or Employment in your organization on specific topics.
Check out my YouTube Channel: Power Operational Intelligence
Now Live! Overview, Structure, Task Data, Table Design, SQL Server, and Re-Linking now showing.
Video courses covering material on this website, and more, are presented in the playlists.
Code snippet links at YouTube Code Snippets. Twitter at @poweroperation1, #poweropi, #poweroperationalintelligence.
Subscribe on YouTube, and click the "Notification" Bell icon to be notified as content is published.
Linking Excel to a SQL DatabaseThe following VB code links data connections to a database for SQL access. To use the code, copy from this text file.
References
Public Sub updateConnections()
'Copyright (c) 2012 Richard M. Bixler, All Rights Reserved. Do not delete this copyright notice.
'Updates connections, to definitions defined in table on DataSources tab.
Dim connectionSheet As Worksheet
Dim tblConnectionConfig As ListObject
Dim thisListRow As ListRow
Dim thisConnection As WorkbookConnection
Dim strConnectionName As String, strAltPath As String, _
strPriPath As String, strTableName As String, strLinkType As String
Dim thisConnectionRowFound As Boolean
Dim thisCell As Range
Dim nameIndex As Integer, altPathIndex As Integer, _
priPathIndex As Integer, tableNameIndex As Integer, _
linkTypeIndex As Integer
Dim thisListObject As ListObject
Dim thisListObjectObject As Variant, thisSheetObject As Variant, objectRow As Variant
Dim thisSheet As Worksheet
Dim thisQuery As QueryTable
Dim thisConnectionString As String, dataSourceStringExisting As String, _
strPathSymbol As String, strThisWorkbookPath As String, strTargetFileName As String
Dim leftDelim As String, oldPath As String, dataSourceStringNew As String, _
dataSourceFileName As String
Dim dbSourceFile As String, dbTableSheet As String, sDatabase As String, _
dbTable As String, sSQL As String
Dim leftChar As Long, rightChar As Long, rightChar2 As Long
Dim thisRow As Range
Dim fsFileSystem As New FileSystemObject
Dim thisPivotObject As Variant
Dim thisPivot As PivotTable
Dim thisPivotCache As PivotCache
Dim thisWorkbook As Workbook
leftDelim = ";Data Source="
Set thisWorkbook = module1.myworkbook
Set myWorkbook = thisWorkbook
strThisWorkbookPath = thisWorkbook.Path
Set connectionSheet = thisWorkbook.Worksheets("DataSources")
Set tblConnectionConfig = connectionSheet.ListObjects("tblConnectionConfig")
'Get table column names
nameIndex = 0
priPathIndex = 0
altPathIndex = 0
tableNameIndex = 0
linkTypeIndex = 0
For Each thisCell In tblConnectionConfig.HeaderRowRange
Select Case thisCell.Value2
Case "Connection Name"
nameIndex = thisCell.Column
Case "Alternate Path"
altPathIndex = thisCell.Column
Case "Primary Path"
priPathIndex = thisCell.Column
Case "Table Name"
tableNameIndex = thisCell.Column
Case "LinkType"
linkTypeIndex = thisCell.Column
End Select
Next thisCell
For Each thisConnection In thisWorkbook.Connections
'Find listRow for this connection
thisConnectionRowFound = False
For Each thisListRow In tblConnectionConfig.ListRows
strConnectionName = ""
strAltPath = ""
strPriPath = ""
strTableName = ""
strLinkType = ""
If nameIndex > 0 Then strConnectionName = thisListRow.Range.Cells(1, nameIndex)
If altPathIndex > 0 Then strAltPath = thisListRow.Range.Cells(1, altPathIndex)
If priPathIndex > 0 Then strPriPath = thisListRow.Range.Cells(1, priPathIndex)
If tableNameIndex > 0 Then strTableName = thisListRow.Range.Cells(1, tableNameIndex)
If linkTypeIndex > 0 Then strLinkType = thisListRow.Range.Cells(1, linkTypeIndex)
If (strLinkType = "TableSource" Or strLinkType = "PivotSource") And _
strConnectionName = thisConnection.Name Then
thisConnectionRowFound = True
Application.StatusBar = "Linking " & strConnectionName
'Perform the link update
'First convert relative path to absolute
'Primary path first
sDatabase = strEvalPath(strPriPath, thisWorkbook)
If sDatabase = "" Then sDatabase = strEvalPath(strAltPath, thisWorkbook)
If sDatabase <> "" And fsFileSystem.FileExists(filespec:=sDatabase) Then
'At this point, sDatabase contains correct NEW path. Fix connection path here
'Get the existing connection string, and extract the datasource file and path
thisConnectionString = thisConnection.OLEDBConnection.Connection
leftChar = InStr(1, thisConnectionString, leftDelim, vbTextCompare) + _
Len(leftDelim)
rightChar = InStr(leftChar, thisConnectionString, ";", vbTextCompare)
dataSourceStringExisting = Mid(thisConnectionString, leftChar, rightChar - _
leftChar)
'From the existing datasource file path, separate into path and file name
rightChar2 = InStrRev(dataSourceStringExisting, "\", -1, vbTextCompare)
oldPath = Left(dataSourceStringExisting, rightChar2)
dataSourceFileName = Right(dataSourceStringExisting, _
Len(dataSourceStringExisting) - rightChar2)
'Put the new path with the datasource file name,
'and update the connection string
dataSourceStringNew = sDatabase
thisConnectionString = Replace(thisConnectionString, _
dataSourceStringExisting, dataSourceStringNew, 1, -1, vbTextCompare)
sSQL = "SELECT * FROM " & strTableName
'Update the query object with the new source file info, and refresh
thisConnection.OLEDBConnection.Connection = thisConnectionString
thisConnection.OLEDBConnection.SourceConnectionFile = dataSourceStringNew
thisConnection.OLEDBConnection.CommandType = xlCmdSql
thisConnection.OLEDBConnection.CommandText = sSQL
Else 'file does not exist
MsgBox prompt:="File does not exist: " & sDatabase, Buttons:=vbOKOnly, _
Title:="Missing File"
Application.StatusBar = ""
Exit Sub
End If 'fsFileSystem.FileExists
End If
If thisConnectionRowFound Then Exit For
Next thisListRow
Next thisConnection
thisWorkbook.RefreshAll
Application.StatusBar = ""
End Sub
Public Function strEvalPath(ByVal strPathName As String, ByVal thisWorkbook As Workbook) _
As String
'Copyright (c) 2012 Richard M. Bixler, All Rights Reserved. Do not delete this copyright notice.
Dim strPathSymbol As String, strTargetFileName As String, strThisWorkbookPath As String
strTargetFileName = ""
strEvalPath = ""
strThisWorkbookPath = thisWorkbook.Path
If strPathName <> "" Then
If Left(strPathName, 2) = ".\" Then
strPathSymbol = ".\"
strTargetFileName = Right(strPathName, Len(strPathName) - 2)
ElseIf Left(strPathName, 2) = "\\" Then
strPathSymbol = "\\"
ElseIf Left(strPathName, 3) = "..\" Then
strPathSymbol = "..\"
strTargetFileName = Right(strPathName, Len(strPathName) - 3)
Else
strPathSymbol = ""
strTargetFileName = strPathName
End If
Select Case strPathSymbol
Case "", ".\"
strEvalPath = strThisWorkbookPath & "\" & strTargetFileName
Case Else
strEvalPath = myFileSystemObject.GetAbsolutePathName(strPathName)
End Select
If strEvalPath = "" Or Not myFileSystemObject.FileExists(strEvalPath) Then strEvalPath = ""
End If 'strPathName is not null
End Function
Updating an Excel Pivot Table when its tab is selectedThe following VB code updates Excel pivot tables on a tab when the tab is selected. To use the code, copy from this text file.
References
'This code should be replicated in each worksheet containing pivot tables
Private Sub Worksheet_Activate()
Dim thisWorksheet As Worksheet
Dim thisPivot As PivotTable
Set thisWorksheet = ActiveSheet
For Each thisPivot In thisWorksheet.PivotTables
thisPivot.RefreshTable
Next thisPivot
End Sub
Linking an Excel Structured Table as Input into Microsoft AccessThis code maps a named range, accessible to link as input to MSAccess, to cover the same area as an Excel structured table. The range is created if it doesn't exist, and is updated as changes are made to the table content or dimensions. To use the code, copy from this text file. In each MSExcel tab containing a Structured Table to be made available for linking into MSAccess:
'This code should be replicated in each worksheet containing a Structured Table
' to be made available for linking into MSAccess
Private Sub Worksheet_SelectionChange(ByVal Target as Range)
Module1.TableUpdate Target:=Target
End Sub
In an Excel VBA code module named "Module1":
Public Sub TableUpdate(ByVal Target As Range)
'Copyright (c) 2015 Richard M. Bixler, All Rights Reserved. Do not delete this copyright notice.
'Keeps a range object in sync with table definition. Range object is updated each time the table
' is changed/selected.
Dim tblTarget As ListObject, thisListObject As ListObject
Dim cellChanged As Range, rngTarget As Range
Dim strTableName As String, strRangeName As String, strTblRangePrefix As String
If Target Is Nothing Then Exit Sub
Set cellChanged = Target
strTblRangePrefix = Worksheets("DataSources").Range("RangePrefix").Cells(1, 1).Value2
For Each thisListObject In cellChanged.Worksheet.ListObjects
If Not Intersect(cellChanged, thisListObject.Range) Is Nothing Then
Set tblTarget = thisListObject
strTableName = tblTarget.Name
strRangeName = strTableName
If Left(strRangeName, 3) = "tbl" Then strRangeName = Right(strRangeName, _
Len(strRangeName) - 3)
strRangeName = strTblRangePrefix & strRangeName
Set rngTarget = tblTarget.Range
rngTarget.Name = strRangeName
Exit For
End If
Next thisListObject
End Sub
|
