Executing SQL in Excel Tool/Template

Amazing Method for Executing SQL Queries in Excel Using VBA (Import Data) – No Need to Use Multiple Applications!

I have found several use cases for my team and I to save time and utilize Excel alone for pulling data via SQL, as opposed to running queries in Access, SSRS, SSMS or Toad and then exporting that data into Excel for manipulation and analysis. There is not only the benefit of saving time by skipping the export/import process, but also in the ability to build templates/files and save them for quick and easy future SQL pulls. The days of needing multiple applications for your SQL pulls to import into Excel are over!

The best use cases I’ve found that support this method are repeatable processes where the same input variables are required each time, and where the query results will not exceed the row limitations of an Excel sheet (~1M). Even in this case, you may find the first two sections of this post useful for learning about constructing and executing SQL queries for use outside of Excel. This alone will likely save you time if you are in the habit of writing long and involved queries with changing criteria.

If you are exceeding the Excel row limit but still want to work in Excel, using Power Pivot can handle this, so you may wish to utilize Power Query instead. Definitely check out my post on utilizing parameters with Power Query here for more information on how to import the data this way.

I have also found this approach to be useful when pulling data from different sources using the same criteria. It saves me lots of time.

In this example, we will construct and then run a simple SQL query using a few parameters/variables that we enter into the spreadsheet.

Follow along so you can see how it works in practice, and then I encourage you to try it out with your own data. Once you master this method, hopefully you will find amazing ways to apply it to your own work!

A copy of the file described in this post is available for purchase – just reach out to me for information. A more complex version that handles wildcards is also for sale.


Setting Up the Variables/Criteria/Parameters for Executing SQL Queries in Excel

My goal will be to run this query: Select * from Store where CreatedDate > #3/1/2022# and State = ‘GA’

  • The two variables in this example will be the created date (3/1/2022) and the State (GA).
  • At the top of my first sheet, we will designate named ranges for the two inputs.
  • Simply type in Created Date in cell A1 to identify the input, then in cell B1, type in 3/1/22.
  • Make B1 a named range – we will call this CreatedDate.
  • Similarly, in A2, type in State, and then in B2, type in GA. Ultimately, you can add in data validation and use lists, but let’s keep it very simple for now.
  • Make cell B2 a named range called State.
    • If you are not familiar with named ranges, the easiest way to make one is to select the cell or cells and then type the name into the dropdown box at the top left next to the formula bar, where the cell address is displayed. Alternately, you can press CTRL+F3 to bring up the Named Ranges dialog box.
SQL Execution in Excel VBA - setting up the inputs for the variables using Named Ranges
Executing SQL Queries in Excel – Setting up Inputs for Variables Using Named Ranges

Constructing the SQL Statement

From here, we can either construct the SQL statement in an Excel sheet or in VBA. I have found that it is far easier to construct in an Excel sheet, especially for complex statements with many criteria. This way certainly allows for more flexibility and better troubleshooting in my opinion. Also, it’s easier to manage from a support standpoint.

  • I will add a new sheet/tab to house the SQL Statement. I will start by typing in the full statement I expect in to A1, just to use as a reference as I build out the statement in the cells below.
  • I then break the statement out line by line, using column A for the variables, and column B for the statements and column C for the joining of statements with variables.
  • Finally, I use the TEXTJOIN function in cell A4 to join together all of the rows in the combined section. I used a space as the delimiter (” “). This ensures proper spacing throughout the resulting SQL statement.
  • I then make cell A4 a named range called SQLStatement.
  • See image below to see how I have achieved all of this.
    • I have included some helper/formula notes on how to format the variables, since the SQL statement has to be properly formatted in order to work.
Executing SQL Queries in Excel variable setup
Construction of SQL Queries in Excel

VBA Code for Executing SQL Statement and Importing the Data

  • Open the VBA editor (Alt + F11).
  • Add a new module.
  • Add a new subroutine. I’ve called mine SQLPull.
  • Very important step – enable the required references. Go to the Tools menu and select References. Select the ActiveX Data Objects 2.8 Library and Recordset 6.0 Library – see the last two checked in the image below (yours may be different versions). Click OK to save.
VBA Project References – ActiveX Data Objects/Recordset

Here is an overview the VBA code I wrote, that is pasted below.

  • Note that it will connect to the database you identify after you update the connection string if needed.
  • It will then execute the SQL select statement and grab the recordset.
  • The code will then write the headers from the query into the cells identified.
  • Next, it will paste the rows that are returned by the SQL query, starting in the specified cell.
  • Finally it will close the connection and end the subroutine.
  • For my applications of this, I like to switch to manual calculation and turn off screen updating because I have found it improves the speed of loading the data. You may choose to leave these alone if working with less data.

I have added commentary and explanations throughout to hopefully help you to modify as needed to support your own needs.

Sub SQLPull()

‘* www.bonbonsguide.com *
‘Importing Data into Excel using a SQL select statement in a cell

Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset
Dim DBPath, sconnect, sqlstring As String
Dim icols As Long

””””””””””””””””””””””””’
‘Database Name/Path
””””””””””””””””””””””””’
DBPath = STOREDB

‘NOTE:
‘If you are querying a SQL Server or Oracle DB, use the name of the database:
‘DBPath = YourDatabaseName

‘If you are querying an Access Database, use the path to the file in quotes:
‘DBPath = “\myfileserver\Bonbon\MyAccessDB.accdb” OR “F:\Bonbon\MyAccessDB.accdb”

””””””””””””””””””””””””’
‘Connection String
””””””””””””””””””””””””’
‘The DSN is the existing ODBC connection on your PC – this must be set up first!

‘Uncomment the applicable sconnect string for your database and modify as needed. For MS Access, no modifications should be needed.

‘SQL Server using Windows Authentication:
sconnect = “Provider=MSDASQL.1;DSN=STOREDB;DBQ=” & DBPath & “;HDR=Yes’;”

‘ORACLE Connection using an UID/PWD:
‘sconnect = “Provider=MSDASQL.1;DSN=WAREHOUSE;uid=bonbonsguide;pwd=helpsus;DBQ=” & DBPath & “;HDR=Yes’;”

‘MS Access:
‘sconnect = “Provider = Microsoft.ACE.OLEDB.12.0; data source=” & DBPath & “;”

””””””””””””””””””””””””””””””””””””””””””””””””””””’
‘Set Timeouts (These may not be required in your environment)
””””””””””””””””””””””””””””””””””””””””””””””””””””’
Conn.ConnectionTimeout = 200
Conn.CommandTimeout = 200

””””””””””””””””””””””””’
‘Connect to datasource
””””””””””””””””””””””””’
Conn.Open sconnect

””””””””””””””””””””””””’””””””””””””””””””””””””’
‘VBA get SQL Statement from Sheet/Named Range
””””””””””””””””””””””””’””””””””””””””””””””””””’
sqlstring = Range(“SQLstatement”)

””””””””””””””””””””””””””””””””””
‘Get the recordset – this command will execute the SQL Statement’
””””””””””””””””””””””””””””””””””
mrs.Open sqlstring, Conn

””””””””””””””””””””””””””””””””””
‘Return the Header Names
‘”””””””””””””””””””””””””””””””””’
‘If you don’t need the headers or are using your own, comment the block out

‘Where Headers will be pasted:
‘Sheet1 = Sheet identifier – use Sheets(“name of sheet”) to use sheet name instead
‘Cells (4 – indicates row 4, + 3 indicates to start in column C) … Edit this as needed

For icols = 0 To mrs.Fields.Count – 1
Sheet1.Cells(4, icols + 3).Value = mrs.Fields(icols).Name
Next

””””””””””””””””””””””””””””””””””
‘OPTIONAL – SPEED UP IMPORT
””””””””””””””””””””””””””””””””””
‘If retrieving lots of records, it may speed it up if you set calculation to manual during the import process.
‘Setting the screen updating to false may also speed up the import. Comment these out if preferred.
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

””””””””””””””””””””””””’””””””””””””””””””””””””’””””””””””””””””””””””””’
‘OPTIONAL – CLEAR DATA IN ROWS BEFORE PASTING RECORDSET OR DO OTHER PREP
””””””””””””””””””””””””’””””””””””””””””””””””””’””””””””””””””””””””””””’
‘Add your code here.

””””””””””””””””””””””””””””””””””
‘Paste the Rows/Records
‘”””””””””””””””””””””””””””””””””’

‘Importing rows returned – the range below will be where the data starts – line this up with the headers, one row below.
Sheet1.Range(“C5”).CopyFromRecordset mrs

””””””””””””””””””””””””””””””””””
‘Close the Recordset
””””””””””””””””””””””””””””””””””
mrs.Close

””””””””””””””””””””””””””””””””””
‘Close Connection
””””””””””””””””””””””””””””””””””
Conn.Close

”””””””””””””””””””””””””””””””””””””””””””’
‘Turn automatic calculation and screen updating back on.
”””””””””””””””””””””””””””””””””””””””””””’
Application.Calculation = xlCalculationAutomatic
Application.Calculate
Application.ScreenUpdating = True

End Sub

Wrapping Up

I hope this post about executing SQL queries in Excel helped you out. Below is the final look of my file for this example. I have added a button for the users to click in order to run the VBA code and execute the SQL by assigning the macro. I have formatted so the data returns in a table for easy manipulation and analysis. I have also updated the general formatting and named the sheets.

To save you time, a copy of the file is available for purchase – just reach out to me for information.

I also have another sample template file available that allows you to put multiple criteria in a list and constructs the query accordingly, searching all items. It even allows for the use of wildcards by automatically formulating LIKE statements! Exciting stuff! Contact me if interested in purchasing.

Tool for Execution of SQL Queries in Excel (For Sale)
Tool for Execution of SQL Queries in Excel (For Sale)

tags: executing SQL queries in Excel, SQL in Excel

Do You Need Personalized Help and Custom Solutions?

If you get stuck or you would like to explore solutions and automation possibilities, please can reach out to me for help as I do offer consulting services as time allows.  I have over 20+ years’ of expert level experience delivering excellent, custom, strategic solutions in Excel, BI, Access, SharePoint and more. 

I have been called a guru and hero more times than I can count, as I am a great listener and truly have a knack for asking the right questions to understand unique business challenges. I am very passionate about crafting tools and processes that work for users of all levels and experience. 

Reach out today and let’s discuss how I can help you and your business!

I also offer one-on-one tutoring for customized learning and upskilling. Visit my consulting page and send a message if you are interested.

Other Resources

Also, consider checking out some great resources on Amazon Disclosure: this is an affiliate link, so I may earn a small commission if you decide to make a purchase which will help cover the cost of hosting this website. 

Please bookmark and subscribe!  I am actively working on adding new, relevant content to help others out! Thanks so much!

Subscribe via Email and Stay Up to Date!

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

If I helped you, please consider leaving a tip via PayPal to support the blog! Thanks!!

Thanks so much for supporting my blog and for helping others too!

Hosting Your Own AI/Local LLM On Your PC (For Free)!

Hosting your own AI local LLM (Large Language Model) can offer several benefits, especially for individuals and organizations looking to leverage advanced AI capabilities while maintaining control and security. Here are some key advantages:

Control and Customization:

  • Tailored Solutions: Customize the model to fit specific business needs, industries, or datasets.
  • Data Privacy: Ensure that sensitive data remains within your control and is not shared with external providers.

Security:

  • Data Security: Protect sensitive information by hosting the model on-premises or in a secure cloud environment under your control.
  • Compliance: Meet regulatory and compliance requirements by having full control over data handling and model deployment.

Latency and Performance:

  • Reduced Latency: Host the model closer to where it is needed, reducing latency and improving response times.
  • Optimized Performance: Fine-tune the model and infrastructure for optimal performance tailored to your specific use case.

Cost Efficiency:

  • Long-term Savings: While initial setup costs can be high, hosting your own model can be more cost-effective in the long run, especially for large-scale deployments.
  • Avoid Vendor Lock-in: Reduce reliance on third-party services and potential vendor lock-in, giving you more flexibility in choosing solutions.

Scalability:

  • Flexible Scaling: Easily scale the model and infrastructure to meet changing demands without relying on third-party providers.
  • Resource Allocation: Allocate resources more efficiently based on your specific needs and budget.

Innovation and Research:

  • Advanced Research: Engage in cutting-edge research and development by leveraging the full capabilities of the model and infrastructure.
  • Experimentation: Conduct experiments and iterate on models without the constraints of third-party services.

Integration:

  • Seamless Integration: Integrate the model with existing systems and workflows more easily, ensuring a cohesive and efficient operation.
  • Custom APIs: Develop custom APIs and interfaces tailored to your specific requirements.

Resilience and Reliability:

  • Uptime: Ensure high availability and uptime by managing the infrastructure directly.
  • Disaster Recovery: Implement robust disaster recovery and backup strategies to protect against data loss and downtime.

By hosting your own LLM, you gain significant control over your AI infrastructure, enabling you to tailor solutions to your specific needs while maintaining security and performance. Read on as we walk through the process together.

Instructions (Windows)

  • Download Ollama. Head on over to ollama.com and download for Windows.
  • Install the application.
host your own local LLM - installation image for Ollama.
  • In the meantime, head over to the models page on the Ollama website and read through them to decide which you would like to install. Each model has a command to install it next to the tags. In the example below, it is ollama run llama3.3; copy this command.
  • Once Ollama is installed, start the application from the Start menu.
  • Open a command prompt (Windows logo key + R, type cmd and hit enter).
  • When the command prompt window opens, paste the command you copied from the model page and hit enter.
  • Close Ollama by typing /bye and hitting enter.
  • Next, download the appropriate version of Docker Desktop for your computer.
  • Go to the Open UI github here and scroll to the installation instructions.
  • Copy the “If Ollama is on your computer” command.
  • Run this command in the command prompt. The package is large and may take several minutes to download and install.
  • After the installation is complete, go to the Docker application and note the open-webui container.
  • In your browser, head to http://localhost:3000/
  • Note: On my machine, I had to stop and restart the Docker container the first time; if you are having an issue, try that first.
  • Select the model at the top.
  • You now have a lovely interface to interact with your model! The possibilities are endless.
bookkeeping template image

Small Business Bookkeeping Template | Excel Spreadsheet | Financial Tracker | Profit & Loss | Income Expense Tracker | Digital Download | TWO FREE BONUSES

bookkeeping template image
bookkeeping template preview

ON SALE! Purchase at a discounted price right via Paypal here on bonbonsguide.com or visit my Etsy Shop!!
https://artofbonbon.etsy.com/listing/4316988571

Transform Your Business Finances in Minutes – Not Hours!
Stop losing sleep over messy finances! This comprehensive bookkeeping template is designed specifically for small business owners, entrepreneurs, and freelancers who want to take control of their money without the headache.

✨ What You Get:
Complete Excel Bookkeeping Template Spreadsheet with 9 pre-built worksheets
Easy Setup Guide – just fill in your business details and go!
Income Tracking for multiple revenue streams (Shopify, Amazon, Etsy, consulting, etc.)
Expense Categories covering all business costs
Monthly Profit Goals with automatic calculations
Annual Overview for tax preparation
Inventory Management system
Materials & Products tracking
Sales Tax calculations

🎯 Perfect For:
Etsy sellers & online shop owners
Amazon FBA sellers
Freelancers & consultants
Service-based businesses
E-commerce entrepreneurs
Anyone tired of shoebox accounting!

💪 Why This Template Works:
✅ Plug & Play Ready – No complex formulas to figure out
✅ Comprehensive Coverage – Income, expenses, profit goals all in one place
✅ Tax-Time Friendly – Organized for easy tax preparation
✅ Scalable – Grows with your business
✅ Time-Saving – Set up once, use all year
✅ Professional – Clean, organized layout

🚀 Benefits You’ll Love:
Save 10+ hours every month on bookkeeping
Never miss a deduction with organized expense tracking
Set and track profit goals monthly
Low stress tax season with organized records
Make better business decisions with clear financial data
Professional presentation for investors or loans

📋 What’s Included:
Setup Sheet – Quick entry of accounts and goals
Income Tracker – Multiple revenue streams
Expense Manager – Add as many categories as you need
Monthly Overview – Profit/loss at a glance
Annual Summary – Year-end totals
Sales Tax Tracking – Breakdown by month
Inventory Tracker – Stock management
Materials Cost – Inventory and cost tracking
Products – Item inventory management

💻 Technical Details:
File Format: Excel (.xlsx) – works with Excel
Instant Download – No waiting!
Lifetime Access – Download anytime
Commercial Use – Use for your business
No Macros – Compatible with all versions of Excel
Compatible with Google Sheets & Numbers, but works best in Excel 🙂

🎁 BONUS #1: Small Business Expense Checklist ($29 Value!)
Don’t leave money on the table! This comprehensive checklist covers 80+ often-missed business deductions that could save you hundreds or even thousands on your taxes.

🎁 BONUS #2: Monthly Financial Review Template ($39 Value!)
Don’t just track your numbers – understand them! This professional template helps you analyze your financial data and create action plans for growth. Turn your bookkeeping into business intelligence!

🔥 LIMITED TIME: Get Organized Today!
Stop procrastinating on your accounting! This bookkeeping template helps many small business owners get their finances organized and profitable.

💬 What Customers Say:
“Finally, a bookkeeping system that actually makes sense! Set up in 15 minutes and saves me hours every month.” – Sarah K.
“Perfect for my Etsy shop. Love how it tracks everything I need for taxes.” – Micah D.
“I wish I had this template when I started my business. Would have saved me so much stress!” – Keiko L.

📞 Questions?
Send a message here on bonbonsguide.com or Etsy if you have any questions about the template!
⚡ Instant Download – Start Organizing Today!

💲 LIMITED TIME OFFER – HUGE SAVINGS WHEN PURCHASING HERE VIA PAYPAL 💲

OR Shop on Etsy: https://artofbonbon.etsy.com/listing/4316988571

free bonuses

🏷️ Tags: bookkeeping template, excel, financial planner, profit loss tracker, income expense sheet, business accounting, etsy seller tools, tax preparation, budget tracker, small business, bookkeeping tool, simple bookkeeping, easy bookkeeping, amazon fba tracker, freelancer finances, entrepreneur tools, business spreadsheet, accounting template, financial organizer, expense tracker, revenue tracker, business planner, digital download

Contact us below with any questions.

← Back

Thank you! Your Message Has Been Sent

VBA With Power Query: Maximize Efficiency and Automate Your Data Processes in Excel (with VBA code)

What are the benefits of using VBA with Power Query?

Using VBA in conjunction with Power Query can provide significant benefits, especially when you need to automate complex workflows, integrate data from multiple sources, or perform advanced transformations programmatically. Here are the key benefits of using VBA over just using Power Query directly:

  1. Automation and Repetition:
    • Automation: VBA allows you to automate repetitive tasks, such as importing data from multiple files, applying the same transformations, and saving the results in a consistent format.
    • Scheduling: You can schedule VBA macros to run at specific times, ensuring data is updated automatically.
  2. Customization and Flexibility:
    • Custom Functions: VBA enables you to create custom functions and procedures that can be used within Power Query M code.
    • Dynamic Parameters: You can pass dynamic parameters to Power Query queries using VBA, allowing for more flexible data processing. This alone is a huge benefit!!
  3. Integration with Other Applications:
    • Interoperability: VBA can interact with other applications and services, such as databases, web APIs, and email clients, enhancing the capabilities of Power Query.
    • Data Export: You can use VBA to export data to various formats, such as PDF, CSV, or other Excel files, after it has been processed by Power Query.
  4. Complex Logic and Control:
    • Conditional Logic: VBA provides powerful conditional logic and control structures that can be used to handle complex data processing tasks.
    • Error Handling: You can implement robust error handling in VBA to manage unexpected issues during data processing.
  5. User Interface:
    • Custom UserForms: VBA allows you to create custom user interfaces (UserForms) for data entry and interaction, making it easier for users to perform complex tasks without needing to know Power Query M code.
    • Buttons and Macros: You can add buttons and macros to Excel worksheets to trigger VBA scripts, making it user-friendly.
  6. Advanced Data Manipulation:
    • Data Cleaning: VBA can be used for advanced data cleaning tasks, such as removing specific patterns, handling missing data, and normalizing data formats.
    • Data Transformation: VBA can perform complex transformations that might be difficult or impossible to achieve with Power Query alone.
  7. Version Control and Collaboration:
    • Version Control: VBA code can be version-controlled using tools like Git, allowing for better collaboration and tracking changes.
    • Shared Macros: You can share VBA macros with your team, ensuring consistency in data processing workflows. This can be especially helpful for vacation coverage or spreading the workload among multiple team members!
  8. Performance Optimization:
    • Efficiency: For large datasets, VBA can be more efficient in certain scenarios, especially when combined with Power Query for initial data loading and filtering.
    • Resource Management: VBA can manage system resources more effectively, ensuring smooth performance during data processing.

When to Use VBA Over Power Query

  • Complex Workflows: When you need to perform a series of complex transformations and data manipulations that are difficult to achieve with Power Query alone.
  • Integration with Other Systems: When you need to integrate Excel with other applications, databases, or web services.
  • Automated Reporting: When you need to automate the generation of reports and dashboards based on dynamic data sources.
  • Custom User Interfaces: When you need to create custom user interfaces for data entry and interaction.
  • Advanced Error Handling: When you need robust error handling and logging for data processing tasks.

When to Use Power Query Alone

  • Simple Data Transformation: When you need to perform simple data transformations and cleaning tasks.
  • Data Visualization: When you need to create dynamic data visualizations and dashboards.
  • Data Integration: When you need to integrate and combine data from multiple sources without complex logic.
  • Data Refresh: When you need to refresh data regularly from external sources.
  • Data Transformation: Power Query allows for complex data transformations, such as filtering, merging, and aggregating data.
  • Refreshable Data: Data imported using Power Query can be easily refreshed to update with new data.
  • Scalability: Power Query is better suited for larger datasets and more complex data processing tasks.

VBA with Power Query Code Samples with Explanations

Use Case: Importing Data from CSV Files Using Power Query

Power Query is a more advanced and flexible tool for data import and transformation in Excel. It allows for more complex data transformations and can handle larger datasets more efficiently. Here’s how you can use VBA to import a CSV file using VBA with Power Query.


Sub ImportCSVWithPowerQuery()
Dim filePath As String
Dim connName As String

filePath = "C:\Data\sales_data.csv"
connName = "SalesDataConnection"

' Check if the connection already exists and delete it
On Error Resume Next
ThisWorkbook.Queries.Delete connName
On Error GoTo 0

' Create a new Power Query connection
With ThisWorkbook.Queries.Add(Name:=connName, Formula:= _
    "let" & vbCrLf & _
    "    Source = Csv.Document(File.Contents(""" & filePath & """),[Delimiter="","", Columns=11, Encoding=65001, QuoteStyle=QuoteStyle.Csv])," & vbCrLf & _
    "    PromotedHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars=true])" & vbCrLf & _
    "in" & vbCrLf & _
    "    PromotedHeaders")

    ' Load the query into a new worksheet
    With ThisWorkbook.Worksheets.Add
        .Name = "Data"
        .Cells(1, 1).LoadFromText Connection:=connName, Destination:=.Cells(1, 1)
    End With
End With

End Sub

Explanation of Power Query VBA Code

  1. File Path and Connection Name:
    • filePath is the path to your CSV file
    • connName is the name of the Power Query connection.
  2. Delete Existing Connection:
    • The code checks if the connection already exists and deletes it to avoid conflicts.
  3. Create New Power Query Connection:
    • The Queries.Add method creates a new Power Query connection.
    • The Formula parameter specifies the Power Query M code to import and transform the CSV file.
  4. Load Query into Worksheet:
    • A new worksheet is created, and the query is loaded into it using LoadFromText

Use Case: Importing and Transforming Data from an Excel File Using Power Query and VBA

Objective: Import data from a specific worksheet in an Excel file, filter out rows with specific criteria, perform some transformations, and load the cleaned data into a new worksheet.

Preparation:

  1. Prepare the Source Excel File:
    • Ensure your source Excel file is located at a known path, e.g., C:\Data\source_data.xlsx.
    • Ensure the data is in a worksheet named SalesData.
  2. VBA Code to Import and Transform Data Using Power Query:
Sub ImportAndTransformExcelDataWithPowerQuery()
    Dim sourceFilePath As String
    Dim sourceWorkbookName As String
    Dim sourceSheetName As String
    Dim connName As String
    Dim queryName As String
    Dim ws As Worksheet
    
    ' Set file path, workbook name, sheet name, and connection/query names
    sourceFilePath = "C:\Data\source_data.xlsx"
    sourceWorkbookName = "source_data.xlsx"
    sourceSheetName = "SalesData"
    connName = "SourceDataConnection"
    queryName = "TransformedSalesData"
    
    ' Delete existing connection and query if they exist
    On Error Resume Next
    ThisWorkbook.Queries.Delete connName
    ThisWorkbook.Queries.Delete queryName
    On Error GoTo 0
    
    ' Create a new Power Query connection
    ThisWorkbook.Queries.Add Name:=connName, Formula:= _
        "let" & vbCrLf & _
        "    Source = Excel.Workbook(File.Contents(""" & sourceFilePath & """), null, true)," & vbCrLf & _
        "    SalesData_Sheet = Source{[Item=""" & sourceSheetName & """,Kind=""Sheet""]}[Data]" & vbCrLf & _
        "in" & vbCrLf & _
        "    SalesData_Sheet"
    
    ' Create a new Power Query query for transformation
    ThisWorkbook.Queries.Add Name:=queryName, Formula:= _
        "let" & vbCrLf & _
        "    Source = #" & connName & "," & vbCrLf & _
        "    RemovedTopRows = Table.Skip(Source, 1)," & vbCrLf & _
        "    RemovedDuplicates = Table.Distinct(RemovedTopRows, {" & _
        "        ""Product"", ""Region"", ""Sales"", ""Date"", ""Quantity"", ""Category""})," & vbCrLf & _
        "    FilteredRows = Table.SelectRows(RemovedDuplicates, each [Sales] > 100)," & vbCrLf & _
        "    SortedRows = Table.Sort(FilteredRows,{{""Date"", Order.Ascending}})," & vbCrLf & _
        "    AddedTotalSales = Table.AddColumn(SortedRows, ""TotalSales"", each [Sales] * [Quantity], Int64.Type)" & vbCrLf & _
        "in" & vbCrLf & _
        "    AddedTotalSales"
    
    ' Load the transformed query into a new worksheet
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = "TransformedData"
    ws.Cells(1, 1).LoadFromText Connection:=queryName, Destination:=ws.Cells(1, 1)
    
    ' Format the worksheet
    With ws
        .Range("A1").CurrentRegion.AutoFit
        .Range("A1").CurrentRegion.Style = "TableStyleMedium9"
    End With
    
    MsgBox "Data imported and transformed successfully!"
End Sub

Explanation of the VBA Code

  1. Set File Path, Workbook Name, Sheet Name, and Names:
    • sourceFilePath is the path to your source Excel file.
    • sourceWorkbookName is the name of the source Excel file.
    • sourceSheetName is the name of the worksheet containing the data.
    • connName is the name of the initial Power Query connection.
    • queryName is the name of the transformed Power Query query.
  2. Delete Existing Connection and Query:
    • The code checks if the connection and query already exist and deletes them to avoid conflicts.
  3. Create a New Power Query Connection:
    • The Queries.Add method creates a new Power Query connection to import data from the specified worksheet in the Excel file.
    • The Formula parameter specifies the Power Query M code to import the data.
  4. Create a New Power Query Query for Transformation:
    • This query uses the initial connection as its source.
    • It skips the first row (assuming headers).
    • It removes duplicates based on specified columns.
    • It filters rows where Sales is greater than 100.
    • It sorts the filtered rows by Date in ascending order.
    • It adds a new column TotalSales calculated as Sales * Quantity.
  5. Load the Transformed Query into a New Worksheet:
    • A new worksheet is created, and the transformed query is loaded into it using LoadFromText.
  6. Format the Worksheet:
    • The code automatically fits the columns and applies a table style for better readability.

Detailed Steps

  1. Prepare the Source Excel File:
    • Update the path to match your source Excel file.
    • Ensure the data is in a worksheet named SalesData, or update that variable to match your data.
  2. Open VBA Editor:
    • Press Alt + F11 to open the VBA editor.
  3. Insert a New Module:
    • In the VBA editor, go to Insert > Module to create a new module.
  4. Copy and Paste the VBA Code:
    • Copy the above VBA code and paste it into the module.
  5. Run the Macro:
    • Close the VBA editor and return to Excel.
    • Press Alt + F8, select ImportAndTransformExcelDataWithPowerQuery, and click Run.
  6. View the Results:
    • A new worksheet named TransformedData will be created, showing the imported and transformed data.

Additional Tips

  • Customizing Columns:
    • You can customize the column names and the criteria for filtering and sorting based on your specific dataset.
  • Handling Different Workbooks and Sheets:
    • Adjust the sourceFilePath, sourceWorkbookName, and sourceSheetName variables to match your source file and worksheet.
  • Error Handling:
    • Add error handling to manage potential issues, such as file not found or invalid data.

Example: Combining VBA with Power Query for Automation of Reporting

Here’s a more detailed example that combines VBA with Power Query to automate a complex data processing workflow that can automate data reporting from start to finish, including transforming the data and outputting a user-friendly report.

Use Case: Automating Data Import, Transformation, and Reporting

Objective: Import data from multiple Excel files, perform transformations, and generate a consolidated report.

VBA Code:

Sub AutomateDataProcessing()
    Dim folderPath As String
    Dim fileName As String
    Dim connName As String
    Dim queryName As String
    Dim ws As Worksheet
    Dim lastRow As Long
    
    ' Set folder path and connection/query names
    folderPath = "C:\Data\"
    connName = "SourceDataConnection"
    queryName = "TransformedSalesData"
    
    ' Delete existing connection and query if they exist
    On Error Resume Next
    ThisWorkbook.Queries.Delete connName
    ThisWorkbook.Queries.Delete queryName
    On Error GoTo 0
    
    ' Initialize a new worksheet for consolidated data
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = "ConsolidatedData"
    ws.Range("A1").Value = "Product"
    ws.Range("B1").Value = "Region"
    ws.Range("C1").Value = "Sales"
    ws.Range("D1").Value = "Date"
    ws.Range("E1").Value = "Quantity"
    ws.Range("F1").Value = "Category"
    ws.Range("G1").Value = "TotalSales"
    
    ' Loop through all Excel files in the folder
    fileName = Dir(folderPath & "*.xlsx")
    Do While fileName <> ""
        ' Create a new Power Query connection for each file
        ThisWorkbook.Queries.Add Name:=connName, Formula:= _
            "let" & vbCrLf & _
            "    Source = Excel.Workbook(File.Contents(""" & folderPath & fileName & """), null, true)," & vbCrLf & _
            "    SalesData_Sheet = Source{[Item=""SalesData"",Kind=""Sheet""]}[Data]" & vbCrLf & _
            "in" & vbCrLf & _
            "    SalesData_Sheet"
        
        ' Create a new Power Query query for transformation
        ThisWorkbook.Queries.Add Name:=queryName, Formula:= _
            "let" & vbCrLf & _
            "    Source = #" & connName & "," & vbCrLf & _
            "    RemovedTopRows = Table.Skip(Source, 1)," & vbCrLf & _
            "    RemovedDuplicates = Table.Distinct(RemovedTopRows, {" & _
            "        ""Product"", ""Region"", ""Sales"", ""Date"", ""Quantity"", ""Category""})," & vbCrLf & _
            "    FilteredRows = Table.SelectRows(RemovedDuplicates, each [Sales] > 100)," & vbCrLf & _
            "    SortedRows = Table.Sort(FilteredRows,{{""Date"", Order.Ascending}})," & vbCrLf & _
            "    AddedTotalSales = Table.AddColumn(SortedRows, ""TotalSales"", each [Sales] * [Quantity], Int64.Type)" & vbCrLf & _
            "in" & vbCrLf & _
            "    AddedTotalSales"
        
        ' Load the transformed query into the consolidated worksheet
        lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        ws.Cells(lastRow + 1, 1).LoadFromText Connection:=queryName, Destination:=ws.Cells(lastRow + 1, 1)
        
        ' Delete the Power Query connection and query after processing
        ThisWorkbook.Queries.Delete connName
        ThisWorkbook.Queries.Delete queryName
        
        ' Move to the next file
        fileName = Dir
    Loop
    
    ' Format the worksheet
    With ws
        .Range("A1").CurrentRegion.AutoFit
        .Range("A1").CurrentRegion.Style = "TableStyleMedium9"
    End With
    
    MsgBox "Data imported, transformed, and consolidated successfully!"
End Sub

Explanation of the VBA Code

  1. Set Folder Path and Names:
    • folderPath is the path to the folder containing the Excel files.
    • connName is the name of the initial Power Query connection.
    • queryName is the name of the transformed Power Query query.
  2. Delete Existing Connection and Query:
    • The code checks if the connection and query already exist and deletes them to avoid conflicts.
  3. Initialize a New Worksheet:
    • A new worksheet named ConsolidatedData is created to store the consolidated data.
  4. Loop Through Excel Files:
    • The code loops through all Excel files in the specified folder.
    • For each file, it creates a new Power Query connection to import data from the SalesData worksheet.
  5. Create a New Power Query Query for Transformation:
    • This query uses the initial connection as its source.
    • It skips the first row (assuming headers).
    • It removes duplicates based on specified columns.
    • It filters rows where Sales is greater than 100.
    • It sorts the filtered rows by Date in ascending order.
    • It adds a new column TotalSales calculated as Sales * Quantity.
  6. Load the Transformed Query into the Consolidated Worksheet:
    • The transformed data is loaded into the ConsolidatedData worksheet.
  7. Delete the Power Query Connection and Query:
    • After processing each file, the connection and query are deleted to clean up.
  8. Format the Worksheet:
    • The code automatically fits the columns and applies a table style for better readability.

Conclusion

Using VBA in conjunction with Power Query provides a powerful combination for automating and managing complex data workflows. While Power Query is excellent for data transformation and integration, VBA offers the flexibility and control needed for advanced automation and integration tasks. By combining these tools, you can create robust and efficient data processing solutions.

Feel free to comment other examples you would like to see as we continue to explore automation of workflows via both VBA and Power Query!

code execution has been interrupted window

How to Make Excel Wait or Pause in a VBA Macro

When running macros, I have often found the need for an Excel wait or pause, mainly so that other things can happen. DoEvents surely helps for waiting for things to happen within Excel, but sometimes you need to wait for processes to start or finish outside of Excel before moving onto other steps in VBA.

Why Wait?

I am a big fan of automating processes, especially with VBA in Excel. For example, I update and save a spreadsheet to SharePoint that a Power BI model is using. I have a Power Automate process set up that automatically refreshes the Power BI model whenever this particular spreadsheet is updated. The challenge is that Power BI temporary locks the workbook as it reads it, so if I am updating a few times in a short amount of time, Excel needs to wait until the SharePoint file is unlocked.

Also, I have another process where I call a Python script and once that is done, I continue on with VBA code to process the workbook Python outputs. I need Excel to wait while the Python code runs. Side note: let me know if you would like me to write more about these other automated processes. It’s simply amazing what you can get accomplished!

The Solution – Pause in a VBA Macro

Good news – making Excel wait is very easy! Here is the simple code:

Application.Wait (Now + TimeValue("0:00:50"))

This will have Excel wait for 50 seconds since the time is represented as (H:MM:SS). You can adjust as needed.

Bonus

In my code, I don’t need it to wait every time – only when it runs into an issue saving the workbook on SharePoint. Here is how I have set my code using an error handler in my VBA macro.

On Error GoTo waitforupdate

lsc.SaveAs Filename:= _
        "https://sharepoint.com/sites/Reporting/Milestones/Status.xlsx" _
        , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        
lsc.Close
Exit Sub

waitforupdate:
Application.Wait (Now + TimeValue("0:00:50"))
Resume Next

I hope this helps you! Please comment or reach out if you would like to see other topics covered. I truly enjoy writing about Excel tips and tricks, especially VBA and automation!

Addressed in this post (to help others find this):

  • Pause in a VBA Macro
  • How to pause Excel
  • How to make Excel pause
  • Make VBA pause
  • Make VBA wait
  • Make Excel wait
  • VBA code wait, VBA macro wait
  • VBA code pause, VBA macro pause
  • VBA wait for another application

rank in Access

Solved: Pass a Parameter to a SQL Query in Power Query

I’ve done a fair amount of research around dynamic and parameterized queries, specifically around an Excel query parameter, as in trying to pass a parameter to a SQL query in Power Query.  Here’s the very quick and easy way to do this!

This exact solution works in Excel. Creating a dynamic SQL query with a parameter in Excel allows for amazing flexibility. The use cases are endless and can benefit so many types of Excel work across industries – if you are querying any data source, such as a database, even an Access database, then parameterized querying in Excel can truly simplify your workflow. I am going to cover SQL queries specifically, but please comment below if you would like a tutorial on using a parameter with other data sources. Nearly anything is possible!

You can also easily use parameters in Power BI, but the process for creating the parameter itself is slightly different – I will cover that in a future post.  The query construction is the same in most cases though. Please note that this post assumes you are at least moderately familiar with SQL querying and Power Query. Your mileage may vary depending on your situation.

If you found this post because you are encountering a firewall error when incorporating a parameter, skip right on to that section below (click here) for the solution. After much trial and error, I have found a way that works to overcome this issue harnessing the power of query folding. 

The Solution: Passing a Parameter to a SQL Query

In my example, “SParameter” is the name of the parameter I am using, and it represents a store number (retail location identifier). The related field in my SQL table is [Store].

Create the parameter:

  • In any worksheet, add a new table, with a single record and column.  I highly recommend the Header clearly clarifies what the parameter is so there is no confusion in identifying it.
  • Add this table into Power Query by selecting the table, then Data > From Table/Range
  • When the query editor opens, if necessary, change the data type (in my case I need it to be text).  This is important!
  • Right click on the record and select “Drill Down”.  Since you have only a single record, this step will automatically create a parameter.  
  • In the properties, I name this SParameter (you may enter the name of your choice for your parameter).  Note that the name is case sensitive.

This is how the table is situated in my worksheet (1 is the parameter/the value I will change as needed):

This is how it looks in Power Query after all steps above were completed (I named the column from Enter Store: to Store to make it cleaner (this is an optional step):

Open or Add your SQL Server Query in Power Query

Add your query into the Advanced Editor.


let
Source = Sql.Database(“your connection name”, “your database name”, [Query=”

your query goes here

“])


Create the SQL query with your parameter:

Here’s my simple query example to demonstrate how to build the query with the parameter. Please substitute your table name and fields, as well as your parameter name.

With the parameter in the WHERE clause

“Select  * FROM StoreDetail.Store WHERE Store =” &SParameter&”

  • Simply build your unique SQL statement in Power Query following my example above, adding your parameter into the query with quotes and the & (ampersand) sign surrounding the parameter name.
  • Check the results and modify as needed.
  • If your query has no additional clauses or criteria, simply put quotes and one & sign ahead of the parameter, and then one after followed by two double quotes to close the query statement.

 Additional criteria in the WHERE clause

Here is an example where I have additional criteria in mine, filtering on the OpenDate field; after the second quote, add a space and then continue on with the rest of your query.

Select  * FROM Storelist WHERE Store =” & SParameter &” AND OpenDate < GetDate()-365

This is an example of the properly formatted parameter looks in the Advanced Editor in Power Query (I have built out my query further with the Group By clause – this is optional if it doesn’t apply in your case).

If you are running into issues with the query, you may need to add in single quotes surrounding the parameter (inside of the double quotes – “WHERE Store =‘” & SParameter & “‘;”), or possibly # signs surrounding your parameter inside of the double quotes, if your parameter is a date.  You may have to test with and without these depending on your unique scenario.  

If the query is successful, you can proceed with saving it or adding in additional steps in Power Query if you are further filtering or transforming the resulting data you pulled.

BONUS Information – if you are wondering what GetDate() is, this is the MS SQL current system date, so in a way this is technically a dynamic parameter as well.  In my case, the query will only return stores with an open date that is older than 365 days based on today’s date.  You may find this useful for your query as well if you are looking for dynamic dating.

After updating your parameter in the worksheet table, Select Refresh All from the Data menu and your updated query will run and return the results accordingly!

Managing Privacy Levels in Power Query/Excel

VERY IMPORTANT: If you are sharing your workbook with others, you may need to edit the Privacy Levels in order for the queries with parameters to work for them. Read on for these important steps.

In Excel Power Query, there are security measures in place to help prevent data from being shared unintentionally. When combining query sources by using the parameter (a value in your Excel file with a SQL server source), many times this security comes into play.

If other users are having an issue refreshing the query/queries where you have added a parameter into the SQL query, please have them follow these steps. I actually copy and paste this right into an Instructions tab of each of the shared workbooks containing parameters that I create for my clients and for colleagues.

  • Go to Data, click Queries & Connections.
  • Your query list will show up in the panel on the right.
  • Right click any query in the list and choose Edit.
  • A window will open. Click File, then Options and settings.
  • Choose Query Options.
  • Click Privacy, which is on the menu on the left, at the bottom.
  • Select the radio button for the Ignore the Privacy Levels and potentially improve performance option.
  • Click OK to save.
  • Click Close & Load in the Power Query Editor window (at the top) to exit the settings.
Parameter to a SQL query (privacy settings)

Troubleshooting/Alternate Method – Firewall issue

If you run into this dreaded error: “Formula.Firewall: Query ‘SParameter (2)’ (step ‘Filtered Rows’) references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.”, then you will need to use this alternate method.

If you received the firewall error above, you can still use your parameter, but you will instead need to use the parameter as a filter in a subsequent step.  Now you may be possibly thinking – my table has thousands (or even millions) of records and I don’t want them all pulling in – don’t worry, this is the beauty of the query folding process when it works properly in Power Query.

Without the parameter in the WHERE clause

Select * FROM StoreDetail.Store WHERE OpenDate < GetDate()-365

  • Write your SQL statement in Power Query as noted above.
  • When the Query Editor returns the columns and record sampling, for the field you will be using your parameter, filter with any single value (Text Filters > Equals). This is simply a placeholder, to create the Power Query M formula for the next step.
  • You will now see that filtering in the formula bar. 
  • Replace the placeholder value with the name of your parameter, removing any quotes from the placeholder.  This is how it looks for me: = Table.SelectRows(Source, each [Store] = SParameter).
  • Power Query is smart enough to modify its native query to use the parameter, so it’s not going to pull in the millions of records and then filter after the fact.  Success!!  This is the power of Query Folding!

Why Can’t You Include the Parameter in the SQL Statement?

In the SQL statement, in most cases we will want add the store number/SParameter as part of the criteria in the select statement.  It may seem counter intuitive, but we cannot always successfully put the parameter directly into the SQL code/query. The challenge is that you are combining data sources and at this time, this is not allowed due to the built in security (SParameter portion is local, SQL portion is external).  Unfortunately some organizations have policies that disallow this. Sometimes it is an Excel version issue.

I truly hope this post helped you out.  If so, please feel free to leave a comment below letting me know so, and if you’d like, add what you’d like me to cover in a future post. Also, feel free to share this with someone else who may find it useful.

Do You Need Personalized Help and Custom Solutions?

If you get stuck or you would like to explore solutions and automation possibilities, please can reach out to me for help as I do offer consulting services as time allows.  I have over 20+ years’ of expert level experience delivering excellent, custom, strategic solutions in Excel, BI, Access, SharePoint and more. 

I have been called a guru and hero more times than I can count, as I am a great listener and truly have a knack for asking the right questions to understand unique business challenges. I am very passionate about crafting tools and processes that work for users of all levels and experience. 

Reach out today and let’s discuss how I can help you and your business!

I also offer one-on-one tutoring for customized learning and upskilling. Visit my consulting page and send a message if you are interested.

Other Excel Resources

Also, consider checking out some great Excel resources on Amazon Disclosure: this is an affiliate link, so I may earn a small commission if you decide to make a purchase, which will help cover the cost of hosting this website. 

Please bookmark and subscribe!  I am actively working on adding new, relevant content to help others out! Thanks so much!

Subscribe via Email and Stay Up to Date!

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Buy Me A Coffee/Support the Blog 🙂

If I helped you, please consider leaving a tip via PayPal to support the blog! Thanks!!

Thanks so much for supporting my blog and for helping others too!