<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by No Longer Set on Medium]]></title>
        <description><![CDATA[Stories by No Longer Set on Medium]]></description>
        <link>https://medium.com/@NoLongerSet?source=rss-78acf5965d4c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*YWCCLWQaVirS31Pz.jpg</url>
            <title>Stories by No Longer Set on Medium</title>
            <link>https://medium.com/@NoLongerSet?source=rss-78acf5965d4c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 16 May 2026 10:20:59 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@NoLongerSet/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Merry Christmas]]></title>
            <link>https://medium.com/@NoLongerSet/merry-christmas-2809e19712a0?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/2809e19712a0</guid>
            <category><![CDATA[vba]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Tue, 26 Dec 2023 04:12:30 GMT</pubDate>
            <atom:updated>2023-12-26T04:12:30.204Z</atom:updated>
            <content:encoded><![CDATA[<h4>“The Word became flesh and made his dwelling among us. We have seen his glory, the glory of the one and only Son…”</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2KtdjRKlHASYYR0n.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p><a href="https://www.biblegateway.com/passage/?search=John+1%3A1-14&amp;version=NIV"><em>John 1:1–14</em></a></p><h4>The Word Became Flesh</h4><p>1 In the beginning was the Word, and the Word was with God, and the Word was God. 2 He was with God in the beginning. 3 Through him all things were made; without him nothing was made that has been made. 4 In him was life, and that life was the light of all mankind. 5 The light shines in the darkness, and the darkness has not overcome it.</p><p>6 There was a man sent from God whose name was John. 7 He came as a witness to testify concerning that light, so that through him all might believe. 8 He himself was not the light; he came only as a witness to the light.</p><p>9 The true light that gives light to everyone was coming into the world. 10 He was in the world, and though the world was made through him, the world did not recognize him. 11 He came to that which was his own, but his own did not receive him. 12 Yet to all who did receive him, to those who believed in his name, he gave the right to become children of God — 13 children born not of natural descent, nor of human decision or a husband’s will, but born of God.</p><p>14 The Word became flesh and made his dwelling among us. We have seen his glory, the glory of the one and only Son, who came from the Father, full of grace and truth.</p><p>Originally published at <a href="https://nolongerset.com/merry-christmas-4/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2809e19712a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[twinBASIC Update: December 24, 2023]]></title>
            <link>https://medium.com/@NoLongerSet/twinbasic-update-december-24-2023-2ef71bf2d1d0?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ef71bf2d1d0</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[vba]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Sun, 24 Dec 2023 19:56:51 GMT</pubDate>
            <atom:updated>2023-12-24T19:56:51.229Z</atom:updated>
            <content:encoded><![CDATA[<h4>Highlights include an updated twinBASIC roadmap, a sneak peek at upcoming IDE menu and docking improvements, and RadioMan — a new tB project from fafalone.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uDgCqdDS2RA7Z_E-.png" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p><em>On April 23, 2021, I helped </em><a href="https://twitter.com/WaynePhillipsEA/"><em>Wayne Phillips</em></a><em> introduce the world to </em><a href="https://www.twinbasic.com/"><em>twinBASIC</em></a><em> at the </em><a href="https://www.donkarl.com/devcon/"><em>Access DevCon Vienna</em></a><em> conference. I </em><a href="https://nolongerset.com/devcon-2021/"><em>boldly predicted</em></a><em> that twinBASIC (along with the Monaco editor) would replace VBA and its outdated development environment by 2025. With that goal in mind, this weekly update is my attempt to keep the project fresh in the minds of the VBA development community.</em></p><p><em>Every Sunday, I will be providing updates on the status of the project, linking to new articles discussing twinBASIC, and generally trying to increase engagement with the project. If you come across items that should be included here, tweet me </em><a href="https://twitter.com/NoLongerSet"><em>@NoLongerSet</em></a><em> or email me at mike at nolongerset dot com.</em></p><p><em>Here are some links to get involved with the project:</em></p><ul><li><a href="https://nolongerset.com/how-to-install-twinbasic/"><strong><em>Custom twinBASIC IDE Installation Guide</em></strong></a></li><li><a href="https://github.com/WaynePhillipsEA/twinbasic/issues"><em>GitHub Issue Tracker (report bugs)</em></a></li><li><a href="https://discord.com/invite/UaW9GgKKuE"><em>twinBASIC Discord Server</em></a><em> (</em><a href="https://github.com/WaynePhillipsEA/twinbasic/discussions/629"><em>chat about the project</em></a><em>)</em></li><li><a href="https://www.linkedin.com/groups/14132101/"><em>twinBASIC/VBx LinkedIn Group</em></a></li></ul><h4>Highlights</h4><h4>twinBASIC Roadmap Updated</h4><p>Wayne updated <a href="https://github.com/twinbasic/twinbasic/issues/335">the twinBASIC roadmap</a> this week for the first time since June.</p><p>The bad news is the v1 release date has been pushed back to July 1, 2024 (was previously January 3, 2024).</p><p>The good news is that:</p><ul><li>The project continues making steady progress</li><li>v1 Release Candidate builds are scheduled for Q2 2024 (April — June)</li><li>Edit &amp; Continue support will now be available with v1 (<em>previously this was a post-v1 feature</em>)</li><li>Limited vbWatchdog support will be available with v1 (<em>full support will be implemented shortly after the v1 release</em>)</li><li>Wayne is not rushing out a half-baked product simply to meet an arbitrary deadline</li><li>The IDE is getting a lot more love than I expected for the version 1 release</li></ul><p>I think the last point is important.</p><p>As the saying goes, you only get one chance to make a first impression.</p><p>And, fair or not, software applications are disproportionately judged based on the physical appearance of their user interface. What Wayne has accomplished with the twinBASIC compiler is nothing short of amazing. That said, the official v1 release is likely to draw in a surge of tire-kickers interested in the new language. That audience, in particular, is likely to make a lot of assumptions about the language based purely on the development environment.</p><p>I have a hunch that Wayne came to a similar conclusion and that is why he prioritized some of the more advanced IDE features (like fully customizable layouts as described below) to be available at launch.</p><p>For posterity, here is the current state of the twinBASIC roadmap. As always, dates and features are subject to change:</p><h4>2024-Q1 (JAN-MAR)</h4><ul><li>Add MDI Forms support</li><li>Finalize UserContol / ActiveX support</li><li>Finish all remaining basic controls</li><li>Complete the missing App object methods</li><li>Add Printer/Printers support</li><li>Add the missing features to the new IDE, e.g. rename-refactoring and Test Explorer</li></ul><h4>2024-Q2 (APR-JUN)</h4><ul><li>Finish LLVM support, for optimized builds</li><li>v1 Release Candidate builds available within this period</li></ul><h4>VERSION 1 RELEASE</h4><ul><li>Tentative Release Date: 1st July 2024</li></ul><h4>2024-Q3 (JUL-SEP)</h4><ul><li>Start Analysis Extension API</li><li>Support full inheritance (#73)</li><li>Add full vbWatchdog support</li><li>Add multi-threading syntax support</li><li>Start cross-platform support for x86/x64 Linux/Mac</li></ul><h4>2024-Q4 (OCT-DEC)</h4><ul><li>Start cross-platform support for ARM Linux/Mac/Android</li><li>Start of reimplementation of all remaining VB6 shipped controls, such as Winsock, MAPI, Adodc, DataGrid, MSCOMM, etc</li><li>Support ActiveX controls on tB forms with unmatched bitness, using a proxy-process (e.g. 64-bit app using a 32-bit ActiveX control)</li></ul><h4>Upcoming IDE Docking Features</h4><p>From <a href="https://discord.com/channels/927638153546829845/927638154192748606/1186682809708974160">Wayne in Discord</a>:</p><p><em>The docking feature has been completely rewritten. It is extremely flexible, and should accomodate our current and future needs (for things like multi code editor support). Additionally:</em></p><ul><li><em>all panels can now be closed/shown individually</em></li><li><em>the toolbar is also now docked and movable</em></li><li><em>dragging the title bar of a panel brings it into “floating” mode.</em></li><li><em>Using the grab icon brings it back into docked mode</em></li></ul><p><em>As seen in the video, there’s a couple of quirks when going from floating mode back to docked mode, but these will of course be fixed before release</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VRb4pXOTx5nAWq15.png" /><figcaption>Click image to view video.</figcaption></figure><p>I think my <a href="https://discord.com/channels/927638153546829845/927638154192748606/1186851444708626544">favorite review</a> of the upcoming docking feature came from Andrew Mansell (aka, mansellan):</p><blockquote>Damn, that’s sweet.<br><br>So wait… @WaynePhillipsEA looked at the docking system for VS2022 and thought: hold my beer. <br><br>Nice.</blockquote><h4>New Default IDE Layout</h4><p>Obviously, this is still a work in progress. But the new default layout for the twinBASIC IDE will look like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TAlXUWpzfnkdWqJM.png" /></figure><p>The good news is that this is just a starting point.</p><p>You will be able to <a href="https://discord.com/channels/927638153546829845/927638154192748606/1186684102859051099">save and restore custom layouts</a>. You will also be able to restore the default layout in case you get yourself into trouble customizing things.</p><p>Once keybindings are introduced, you will be able to easily switch between layouts. This will let you, for example, have a development layout and a debugging layout that you can quickly switch between depending on what you are doing at the time.</p><h4>Improved Menus</h4><p><a href="https://discord.com/channels/927638153546829845/927638154192748606/1188043825906733086">Wayne</a>: “Menus are now receiving some love…”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/474/0*-Tb8LL1eZVYqNKDP.png" /><figcaption>Click image to view video.</figcaption></figure><h4>Discord Chat Summary</h4><p>*<em> Auto-generated via Claude-2–100k on poe.com</em></p><p>Here is a summary of the key points from the General channel transcript:</p><h4>twinBASIC General Channel Summary</h4><p>Over the past week, the twinBASIC team made significant progress on the IDE UI overhaul. New features were showcased including a rewritten docking system, movable toolbar, tabbed menus, and an updated default layout. Multiple screenshots and videos demonstrated the new capabilities.</p><p>Discussions highlighted:</p><ul><li>The new docking system is extremely flexible and will support future features like multiple code windows. Panels can be individually opened/closed, floated, and docked.</li><li>The toolbar is now docked and movable. The layout leaves room for more buttons. Extra toolbars can be easily added.</li><li>Menus received visual updates and now support tabs for better organization. More menu options will be enabled soon.</li><li>The default IDE layout was tweaked based on feedback to expand the Problems pane and consolidate the Debug Console on the left. This will likely become the standard layout.</li><li>Support was confirmed for passing Decimal types ByVal to APIs, enabling stopgap 32/64 bit support for UDTs like RECT until full ByVal UDT marshaling is implemented.</li><li>Multiple IDE windows are planned for v1 now thanks to the docking system changes. At minimum a split view code editor is desired.</li><li>The team continues to consider open sourcing parts of the project, starting with the IDE components first. Community feedback on licensing options was gathered.</li></ul><p>Overall, rapid progress is being made to overhaul the IDE and prepare for the next major release. The team aims to provide a modern, flexible interface while retaining the familiarity of the Visual Basic origins. Community excitement is building in anticipation of the upcoming version.</p><h4>Around the Web</h4><h4>twinBASIC Features List</h4><p>Jon Johnson (aka, fafalone) has been lovingly maintaining the <a href="https://github.com/twinbasic/documentation/wiki/twinBASIC-Features">twinBASIC Features page</a> on the <a href="https://github.com/twinbasic/documentation/wiki">tB wiki</a>.</p><p>The Features page is not new this week, but it did come up in the Discord chat. It’s been a long time since I’ve linked to it, so I thought it was worth mentioning again.</p><p>The page is broken down into the following sections:</p><ul><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#language-syntax">Language Syntax</a></li><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#project-configuration">Project Configuration</a></li><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#attributes">Attributes</a></li><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#standard-library">Standard Library</a></li><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#gui-components">GUI components</a> (e.g. controls and forms)</li><li><a href="https://github.com/twinbasic/documentation/wiki/twinbasic-features#design-experience">Design Experience</a></li></ul><p>The features listed are “new” in the sense that they do not exist in VBA/VB6.</p><h4>RadioMan — Radio Management</h4><p>fafalone is back with another twinBASIC sample project. Unlike many of his others, which have been twinBASIC ports of code originally written for VB6, the <a href="https://github.com/fafalone/RadioMan#readme">RadioMan project</a> was written from the ground up in twinBASIC.</p><p>Here’s <a href="https://discord.com/channels/927638153546829845/1187338441541812265/1187338441541812265">his announcement</a> from the show-and-tell channel of the tB Discord server:</p><blockquote>This app exposes undocumented radio management functionality in Windows. I’ve always been a big fan of making your own settings apps, so don’t like being told the official one is the only way to do something. The IMediaRadioManager, IRadioInstance, and IRadioCollection interfaces are documented, but the coclasses representing the system objects actually implementing them are not; they&#39;re just documented for hardware providers to provide. There&#39;s three of these I could find: the WWAN manager, which includes cellular radios, the WLAN manager, which includes WiFi radios, and the Bluetooth manager (self explanatory). These provide control over individual radios. I tested this app on my Surface tablet, where I had one of each. The app lets you control them all individually; you choose one on the list then can query, enable, or disable. Also available is the IRadioManager interface that controls the master switch for all radios - &#39;Airplane Mode&#39;, you can also enable/disable this mode.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/460/0*VFWC6A81rjMXjaI7.png" /></figure><h4>Changelog</h4><p>Here are the updates from the past week. You can also find this information by visiting the GitHub <a href="https://github.com/WaynePhillipsEA/twinbasic/releases">twinBASIC Releases page</a>.</p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">Releases · WaynePhillipsEA/twinbasic</a></p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">Contribute to WaynePhillipsEA/twinbasic development by creating an account on GitHub.</a></p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">GitHubWaynePhillipsEA</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*P5pla_n4HES0Bd6x" /></figure><p><em>No new releases this week.</em></p><p>Originally published at <a href="https://nolongerset.com/twinbasic-update-december-24-2023/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ef71bf2d1d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Week in Review: December 23, 2023]]></title>
            <link>https://medium.com/@NoLongerSet/week-in-review-december-23-2023-78a1c91323b1?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/78a1c91323b1</guid>
            <category><![CDATA[vba]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Sat, 23 Dec 2023 19:03:27 GMT</pubDate>
            <atom:updated>2023-12-23T19:03:27.368Z</atom:updated>
            <content:encoded><![CDATA[<h4>Highlights include an MZ-Tools tour from developer Carlos Quintero, an Edge browser control video series, and multi-select filtering of a continuous form.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HTl1Ycz3IA0zj9We.png" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><h4>Just Published</h4><p>This section includes videos, articles, and interesting discussions from the past 7 days.</p><h4>Articles</h4><ul><li><a href="https://techcommunity.microsoft.com/t5/access-blog/bg-p/AccessBlog"><strong>Official Access Blog</strong></a></li><li><a href="https://techcommunity.microsoft.com/t5/access-blog/access-releases-7-issue-fixes-in-version-2311-released-november/ba-p/4011112">Access Releases 7 Issue Fixes in Version 2311 (Released November 25th, 2023)</a>, <em>by Linda Lu Cannon</em></li><li><a href="https://www.accessforever.org/"><strong>Access Forever</strong></a></li><li><a href="https://www.accessforever.org/post/access-user-groups-2024">Access User Groups 2024</a>, <em>by Colin Riddington</em></li><li><strong>Maria Barnes</strong> (<a href="https://www.linkedin.com/newsletters/business-data-bytes-6892816951870066688/">Business Data Bytes Newsletter</a>)</li><li><a href="https://www.linkedin.com/pulse/what-microsoft-365-copilot-maria-barnes-tef3c/">What is Microsoft 365 Copilot?</a></li><li><strong>Jonathan Halder</strong> (<a href="https://www.accessjumpstart.com/blog/">Access JumpStart 2.0</a>)</li><li><a href="https://www.accessjumpstart.com/tdd-016-creating-the-start-of-the-iterate-method/">TDD — 016 — Begin to Create the Iterate method</a></li><li><a href="https://www.accessjumpstart.com/tdd-017-trying-to-get-to-the-next-simplest-test-and-failing/">TDD — 017 — Trying to get to the next simplest test (and failing)</a></li><li><a href="https://www.accessjumpstart.com/tdd-018-eureka-my-first-interface/">TDD — 018 — Eureka! My first interface.</a></li><li><a href="https://www.accessjumpstart.com/tdd-019-an-interface-whats-the-big-deal/">TDD — 019 — An interface? What’s the big deal?</a></li><li><a href="https://www.accessjumpstart.com/access-programming-what-i-do-and-why-find-and-replace/">Access Programming — What I do and Why (Find and Replace)</a></li><li><strong>Daniel Pineault</strong> (<a href="https://www.devhut.net/"><em>DEVelopers HUT</em></a>)</li><li><a href="https://www.devhut.net/recover-a-deleted-microsoft-access-table/">Recover a Deleted Microsoft Access Table</a></li><li><a href="https://www.devhut.net/windows-11-update-breaks-wifi/">Windows 11 Update Breaks WiFi!</a></li><li><a href="https://www.devhut.net/microsoft-access-database-schemas/">Microsoft Access Database Schemas</a></li><li><strong>Colin Riddington</strong> (<a href="https://isladogs.co.uk/home/index.html"><em>Isladogs on Access</em></a>)</li><li><a href="https://isladogs.co.uk/multiselect-filter-continuous-form/index.html">Multiselect Filter in a Continuous Form</a></li><li><a href="https://isladogs.co.uk/reserved-errors/index.html">Reserved Errors — no message for this error</a></li><li><strong>Mike Wolfe</strong> (<a href="https://nolongerset.com"><em>NoLongerSet</em></a>)</li><li><a href="https://nolongerset.com/setcanvasbgcolor/">How to Set the Background Color of the Microsoft Access Application Window with VBA</a></li><li><a href="https://nolongerset.com/dropping-if-vba7/">Dropping </a><a href="https://nolongerset.com/dropping-if-vba7/">#If VBA7 Then From API Declares</a></li><li><a href="https://nolongerset.com/fixed-expression-has-no-value/">FIXED: “You entered an expression that has no value.”</a></li><li><a href="https://nolongerset.com/poe/">Poe: My Tool of Choice for Exploring the World of LLMs</a></li><li><a href="https://nolongerset.com/ai-embrace-or-eschew/">“AI Will Take My Job”: A Self-Fulfilling Prophecy</a></li></ul><h4>Videos‌</h4><ul><li><strong>Access User Group Recordings</strong> (<a href="https://www.youtube.com/@AccessUserGroups">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=StnrnRC7QwE">Automating Access Programming — Leveraging MZ Tools</a> (01:38:59): <em>with Carlos Quintero</em></li><li><strong>Sean MacKenzie</strong> (<a href="https://www.youtube.com/@seanmackenziedataengineering">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=Emw4yEcqreg">Survey</a> (48:51): <em>ADI Part 7: Program a Simple Survey in Microsoft Access</em></li><li><strong>Richard Rost</strong> (<a href="https://www.youtube.com/@599CD">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=xNJdANbU_yU">Absolute Value</a> (20:05): <em>Constructing a Budget Variance Analysis Using the Absolute Value (ABS) Function in Microsoft Access</em></li><li><a href="https://www.youtube.com/watch?v=ujZVjQot3f8">Edge Part 2: QR Codes</a> (16:31): <em>Using the New Edge Browser Control in Microsoft Access, Part 2: Generating QR Codes</em></li><li><a href="https://www.youtube.com/watch?v=KDnJoBAzy5E">Edge Part 3: Custom Browser</a> (14:37): <em>Using the New Edge Browser Control in Microsoft Access, Part 3: Build a Custom Web Browser Form</em></li><li><a href="https://www.youtube.com/watch?v=Akh9xAbH2yU">Edge Part 4: Navigation Buttons</a> (17:33): <em>Using the New Edge Browser Control in Microsoft Access, Part 4: Navigation Buttons</em></li><li><a href="https://www.youtube.com/watch?v=s7Y_EbkY33I">Edge Part 5: Back &amp; Forward Buttons</a> (14:54): <em>Using the New Edge Browser Control in Microsoft Access, Part 5: Back &amp; Forward Buttons</em></li><li><strong>Pharos Technology [Dr. Richard Hanson]</strong> (<a href="https://www.youtube.com/@PharosTechnology">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=9wXX1jddZaY">Auto Backup Made Easy</a> (09:13): <em>Easy Auto Backup Solutions for Access Databases</em></li><li><strong>Edcelle John Gulfan</strong> (<a href="https://www.youtube.com/@EdcelleJohnGulfan">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=07D-xGyXiT4">COMBO BOX Column Value</a> (05:20): <em>Tutorial in Microsoft Access</em></li></ul><h4>New to Me</h4><p>This section includes content I discovered this week that has been around for awhile.</p><ul><li><a href="https://blobstreaming.org/why-do-programmers-need-private-offices-with-doors-do-not-disturb/?utm_id=FAUN_FAUN+Weekly404_Link_title#google_vignette"><em>Why do programmers need private offices with doors? (Do Not Disturb)</em></a>, by <a href="https://blobstreaming.org/author/mohamed/">Mohamed</a></li></ul><h4>Upcoming Access User Group Events</h4><p>NOTE: Only English-language user group meetings with scheduled guest speakers or topics are listed. For a complete list of upcoming events, visit the <a href="https://accessusergroups.org/calendar/">Access User Group event calendar</a>.</p><ul><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-01-03/">January 3, 2024</a>: <strong>Ramachandran (A.P.R.) Pillai</strong> — Streamlining the Form Module Code in the standalone Class Module</li><li><a href="https://accessusergroups.org/pacific/event/access-pacific-monthly-meeting-2024-01-04/">January 4, 2024</a>: <strong>Kent Gorrell — </strong>The Power of Sub classes in Access VBA</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-02-07/">February 7, 2024</a>: <strong>Carlos Quintero</strong> — Features of MZ-Tools to make you more productive with VBA</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-03-06/">March 6, 2024</a>: <strong>Thomas Möller</strong> — Better Access Charts in the new Edge Browser Control</li><li><a href="https://jstreettech.com/access-day">March 15, 2024</a>: <strong>Access Day</strong> — one-day in-person Access Conference in Seattle, WA area <strong>(JUST ADDED)</strong></li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-04-03/">April 3, 2024</a>: <strong>Dale Fye — </strong>Working with Command Bars and the Access Shortcut Tool</li><li><a href="https://www.donkarl.com/devcon/">April 18–19, 2024</a>: <strong>Access DevCon Vienna</strong> — (<em>Online in Microsoft Teams</em>) Agenda to be announced</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-05-01/">May 1, 2024</a>: <strong>Colin Riddington</strong> — View &amp; Edit Import/Export (IMEX) Data Task Specifications</li></ul><p>‌</p><h4>Access Roadmap</h4><p><em>There were </em><strong><em>NO CHANGES</em></strong><em> to the roadmap between the last Week in Review (2023–12–16) and this one (2023–12–23).</em></p><p><em>The </em><a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months"><em>development priorities</em></a><em> were last updated at the German-language AEK conference on October 14, 2023.</em></p><p>Listed below is a snapshot of the <a href="https://www.microsoft.com/en-us/microsoft-365/roadmap?filters=Access">official Access Roadmap</a>.</p><p>“In Development”, “Rolling Out”, and “Launched” are Microsoft terms that I pulled straight from the public roadmap.</p><p>“Development Priorities” do not appear on the Access Roadmap. Instead, they get updated from time to time in official Access blog posts or Access engineering team presentations. I’ll include a link to the source of the current development priorities as they get updated.</p><h4>Development Priorities</h4><p>The items listed below reflect Microsoft’s order of priority and were published in the following article, <a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months"><em>Microsoft’s Plans for Access in the Next 6 Months</em></a>.</p><p>The items are listed in priority order according to Principal Engineering Manager Dale Rector. The “Expected Benefit” of each feature is shown in italics after the description of the feature itself.</p><p>New priorities added since the <a href="https://techcommunity.microsoft.com/t5/access-blog/our-road-ahead-microsoft-access-engineering-priorities-oct-2022/ba-p/3651894">previous set of priorities</a> are shown in bold below. Dropped priorities are struck through.</p><ol><li>Continued Focus on Monthly Issue Fixes: <em>(Monthly Issue Fix Blog) Improved product quality and reliability</em></li><li><strong>Access becomes Large Address Aware</strong>: <em>Removal of key customer error issue</em></li><li>Dataverse export improvements: <em>Make it easier and faster for admins to migrate their data to Dataverse</em></li><li><strong>Large monitor support for forms</strong>: <em>Improved support of Access on the latest hardware</em></li><li><strong>Modern Chart Improvements</strong>: <em>Expanded support for the most popular chart types and options</em></li><li><strong>SQL Editor Improvements</strong>: <em>Significantly improved SQL query editing experience</em></li><li>Inconsistent Database Error Fix</li></ol><p>Special thanks to Karl Donaubauer for posting the updated priorities at <a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months">AccessForever.org</a>.</p><h4>In Development</h4><ul><li>NOV 2023: Making 32-bit Access <a href="https://nolongerset.com/laa-flag/">Large Address Aware</a> (LAA)</li></ul><h4>Rolling Out</h4><p>None.</p><h4>Launched</h4><ul><li>APR 2023: Modern Web Browser Control</li><li>MAR 2023: New Modern Web Browser Form Control</li></ul><p>Originally published at <a href="https://nolongerset.com/week-in-review-2023-12-23/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=78a1c91323b1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Set the Background Color of the Microsoft Access Application Window with VBA]]></title>
            <link>https://medium.com/@NoLongerSet/how-to-set-the-background-color-of-the-microsoft-access-application-window-with-vba-87eb4db926a0?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/87eb4db926a0</guid>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[vba]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Sat, 23 Dec 2023 04:33:27 GMT</pubDate>
            <atom:updated>2023-12-23T04:33:27.674Z</atom:updated>
            <content:encoded><![CDATA[<h4>A series of Windows API calls will “repaint” the Microsoft Access canvas with the color of your choice. It is a bit rough around the edges, though…</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*O42GwVK6zaTiP3Ed.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p>Several years ago, I had a client ask me to change the application background color from its default gray.</p><p>As I recall, the application included a feature to switch the data source between current data and read-only archived data. She wanted the application background to change when viewing the archive data. To be clear, she was not asking to change the background color of the forms, but of the Access application window itself.</p><p>I spent more time than I care to admit trying and failing to make this work.</p><p>I searched online for a solution, but I came up empty-handed.</p><p>Many years later–with a deeper understanding of Windows API programming and the help of ChatGPT–I managed to write the surprisingly simple subroutine that eluded me back then: SetCanvasBgColor().</p><h4>The Access Canvas</h4><p>Known to some as the MDI (multi-document interface) client area, the <a href="https://nolongerset.com/getinneraccesshwnd/">Access canvas</a> is the space that surrounds forms and reports within the Access window.</p><p><a href="https://nolongerset.com/getinneraccesshwnd/">GetInnerAccessHwnd(): Retrieve the Window Handle to the Microsoft Access Canvas</a></p><p><a href="https://nolongerset.com/getinneraccesshwnd/">This function returns the window handle to the Microsoft Access “canvas”, the inner portion of the application window where forms and reports are drawn.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/566/0*qP1hwwNpYAVQS0-I.png" /></figure><p><a href="https://nolongerset.com/getinneraccesshwnd/">No Longer SetMike Wolfe</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*V87d9jcU0WnqgVTa.jpg" /></figure><p>It’s the area in teal in the screenshots below:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*OjqVVwMKFsGHCpyQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*KHY_QaUdYPBq31Y1.png" /></figure><p>In fact, I used the SetCanvasBgColor() function to create the effect in these screenshots.</p><h4>The Approach</h4><p>The SetCanvasBgColor() function leverages the Windows API to interact with the Access application at a level deeper than what&#39;s typically exposed through VBA.</p><p>By obtaining the window handle of the Access canvas, we can directly manipulate its properties. The function uses a series of API calls to create a solid brush with the desired color and then fills the canvas area with that color.</p><p>It’s a <a href="https://nolongerset.com/dont-write-clever-code/">clever workaround</a> to an otherwise static aspect of Access’s UI.</p><h4>The Algorithm</h4><p>Here’s a breakdown of the SetCanvasBgColor() function in plain English:</p><ol><li><strong>Obtain the Canvas Handle</strong>: Using the GetInnerAccessHwnd() function, we retrieve the handle to the Access canvas, which is the drawable area minus any docked elements like menus or toolbars.</li><li><strong>Get the Device Context</strong>: With the canvas handle, we call GetDC() to get the device context, which is necessary for any drawing operations.</li><li><strong>Create the Brush</strong>: We invoke CreateSolidBrush() with the color passed to the function to create a brush of the desired color.</li><li><strong>Determine the Area to Fill</strong>: The GetCanvas() function is called to get the coordinates of the canvas area.</li><li><strong>Fill the Area</strong>: We use FillRect() to fill the canvas area with the solid brush created earlier.</li><li><strong>Clean Up</strong>: Finally, we release the device context with ReleaseDC() to avoid resource leaks.</li></ol><h4>The Function</h4><p>Here is the SetCanvasBgColor() function on its own without its required dependencies:</p><pre>Sub SetCanvasBgColor(RgbColor As Long)<br>    Dim hWnd As LongPtr<br>    hWnd = GetInnerAccessHwnd<br><br>    Dim hdc As LongPtr<br>    hdc = GetDC(hWnd)<br>       <br>    Dim hBrush As LongPtr<br>    hBrush = CreateSolidBrush(RgbColor)<br>    <br>    Dim Rectangle As Rect<br>    Rectangle = GetCanvas<br>    <br>    FillRect hdc, Rectangle, hBrush<br><br>    ReleaseDC hWnd, hdc<br>End Sub</pre><h4>The Full Code</h4><p>The code below includes required helper functions that I’ve written about in the past:</p><ul><li><a href="https://nolongerset.com/getinneraccesshwnd/"><strong>GetInnerAccessHwnd()</strong></a></li><li><a href="https://nolongerset.com/getcanvas/"><strong>GetCanvas()</strong></a></li></ul><pre>Option Compare Database<br>Option Explicit<br><br>Private Type Rect<br>    Left As Long<br>    Top As Long<br>    Right As Long<br>    Bottom As Long<br>End Type<br><br>&#39; --== GetInnerAccessHwnd() declarations ==--<br>Private Declare PtrSafe Function apiFindWindowEx _<br>    Lib &quot;user32&quot; Alias &quot;FindWindowExA&quot; (ByVal hWnd1 As LongPtr, _<br>                                        ByVal hWnd2 As LongPtr, _<br>                                        ByVal lpsz1 As String, _<br>                                        ByVal lpsz2 As String) As LongPtr<br><br>Private Declare PtrSafe Function apiGetParent _<br>    Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As LongPtr) As LongPtr<br><br><br>&#39; --== GetCanvas() declarations ==--<br>Private Declare PtrSafe Function apiGetClientRect _<br>    Lib &quot;user32&quot; Alias &quot;GetClientRect&quot; (ByVal hWnd As LongPtr, _<br>                                        lpRect As Rect) As Long<br><br><br>&#39; --== SetCanvasBgColor() declarations ==--<br>Private Declare PtrSafe Function GetDC _<br>    Lib &quot;user32&quot; (ByVal hWnd As LongPtr) As LongPtr<br><br>Private Declare PtrSafe Function CreateSolidBrush _<br>    Lib &quot;gdi32&quot; (ByVal crColor As Long) As LongPtr<br>    <br>Private Declare PtrSafe Function FillRect _<br>    Lib &quot;user32&quot; (ByVal hdc As LongPtr, _<br>                  lpRect As Rect, _<br>                  ByVal hBrush As LongPtr) As Long<br>                  <br>Private Declare PtrSafe Function ReleaseDC _<br>    Lib &quot;user32&quot; (ByVal hWnd As LongPtr, _<br>                  ByVal hdc As LongPtr) As Long<br><br><br>&#39; ----------------------------------------------------------------<br>&#39; Procedure : SetCanvasBgColor<br>&#39; Date      : 12/12/2023<br>&#39; Author    : Mike Wolfe<br>&#39; Source    : https://nolongerset.com/setcanvasbgcolor/<br>&#39; Purpose   : Sets the background color of the Microsoft Access canvas.<br>&#39; Notes     - Background color reverts to default whenever a form<br>&#39;               or report is closed or moved on the screen.<br>&#39;           - Thus, this must be called in every form and report&#39;s<br>&#39;               unload and resize events (and even that is not enough<br>&#39;               because there is no form or report &quot;move&quot; event) OR<br>&#39;               it must be called on a Timer (which presents its own<br>&#39;               set of problems).<br>&#39;           - Use the RGB() function to create the value to be passed<br>&#39;               in the RgbColor argument.<br>&#39; Sample Usage (e.g., in hidden global form):<br>&#39;<br>&#39;   Private Sub Form_Timer()<br>&#39;       SetCanvasBgColor RGB(255, 0, 0)   &#39;Set canvas background to Red<br>&#39;   End Sub<br>&#39; ----------------------------------------------------------------<br>Sub SetCanvasBgColor(RgbColor As Long)<br>    Dim hWnd As LongPtr<br>    hWnd = GetInnerAccessHwnd<br><br>    &#39; Get the device context<br>    Dim hdc As LongPtr<br>    hdc = GetDC(hWnd)<br>       <br>    &#39; Create a solid brush<br>    Dim hBrush As LongPtr<br>    hBrush = CreateSolidBrush(RgbColor)<br>    <br>    &#39; Get the area to fill<br>    Dim Rectangle As Rect<br>    Rectangle = GetCanvas<br>    <br>    &#39; Fill the rectangle area with the brush<br>    FillRect hdc, Rectangle, hBrush<br><br>    &#39; Release the device context<br>    ReleaseDC hWnd, hdc<br>End Sub<br><br><br><br>&#39;---------------------------------------------------------------------------------------<br>&#39; Procedure : GetInnerAccessHwnd<br>&#39; Date      : 11/26/2014 - 12/12/2023<br>&#39; Author    : Mike Wolfe<br>&#39; Source    : https://nolongerset.com/getinneraccesshwnd/<br>&#39; Purpose   : Gets the window handle of the Access &quot;canvas&quot;.<br>&#39; Notes     - We don&#39;t use hWndAccessApp here because that&#39;s the window handle for the<br>&#39;               full application; what we really want is the handle for the &quot;inner container&quot;;<br>&#39;               i.e., the Access window minus the docked menus, docked toolbars, and status bar<br>&#39;---------------------------------------------------------------------------------------<br>&#39;<br>Function GetInnerAccessHwnd(Optional ByVal ChildHWnd As LongPtr = 0) As LongPtr<br>    <br>    GetInnerAccessHwnd = apiFindWindowEx(hWndAccessApp, ByVal 0&amp;, &quot;MDIClient&quot;, vbNullString)<br>    If GetInnerAccessHwnd &lt;&gt; 0 Then Exit Function<br><br>    On Error Resume Next<br>    If ChildHWnd = 0 Then ChildHWnd = Screen.ActiveForm.hWnd<br>    If ChildHWnd = 0 Then ChildHWnd = Screen.ActiveReport.hWnd<br>    If ChildHWnd = 0 Then ChildHWnd = Screen.ActiveDatasheet.hWnd<br>    GetInnerAccessHwnd = apiGetParent(ChildHWnd)<br>End Function<br><br>&#39;---------------------------------------------------------------------------------------<br>&#39; Procedure : GetCanvas<br>&#39; Date      : 11/18/2011 - 12/14/2023<br>&#39; Author    : Mike Wolfe<br>&#39; Source    : https://nolongerset.com/getcanvas/<br>&#39; Purpose   : Returns the Left, Top, Right, and Bottom coordinates of the Access canvas.<br>&#39; Notes     - Convenience function normally used in conjunction with other API calls.<br>&#39;---------------------------------------------------------------------------------------<br>&#39;<br>Function GetCanvas(Optional ByVal ChildHWnd As LongPtr) As Rect<br>    Dim CanvasHwnd As LongPtr<br>    CanvasHwnd = GetInnerAccessHwnd(ChildHWnd)<br>    apiGetClientRect CanvasHwnd, GetCanvas<br>End Function</pre><p>The code can be copied and pasted into a blank standard module for a fully-working solution that can be easily integrated into your projects.</p><h4>Some Very Important Caveats</h4><p>This function only <em>sets</em> a custom canvas background color; it does not <em>keep</em> a custom canvas background color. This has some important consequences.</p><h4>Works Best With “Overlapping Windows”</h4><p>Modern versions of Access provide two options for displaying document windows (i.e., forms and reports):</p><ul><li>Overlapping Windows</li><li>Tabbed Documents</li></ul><p>With “Tabbed Documents”, every open form and report completely covers the Access canvas. The only time you would see it is if there were no visible forms or reports at all (or every form/report was a popup). The code will still work with the “Tabbed Documents” option, it just won’t be of much practical value.</p><h4>Access Redraws Its Canvas…A LOT</h4><p>Every time Access “redraws” all or part of its canvas, the default background color is restored and you will have to call the</p><ul><li>Resizing a form will reset the entire canvas back to its default color</li><li>Restoring a minimized form will reset the entire canvas back to its default color</li><li>Moving or closing a form will restore the default color of the canvas background for any portion of the canvas that the form was previously covering</li></ul><p>There are three ways you can account for this:</p><ul><li>Intercept the <a href="https://learn.microsoft.com/en-us/windows/win32/gdi/wm-paint">WM_PAINT message</a> at the operating system level and call SetCanvasBgColor every time Access redraws the canvas (<em>that approach is WAY beyond the scope of this article</em>)</li><li>Add calls to SetCanvasBgColor in every form&#39;s Resize and Close events (<em>besides requiring a lot of code, this approach also does not account for a user moving a form without resizing it, as there is no Form_Move() event you can handle</em>)</li><li>Add a Timer event to an always-open form, such as a <a href="https://nolongerset.com/the-global-form/">hidden global form</a> and set the Timer to run at least once per second</li></ul><p>Of these approaches, the Timer event is the easiest to implement, but it comes with a couple of major caveats of its own.</p><h4>Timer Event Messes With the VBA Editor</h4><p>Every time the Timer executes during development, VBA performs a just-in-time compile of the project. One of the side effects of compiling is that <a href="https://stackoverflow.com/a/10900069/154439">trailing whitespace is trimmed</a> from all lines of code…including the one you may be editing. This happens regardless of the “Compile On Demand” and “Background Compile” settings in the VBE Options dialog.</p><p>So, if you take this approach, you’ll want to keep that form closed (or otherwise disable the Timer event) while you are writing code, or it will drive you absolutely <em>crazy</em>.</p><h4>Frequent Timer Events Can Hurt Performance</h4><p>For the best visual experience, you’ll want to set a pretty short timer (around 100ms or so). Unfortunately, the overhead of raising a VBA event that frequently could easily have a noticeable impact on your application’s performance.</p><p>In my original example, I would disable the timer and live with the default background color when the users were working with current data. Only when they switched to archived data would I enable the timer.</p><h4>Sample Usage</h4><p>Imagine you have a database application that needs to reflect your company’s branding, which includes a specific shade of blue as a background color. Here’s how you might use the SetCanvasBgColor() function in a hidden global form that&#39;s always open:</p><pre>Private Sub Form_Timer()<br>    SetCanvasBgColor RGB(0, 122, 204)   &#39; Set canvas background to Brand Blue<br>End Sub</pre><p>This form could have a timer event that periodically calls SetCanvasBgColor() to ensure that the canvas color remains consistent, even after other forms or reports are closed or moved. Be sure to set the form&#39;s <strong>Timer Interval</strong> property to a suitable number of milliseconds, such as 100 (to re-apply the background color every tenth of a second). To temporarily disable the timer, you can set the <strong>Timer Interval</strong> to zero.</p><h4>One Final Note of Caution</h4><p>Be sure to save your project often when working with this code, especially if you run it using a short timer.</p><p>Windows API calls in general will crash your application if you’re not careful, but API calls that deal with low-level drawing commands are especially finicky.</p><p>Furthermore, this code is brand new to me. Unlike many of the functions I post on this site–which have been in production use for a long time (and so have had lots of time to accumulate little bug fixes here and there), this is a very fresh function. There could easily be edge and corner cases that cause problems.</p><p>Your mileage may vary.</p><p>Acknowledgements</p><ul><li>Portions of this article’s body generated with the help of <a href="https://nolongerset.com/chatgpt-nls/">ChatGPT</a></li></ul><p>Originally published at <a href="https://nolongerset.com/setcanvasbgcolor/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=87eb4db926a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dropping `#If VBA7 Then` From API Declares]]></title>
            <link>https://medium.com/@NoLongerSet/dropping-if-vba7-then-from-api-declares-52ebc42d8cd2?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/52ebc42d8cd2</guid>
            <category><![CDATA[vba]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Fri, 22 Dec 2023 04:34:58 GMT</pubDate>
            <atom:updated>2023-12-22T04:34:58.153Z</atom:updated>
            <content:encoded><![CDATA[<h4>Plus, step-by-step instructions for restoring the `#If VBA7 Then` code construct if you still need to support Office 2007 or earlier.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ANNCQ506YAuZUMKL.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p>It is time.</p><p>From this point forward, I no longer feel obligated to include the #If VBA7 Then construct in my Windows API calls.</p><p>In other words, code on my site that used to look like this…</p><pre>#If VBA7 Then<br>    Private Declare PtrSafe Function apiGetParent _<br>        Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As LongPtr) As LongPtr<br>#Else<br>    Private Declare Function apiGetParent _<br>        Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As Long) As Long<br>#End If</pre><p>…will now look like this…</p><pre>Private Declare PtrSafe Function apiGetParent _<br>    Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As LongPtr) As LongPtr</pre><p>As I wrote in my <a href="https://nolongerset.com/32-64-bit-deep-dive/">32-bit vs. 64-bit VBA Deep Dive article</a>:</p><blockquote>Now that we’ve had two perpetual VBA7-supported versions of Office <em>reach end of life</em>, I feel comfortable dropping support for Office 2007 and earlier in both my applications and my writing.</blockquote><p><a href="https://nolongerset.com/32-64-bit-deep-dive/">32-bit vs. 64-bit VBA: Deep Dive</a></p><p><a href="https://nolongerset.com/32-64-bit-deep-dive/">A deep dive into the past, present, and future of the transition from 32-bit VBA to 64-bit VBA.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/566/0*XXkunVHkbyYikm3b.png" /></figure><p><a href="https://nolongerset.com/32-64-bit-deep-dive/">No Longer SetMike Wolfe</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Obj6BGIEYEhyRGzC.jpg" /></figure><h4>Here’s Why I’m Doing This Now</h4><ul><li>VBA7 has been available since Office 2010</li><li>Office 2007–the last version without VBA7–has been out of support since October 10, 2017</li><li>This makes it so I don’t have to choose between readability and compile-time type checks in my calling code (e.g.<em>, I can simply use</em> As LongPtr <em>instead of</em> As Variant <em>or</em> #If VBA7 Then As LongPtr #Else As Long #End If)</li><li>It’s simple to adapt PtrSafe API declares to run in Office 2007 and earlier</li></ul><p>That last point is the most important one for this blog.</p><p>I know all of <em>my applications</em> are running on Access 2010 or later. However, I am sure at least some of my readers have Access applications running on Access 2007 or earlier. If that’s you and you need to support those older versions of Access, read the next section for step-by-step instructions to convert my PtrSafe API declare lines to run in your version of Office.</p><h4>Adapting API Declares to Run in Office 2007 and Earlier</h4><p>As I <a href="https://nolongerset.com/32-64-bit-deep-dive/#converting-from-long-to-longptr">lamented</a> in my 32-bit vs. 64-bit VBA Deep Dive article, there is no simple algorithm to follow to convert 32-bit-only code to run under 64-bit VBA.</p><p>The main difficulty in moving from 32-bit-only API declares to 64-bit-compatible API declares was in identifying which Long parameters needed to be switched to LongPtr (i.e., which parameters represented memory pointers/object handles) and which should stay declared as Long (i.e., the arguments represented actual 32-bit signed integers). Figuring that out required using references such as the Win32_API.txt file, reading documentation for the API functions, or–in some extreme cases–finding and understanding the underlying C++ header files.</p><p>However, moving in the other direction <em>is</em> quite simple.</p><p>What’s more, if you follow the instructions below, your code <strong>will continue to run in 64-bit versions of VBA</strong> while also being backward-compatible with VBA6 versions of Office (2007 and earlier).</p><h4>Step-by-Step Instructions</h4><p>Here are the steps to migrate a VBA 7-only API declare to run in both 64-bit environments and Office versions 2007 and earlier (i.e., pre-VBA 7):</p><ol><li>Add the following line of code before your existing API declare: #If VBA7 Then</li><li>Add the following line of code after your existing API declare: #Else</li><li>Copy and paste your existing API declare to the line following the #Else</li><li>Delete the keyword PtrSafe from the copied line</li><li>Replace any instances of LongPtr with Long in the copied line</li><li>Add the following line of code after the copied line: #End If</li></ol><p>Here’s an example from a <a href="https://nolongerset.com/getinneraccesshwnd/">recent article</a>:</p><h4>Before</h4><p>The code below works in both 32-bit and 64-bit environments in Office 2010 and later:</p><pre>Private Declare PtrSafe Function apiGetParent _<br>    Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As LongPtr) As LongPtr</pre><h4>After</h4><p>The code below works in both 32-bit and 64-bit environments in Office 97 and later:</p><pre>#If VBA7 Then<br>    Private Declare PtrSafe Function apiGetParent _<br>        Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As LongPtr) As LongPtr<br>#Else<br>    Private Declare Function apiGetParent _<br>        Lib &quot;user32&quot; Alias &quot;GetParent&quot; (ByVal hWnd As Long) As Long<br>#End If</pre><h4>How Do You Know If You Need To Do This?</h4><p>The PtrSafe keyword was introduced in VBA 7, which debuted in Office 2010.</p><p>If you are running Office 2007 or earlier, this keyword does not exist yet and you will get the following error when trying to compile code that includes the keyword:</p><blockquote>Compile error:<br><br>Expected: Sub or Function</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/603/0*yFQUxP5wT1OcK2-w.png" /></figure><h4>Why Does Adding #If VBA7 Then Fix My Code?</h4><p>You may be wondering how adding the #If VBA7 Then line could make the compile error go away in these earlier versions of VBA.</p><p>How can a feature introduced in VBA7 (i.e., the VBA7 compiler constant), be recognized by earlier versions of the language? After all, isn&#39;t the original problem the fact that the PtrSafe keyword is not recognized by earlier versions?</p><p>The key difference is that PtrSafe is a <em>language keyword</em> while VBA7 is a <em>compiler constant</em>.</p><p>When VBA encounters a language keyword that it does not recognize, that triggers a compile error (technically, it’s a syntax error, since the keyword is not part of the language grammar).</p><p>However, when VBA encounters a compiler constant that it does not recognize, the compiler constant simply evaluates to False.</p><p>So, by introducing a compiler constant–VBA7–that evaluates to True in VBA 7 (<em>and later versions, on the unlikely chance that a VBA 8 ever gets released</em>), Microsoft provides a way for developers to &quot;hide&quot; new language features from older versions of the language.</p><p><em>Cover image generated with DALL-E-3</em></p><p>Originally published at <a href="https://nolongerset.com/dropping-if-vba7/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=52ebc42d8cd2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[FIXED: “You entered an expression that has no value.”]]></title>
            <link>https://medium.com/@NoLongerSet/fixed-you-entered-an-expression-that-has-no-value-c9af420b9d61?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/c9af420b9d61</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[vba]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Thu, 21 Dec 2023 04:58:26 GMT</pubDate>
            <atom:updated>2023-12-21T04:58:26.442Z</atom:updated>
            <content:encoded><![CDATA[<h4>“You entered an expression that has no value,” is a common Microsoft Access error message. Luckily, while the fix is not obvious, it is easy.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*eYTyPhwJC-BD_B4K.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p>Have you ever opened a form or report after making a minor change to a text box’s Control Source property and been greeted with the following error message?</p><blockquote>Run-time error ‘2427’: <br><br>You entered an expression that has no value.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/367/0*Bv8NLDHrZ_IUraXt.png" /></figure><p>The most likely reason for this error is that you’ve inadvertently created a circular reference in a text box’s Control Source.</p><h4>MCVE: Minimal Complete Verifiable Example</h4><p>The gold standard when trying to reproduce an error is to define a “minimal complete verifiable example” of the bug. Not all bugs lend themselves to an MCVE, but it should still be your goal as a developer to create one, if possible.</p><p>Here are the steps to generate an MCVE for this error message:</p><ol><li>Create a new blank database</li><li>On the <strong>Create</strong> tab, click [<strong>Form Design</strong>]</li><li>In the Form’s <strong>Record Source</strong> property enter MSysObjects (if necessary, press [Alt] + [Enter] to open the Property Sheet)</li><li>On the <strong>Form Design</strong> tab, click [<strong>Add Existing Fields</strong>]</li><li>Click and drag the <strong>DateCreate</strong> field from the Field List to the form’s Detail section</li><li>Switch to <strong>Form View</strong></li></ol><p>At this point you should see the DateCreate text box displaying the value from the first row of the <strong>MSysObjects</strong> table. Since you just created the database, the DateCreate value should be today’s date:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/252/0*Oze5IWcVZzVLVImf.png" /></figure><p>So far, so good. Now, let’s break it.</p><h4>Calling a Custom VBA Function</h4><p>To generate the error message, we need to call a custom VBA function. For simplicity’s sake, we’ll use my <a href="https://nolongerset.com/watch-this/"><strong>Watch()</strong> function</a>. It’s a debugging procedure that simply returns whatever value is passed to it.</p><pre>&#39;source: https://nolongerset.com/watch-this/<br>Function Watch(Val, Optional CalledFrom As String = &quot;&quot;)<br>    &#39;Debug.Assert Val &lt;&gt; &quot;Value to watch for&quot;<br>    &#39;Debug.Print Val, CalledFrom<br>    Watch = Val<br>End Function</pre><ol><li>Copy the above function and paste it into a new standard module</li><li>Switch the form back to <strong>Design View</strong></li><li>Change the <strong>Control Source</strong> of the <em>DateCreate</em><strong><em> </em></strong>text box from DateCreate to =Watch([DateCreate])</li><li>Switch the form to <strong>Form View</strong></li></ol><p>You should get the following error message:</p><figure><img alt="Run-time error &#39;2427&#39;: You entered an expression that has no value." src="https://cdn-images-1.medium.com/max/466/0*davbWoFploap_SCW.png" /></figure><p>What’s going on here?</p><h4>Circular Reference</h4><p>One of the annoying default behaviors of Access is that when you add a control to a form or report from the Field List window, it creates a text box whose Name and ControlSource are both set to the field name.</p><ul><li><strong>Name:</strong> DateCreate</li><li><strong>Control Source</strong>: DateCreate</li></ul><p>Everything is still OK at this point.</p><p>But what happens if we want to pass the field name to a custom VBA function?</p><ul><li><strong>Name: </strong>DateCreate</li><li><strong>Control Source:</strong> =Watch([DateCreate])</li></ul><p>The problem is that Microsoft Access automagically creates form object properties for every <em>control</em> and every <em>field</em> associated with the form. So, for our form, there is a DateCreate <em>control </em>and a DateCreate <em>field</em>. If a form has a control and field with the same name, the control property takes priority.</p><p>So, when the Access database engine’s <a href="https://nolongerset.com/expressions-vs-code/">expression service</a> evaluates =Watch([DateCreate]), the reference to [DateCreate] resolves to the DateCreate control <em>and not</em> the DateCreate field. This results in a circular reference: the function is infinitely recursive.</p><p>Theoretically, the expression service evaluates this:</p><p>=Watch([DateCreate])</p><p>As this:</p><p>=Watch(Watch([DateCreate]))</p><p>And then as this:</p><p>=Watch(Watch(Watch([DateCreate])))</p><p>Ad infinitum (or at least until it runs out of stack space).</p><p>In reality, the expression service likely looks for this situation and flags it as invalid without actually performing the recursive calculation.</p><p>In fact, newer versions of Access bring this error to the user’s attention by flagging it in Design View:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/352/0*4wm4hsrbnqbtbf_8.png" /></figure><p>Access also provides you with the two possible fixes:</p><ul><li>Edit Control Name</li><li>Edit the Control’s Control Source Property</li></ul><p>As well as showing you a “Help on This Error” option which brings you right to this page to explain what is going on.</p><p>Haha! Just kidding. Clicking on <strong>Help on This Error</strong> shows you this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/395/0*4tNMC9yfMqR_su0x.png" /></figure><p>That darn network connection! Somehow, the internet works fine <em>just before</em> and <em>just after</em> I try to use the Access Help.</p><h4>Fixing the Error</h4><p>As the context-sensitive error-flagging tooltip shows, there are two approaches to fixing the error. Note that these fixes also apply to older versions of Access, including those that do not automatically flag the error in Form Design View.</p><h4>Edit Control Name</h4><p>With this approach, we change the control name so that it doesn’t conflict with the field name.</p><p>For example, we could change the name of the control from CreateDate to tbCreateDate.</p><p>By doing that, we give unique names to two form properties that previously shared the same name:</p><ul><li>CreateDate: one of the fields in the form&#39;s Record Source</li><li>tbCreateDate: one of the text box controls on the form&#39;s Detail section</li></ul><p>Personally, this is the approach I use.</p><p>In fact, I don’t even wait for these kinds of errors to pop up. I proactively change the name of every control as I add it to my form, especially if I use the Field List to create the control.</p><p>I don’t use <a href="https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/">Systems Hungarian</a> in my code, but I have adopted a form of that naming convention for my form and report controls. I use the following prefixes for my controls:</p><ul><li>tb: Text box</li><li>cb: Combo box</li><li>lb: List box</li><li>lbl: Label</li><li>chk: Check box</li><li>btn: Command Button</li><li>rect: Rectangle</li><li>img: Image</li><li>og: Option Group</li><li>ob: Option Button</li><li>tc: Tab Control</li><li>sf: Sub Form</li><li>sr: Sub Report</li><li>tog: Toggle Button</li><li>web: Legacy Web Browser Control</li><li>edge: Modern Edge-based Browser Control</li><li>pb: Page Break</li><li>line: Line</li><li>ax: ActiveX</li></ul><h4>Edit the Control’s Control Source Property</h4><p>Honestly, this approach only makes sense if you’ve got a typo in your control source or you really are referring to the wrong thing. In the vast majority of cases, the best solution will be to simply rename the control as described above.</p><h4>Feature Request</h4><p>I would love to see the option to define control name prefixes by control type. This would have to be a user-configurable option, since different developers use different naming conventions (e.g., cmd is another common prefix for command buttons). This feature could be implemented in one of two ways:</p><h4>As an Access Option</h4><p>Go to <strong>File &gt; Options &gt; Object Designers &gt; Form/Report design view</strong>.</p><p>Under the “[_] Always use event procedures” option, add another checkbox that is unchecked by default, that says:</p><p>[_] Use control name prefixes [Define…]</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/0*3A5HN6lUQjI1G-NK.png" /></figure><p>The [Define…] button would be disabled unless the box was checked. Clicking on the enabled [Define…] button would open a form with a two-column list. The first column would have a header of “Prefix” and the second column would have a header of “Control Type.” “Prefix” would be a column of empty text boxes where the user could define prefixes for all the form and report control types which would be listed in the second column. Essentially it would look like my unordered list under the “Edit Control Name” section heading above.</p><h4>As a Default Control Property</h4><p>The other way to implement this feature would be to expose the <strong>Name</strong> property in the default control view of the Property Sheet.</p><p>For example, here’s what the “Other” tab looks like for an existing Label control:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/242/0*95lLlW7H_T9-_qhe.png" /></figure><p>And here’s what the “Other” tab looks like when we click on the Label control button in the ribbon’s Controls group and the Default Label control is active. The properties listed below are the only ones under the “Other” tab that can be set for a label control. “Name”, “Help Context Id”, and “Tag” cannot be given default values.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/242/0*cGurOJPBKF6WRnw-.png" /></figure><p>I propose that we add either a “Name Prefix” property (which would be a clearer name, but could be a problem because it’s not an existing control property) or expose the existing control “Name” property and treat its contents as though it were a “name prefix” property.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/242/0*yCTDYiJHGZuByOhv.png" /></figure><h4>Official Feature Request on the Feedback Portal</h4><p>I’ll be honest, I’m completely jaded by the whole <a href="https://nolongerset.com/access-feature-requests/">feature request</a> situation since my <a href="https://nolongerset.com/version-control-friendly-access-request/">top-ranked feature request</a> simply disappeared as part of the site’s automated cleanup process. (It appears Microsoft <a href="https://feedbackportal.microsoft.com/feedback/idea/a310c674-a9cd-ed11-a7c6-000d3a1f8608">added it back as a new request</a> about a year after they unceremoniously deleted it, but it lost an awful lot of ground over that time.)</p><p>If someone likes this idea enough to post it on the <a href="https://feedbackportal.microsoft.com/feedback/forum/818e3b49-e61b-ec11-b6e7-0022481f8472">feedback site</a>, I will gladly upvote it (throw a link in the comments below). As for me, I won’t be wasting the time to do it myself.</p><p>Originally published at <a href="https://nolongerset.com/fixed-expression-has-no-value/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c9af420b9d61" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Poe: My Tool of Choice for Exploring the World of LLMs]]></title>
            <link>https://medium.com/@NoLongerSet/poe-my-tool-of-choice-for-exploring-the-world-of-llms-35dc40dabe49?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/35dc40dabe49</guid>
            <category><![CDATA[vba]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Wed, 20 Dec 2023 05:33:39 GMT</pubDate>
            <atom:updated>2023-12-20T05:33:39.911Z</atom:updated>
            <content:encoded><![CDATA[<h4>With so many new and exciting LLMs and AI image generators, how do you pick just one? What if you didn’t have to?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pUcN2faHRH_8SYF-.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p>Over the past thirteen months–since the public release of ChatGPT on November 30, 2022–the AI ecosystem has exploded.</p><p>It seems like almost every day we have a new or updated LLM:</p><ul><li>ChatGPT 3.5</li><li>ChatGPT 4</li><li>Claude-instant-100k</li><li>Claude-2–100k</li><li>Llama-2–70b</li><li>Mixtral-8x-7B</li><li>Gemini-Pro</li></ul><p>Not to mention some popular image generation tools:</p><ul><li>DALL-E-2</li><li>DALL-E-3</li><li>Playground-v2</li><li>Stable-Diffusion-XL</li></ul><p>As vendors compete in the AI arms race, many of these tools are free to use–at least for preview purposes. To gain access to the newest and most powerful tools (or to avoid restrictive usage caps), you generally need to pay up.</p><p>With all these options, though, how do you know which one to invest in?</p><h4>Option E. All of the Above</h4><p>After playing around with the free version of ChatGPT for awhile, I realized that these tools were the future and that I needed to invest in learning how to use them to <a href="https://nolongerset.com/ai-embrace-or-eschew/">avoid falling behind</a>.</p><p>As companies raced to outdo each other, I didn’t want to bet on the wrong horse.</p><p>And then I learned about Poe.</p><p>The poe.com site itself doesn’t include much information about itself, so here’s a summary of <a href="https://en.wikipedia.org/wiki/Poe_(software)">the Poe service from Wikipedia</a>:</p><blockquote><strong>Poe</strong> (<strong>Platform for Open Exploration</strong>) is a service developed by <a href="https://en.wikipedia.org/wiki/Quora">Quora</a> and launched in December 2022. It allows users to ask questions and obtain answers from a range of AI <a href="https://en.wikipedia.org/wiki/Chatbot">bots</a> built on top of <a href="https://en.wikipedia.org/wiki/Large_language_models">large language models</a> (LLMs), including those from <a href="https://en.wikipedia.org/wiki/ChatGPT">ChatGPT</a> developer <a href="https://en.wikipedia.org/wiki/OpenAI">OpenAI</a>, and other companies like <a href="https://en.wikipedia.org/wiki/Anthropic">Anthropic</a>. It also has a subscription which allows users unlimited use for lightweight chatbot applications, such like <a href="https://en.wikipedia.org/wiki/ChatGPT">ChatGPT</a> and provides access, with certain limitations, to more complex and advanced artificial intelligence models such as like <a href="https://en.wikipedia.org/wiki/GPT-4">GPT-4</a> and Claude2.</blockquote><p>In other words, a subscription to Poe gives you access to <em>ALL</em> the most popular LLMs and image generators, including all the ones I listed above.</p><h4>Features of Poe</h4><p>Here are the top reasons I use Poe:</p><ul><li>Easy access to <a href="https://help.poe.com/hc/en-us/articles/19944206309524-Poe-FAQs#h_01HCFXCW5CVS013AJDGB9XSRTQ">several popular LLMs and AI image generators</a></li><li>Ability to <a href="https://help.poe.com/hc/en-us/articles/19944206309524-Poe-FAQs#h_01HCFXCW5C8AXFR7CGC1MRXY5R">create and save lightweight chatbots</a></li><li>Ability to upload certain file types (e.g., PDFs and Word documents) to provide context for chat conversations</li><li>Maintains a full history of previous conversations</li><li>The new “<a href="https://developer.poe.com/prompt-bots/how-to-create-a-prompt-bot#provide-a-prompt">Knowledge Base</a>” feature that adds support for lightweight retrieval augmented generation (RAG) benefits</li></ul><p><em>Cover image generated with DALL-E-3 (via Poe)</em></p><p>Originally published at <a href="https://nolongerset.com/poe/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35dc40dabe49" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[“AI Will Take My Job”: A Self-Fulfilling Prophecy]]></title>
            <link>https://medium.com/@NoLongerSet/ai-will-take-my-job-a-self-fulfilling-prophecy-523f0b33fb30?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/523f0b33fb30</guid>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[vba]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Tue, 19 Dec 2023 05:21:30 GMT</pubDate>
            <atom:updated>2023-12-19T05:21:30.859Z</atom:updated>
            <content:encoded><![CDATA[<h4>Whether you think AI is coming to *take* your job… Or you think AI will help you *be more productive* at your job… You’re probably right.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*huuHUzVOGoz0H6j9.jpg" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p>Here’s an old joke you’ve likely heard before in one form or another:</p><blockquote>A deeply religious man lived by the river. One day, heavy rain fell and the river started rising. As the water levels increased, a neighbor in a canoe paddled by and said to the man, “Quick, get in my canoe, the waters are rising!”<br><br>The man replied, “No, thank you. I have faith that God will save me.”<br><br>The water kept rising and now entered his first floor. A rescue team in a motorboat came by and one of the rescuers said, “Hurry up, get in! The water is still rising!”<br><br>Again, the man declined, “No need, I am waiting for God to save me.”<br><br>Eventually, the man had to climb up to his roof as the water level rose even higher. A helicopter flew over, and the pilot dropped down a ladder, shouting down to the man, “Grab the ladder, this is your last chance!”<br><br>For the third time, the man refused, shouting back, “I have faith! God will save me!”<br><br>Not long after, the waters overcame the house and the man drowned. Upon reaching heaven, the man had the chance to speak with God. He asked, “God, I had unwavering faith in you. Why did you not come to save me?”<br><br>And God replied, “What do you mean? I sent you a canoe, a motorboat, and a helicopter!”</blockquote><p>I’ve been thinking about this joke a lot lately as I’ve begun to notice that Access developers (and tech workers more generally) seem to fall into two main camps:</p><ul><li>Those who think AI is coming for our jobs and therefore resent it</li><li>Those who think AI is the next step forward in productivity and therefore embrace it</li></ul><p>My concern is that both camps could be correct about themselves.</p><p>Let’s explore.</p><h4>Embracing AI in Development: A Tale of Two Choices</h4><p>In the rapidly evolving world of software development, professionals stand at a crossroads shaped by the advent of Artificial Intelligence (AI).</p><p>As reflected in the opening parable, developers are currently presented with a defining moment in their professional journey. The unfolding narrative of AI in the tech industry isn’t just about new tools and technologies; it’s about recognizing the significance of adaptation and the willingness to leverage the resources at our disposal. Just as the man in the story faced a crucial decision amidst the rising floodwaters, developers too must decide their stance on the integration of AI into their work.</p><p>In a similar vein, today’s developers are faced with a choice that could determine the trajectory of their careers: to embrace AI or to reject it.</p><h4>The New Landscape of AI</h4><p>AI technologies, like ChatGPT, are the canoes, motorboats, and helicopters of our era.</p><p>They represent the tools and opportunities extended to developers to navigate the rising waters of industry demand and technological advancement. AI has the potential to automate tedious tasks, optimize workflows, and provide insights that were previously unattainable, thereby enhancing the productivity and creativity of those who wield it.</p><h4>The Choice to Embrace</h4><p>Developers who choose to embrace AI open themselves up to a world of possibilities.</p><p>These individuals will not only secure their relevance in the job market but also gain access to new and exciting opportunities. By leveraging AI, mundane aspects of programming can be streamlined, allowing developers to focus on more complex and innovative aspects of their projects.</p><p>The developers who see AI as a partner rather than a replacement are the ones who will become more productive, more competitive, and ultimately, thrive in the AI economy.</p><h4>The Choice to Eschew</h4><p>Conversely, those who choose to eschew AI, perhaps out of fear or a belief that it represents an existential threat to their jobs, risk falling behind.</p><p>By ignoring the ‘rescue boats’ of AI, these developers inadvertently decrease their productivity and competitive edge. In the fast-paced world of technology, stagnation can be akin to regression.</p><p>The refusal to adapt and the insistence on maintaining traditional methods in a transforming field can lead to obsolescence.</p><h4>The Self-Fulfilling Prophecy</h4><p>The story of the flood victim who shunned help is not just a cautionary tale about faith and rescue; it’s a lesson in the self-fulfilling nature of our beliefs and choices. In the context of AI and development, the prophecy is twofold:</p><p><strong>If you believe that AI is the end of your job and refuse to engage with it, you may very well find yourself out of work.</strong> Not because AI has usurped your position, but because the industry has moved toward those who can complement their skills with AI’s capabilities.</p><p><strong>If you believe that AI is a tool that can enhance your productivity and open new doors, you will be right.</strong> By incorporating AI into your skillset, you will find that it amplifies your abilities, makes you a more valuable asset to any team, and positions you at the forefront of innovation.</p><h4>Conclusion</h4><p>The moral for developers in this AI-driven age is clear: the future belongs to those who recognize and seize the assistance and opportunities AI provides.</p><p>Embracing AI doesn’t mean the end of your job; it means the enhancement of your job. It’s an invitation to grow, to improve, and to be part of the exciting evolution of technology.</p><p>As the waters of change continue to rise, the choice each developer makes — to embrace the rescue boats of AI or to refuse them — will shape their path forward in profound ways.</p><h4>Other Views</h4><p>A few other Access developers have explored the role of AI and how it might shape the future of software development.</p><h4>Richard Rost</h4><p>Recently reawarded Access MVP Richard Rost seems to be in the same metaphorical boat as me. He <a href="https://www.youtube.com/watch?v=YXkuLQQ57iM">explored this topic</a> recently on his YouTube channel:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FYXkuLQQ57iM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DYXkuLQQ57iM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FYXkuLQQ57iM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e7114aa3afa12f78c5931ddba70fdb0c/href">https://medium.com/media/e7114aa3afa12f78c5931ddba70fdb0c/href</a></iframe><h4>Rick Hanson (Pharos Technology)</h4><p>Dr. Richard Hanson took a slightly different approach, <a href="https://www.youtube.com/watch?v=-DZQTOscqxk">testing ChatGPT</a> to see how close it is to taking the job of an Access developer today (spoiler alert: your jobs are safe for now):</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F-DZQTOscqxk%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-DZQTOscqxk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F-DZQTOscqxk%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e38e8f63e09e1fb4e95e3f5e37958d9e/href">https://medium.com/media/e38e8f63e09e1fb4e95e3f5e37958d9e/href</a></iframe><h4>Daniel Pineault</h4><p>Longtime Access MVP Daniel Pineault is not a fan. He <a href="https://www.devhut.net/ai-chatgpt-and-this-blog/">takes particular issue</a> with the copyright implications of LLMs like ChatGPT:</p><p><a href="https://www.devhut.net/ai-chatgpt-and-this-blog/">AI, ChatGPT And This Blog | DEVelopers HUT</a></p><p><a href="https://www.devhut.net/ai-chatgpt-and-this-blog/">Why, for now, you will not see any AI/ChatGPT content on my blog or any other places I contribute,</a></p><p><a href="https://www.devhut.net/ai-chatgpt-and-this-blog/">DEVelopers HUTDaniel Pineault</a></p><h4>Karl Donaubauer</h4><p>Twenty-five-year (!) Access MVP Karl Donaubauer takes a more nuanced approach. Several months ago, Karl signed onto the open letter calling for a six-month pause of “<a href="https://futureoflife.org/open-letter/pause-giant-ai-experiments/">giant AI experiments</a>.” However, he announced his signing of that letter in the <a href="https://www.accessforever.org/post/the-first-ai-add-in-for-access">same article</a> in which he introduced the first commercial AI add-in developed for Microsoft Access, acknowledging that it would be naive to expect AI research to actually pause in any meaningful way.</p><p><a href="https://www.accessforever.org/post/the-first-ai-add-in-for-access">The first AI Add-In for Access</a></p><p><a href="https://www.accessforever.org/post/the-first-ai-add-in-for-access">AI here, there, anywhere. A third-party vendor offers the first comprehensive AI integration tool for Access.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/192/0*ClF7ksQhtWdgmea3.png" /></figure><p><a href="https://www.accessforever.org/post/the-first-ai-add-in-for-access">AccessForeverKarl Donaubauer</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/0*kEDIuO8JYo6NNpZ3.jpg" /></figure><p>Acknowledgements</p><ul><li><em>Portions of this article’s body generated with the help of </em><a href="https://nolongerset.com/chatgpt-nls/"><em>ChatGPT</em></a><em> (because of course 😉)</em></li><li><em>Cover image generated with DALL-E-3</em></li></ul><p>Originally published at <a href="https://nolongerset.com/ai-embrace-or-eschew/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=523f0b33fb30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[twinBASIC Update: December 17, 2023]]></title>
            <link>https://medium.com/@NoLongerSet/twinbasic-update-december-17-2023-81b5b21a276c?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/81b5b21a276c</guid>
            <category><![CDATA[microsoft-access]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[vba]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Sun, 17 Dec 2023 22:46:03 GMT</pubDate>
            <atom:updated>2023-12-17T22:46:03.567Z</atom:updated>
            <content:encoded><![CDATA[<h4>Highlights include a new twinBASIC project to allow easy input filtering of text boxes and the renaming of the tbShellLib project to reflect its expanded scope.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kM57XN5Ao__-7C9_.png" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><p><em>On April 23, 2021, I helped </em><a href="https://twitter.com/WaynePhillipsEA/"><em>Wayne Phillips</em></a><em> introduce the world to </em><a href="https://www.twinbasic.com/"><em>twinBASIC</em></a><em> at the </em><a href="https://www.donkarl.com/devcon/"><em>Access DevCon Vienna</em></a><em> conference. I </em><a href="https://nolongerset.com/devcon-2021/"><em>boldly predicted</em></a><em> that twinBASIC (along with the Monaco editor) would replace VBA and its outdated development environment by 2025. With that goal in mind, this weekly update is my attempt to keep the project fresh in the minds of the VBA development community.</em></p><p><em>Every Sunday, I will be providing updates on the status of the project, linking to new articles discussing twinBASIC, and generally trying to increase engagement with the project. If you come across items that should be included here, tweet me </em><a href="https://twitter.com/NoLongerSet"><em>@NoLongerSet</em></a><em> or email me at mike at nolongerset dot com.</em></p><p><em>Here are some links to get involved with the project:</em></p><ul><li><a href="https://nolongerset.com/how-to-install-twinbasic/"><strong><em>Custom twinBASIC IDE Installation Guide</em></strong></a></li><li><a href="https://github.com/WaynePhillipsEA/twinbasic/issues"><em>GitHub Issue Tracker (report bugs)</em></a></li><li><a href="https://discord.com/invite/UaW9GgKKuE"><em>twinBASIC Discord Server</em></a><em> (</em><a href="https://github.com/WaynePhillipsEA/twinbasic/discussions/629"><em>chat about the project</em></a><em>)</em></li><li><a href="https://www.linkedin.com/groups/14132101/"><em>twinBASIC/VBx LinkedIn Group</em></a></li></ul><h4>Highlights</h4><h4>Weekly Teaser</h4><p>Another week goes by without a new release of twinBASIC.</p><p>The extended delay <a href="https://discord.com/channels/927638153546829845/927638154192748606/1184810862112931940">has not gone unnoticed</a> to users like fafalone:</p><blockquote>it’s now been one full month since the last release. seems to be the longest gap ever. i know there’s huge improvements on the way but damn this is a rough wait 😵</blockquote><p>It would seem the delay is not due to a lack of interest from the development team, as <a href="https://discord.com/channels/927638153546829845/927638154192748606/1184818863309860894">Wayne responded</a>, simply:</p><blockquote>Trust me, it’ll be worth the wait.</blockquote><h4>Discord Chat Summary</h4><p>*<em> Auto-generated via Claude-2–100k on poe.com</em></p><p>Here is a summary of the key points from the General channel transcript for twinBASIC development over the past week:</p><ul><li>There was extensive discussion around potential funding models to support continued development of twinBASIC, with estimates around needing 100k Euros per year. Crowdfunding from the community was proposed as one option.</li><li>Work continues on the next major twinBASIC release, with the longest gap ever between releases now at 1 month. Hints were given that it will be worth the wait.</li><li>Features like PNG transparency in PictureBox, LLVM optimizations, and enums with non-Long types were discussed. The twinBASIC team is looking at implementing improvements in these areas.</li><li>Community members continue finding obscure bugs and edge cases, reporting them to help improve stability. The team acknowledges the next release will take time to stabilize.</li><li>Conversations around potentially open sourcing parts of the project continued, with suggestions like starting with the IDE source code to allow more community contributions.</li><li>Microsoft’s own specifications around things like COM enums appear to contradict how VB6 actually implemented them. The team is weighing being strictly standards compliant vs maximizing capabilities.</li></ul><p>Overall, progress continues towards the next major twinBASIC release that will bring many new capabilities, though it is taking longer than usual. The team remains committed to supporting the community and discussing ways to sustain project development long-term.</p><h4>Around the Web</h4><h4>LimitInputEdit: Easy Input Filtering for TextBoxes</h4><p>Another new twinBASIC project from fafalone is now <a href="https://github.com/fafalone/LimitInputEdit#readme">available on GitHub</a>:</p><blockquote>This is an updated, x64 compatible version of my VB6 demo of the shell32.dll API SHLimitInputEditWithFlags, an API entirely undocumented either by Microsoft or 3rd parties until my project. There are three versions of the project in this repository, LimitInputEditWithFlags.twinproj, a full twinBASIC version that uses Return and Handles syntax etc, and a universal compatibility version (VB6, VBA6, VBA7 32bit, VBA7 64bit, twinBASIC 32bit, twinBASIC 64bit) in both VB6 and twinBASIC form with identical code.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/503/0*WGu51wjIvZ9rw4jN.png" /></figure><h4>tbShellLib Being Rebranded as WinDevLib</h4><p>fafalone will be renaming his <a href="https://github.com/fafalone/tbShellLib#readme">tbShellLib project</a> to WinDevLib to better reflect the expanded scope of the project:</p><blockquote>I’m planning on renaming this project to <em>WinDevLib — Windows Development Library for twinBASIC</em>, to better reflect the purpose, since as it’s grown the original mission of shell programming has become only a part of it; the largest single part, but not even close to a majority anymore. Also a couple other significant changes, including redefining LARGE_INTEGER to QuadPart As LongLong instead of high/low Longs... this in accordance with how it&#39;s treated by the Windows API--- the C definition is a Union between both options, but this means it always triggers 8-byte alignment rules. Problems from not having that were rare in 32bit, but so common in 64bit it was previously relegated to legacy compatibility and all internal defs used QLARGE_INTEGER instead. But that&#39;s not a real Windows type. <br><br>I was hoping to hold off on this change until tB had union support, so the 8 byte alignment issue could be resolved without breaking compatibility with low/high Long usage. But with that pretty much ruled out as a 1.0 feature recently, I feel it&#39;s important to go ahead and make this change (and the name change) now before tB hits 1.0, since once tB is a stable product I think the same applies to major community projects around in beta. <br><br>So LARGE_INTEGER will now have .QuadPart only, and all QLARGE_INTEGER will be replaced with LARGE_INTEGER. Less impactful but still of note, SendMessage and PostMessage will now follow the same API standards as the rest of the project, pointing to SendMessageW and PostMessageW respectively, and using DeclareWide. This won&#39;t impact &gt;99% of usage, since using a String with DeclareWide is the same plain usage without conversion it&#39;s always been, but it&#39;s still worth noting. Both this and the other change are noted in [ Description ] attributes.<br><br>The existing versioning will be retained; the initial release will be 7.0.272. Compiler constants will be updated; e.g. WINDEVLIB_LITE instead of TB_SHELLLIB_LITE.<br><br>Let me know if there&#39;s any thoughts, comments, suggestions, questions, objections, or as always, coverage requests; it will still be a couple days before the new version is initially released.</blockquote><h4>Changelog</h4><p>Here are the updates from the past week. You can also find this information by visiting the GitHub <a href="https://github.com/WaynePhillipsEA/twinbasic/releases">twinBASIC Releases page</a>.</p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">Releases · WaynePhillipsEA/twinbasic</a></p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">Contribute to WaynePhillipsEA/twinbasic development by creating an account on GitHub.</a></p><p><a href="https://github.com/WaynePhillipsEA/twinbasic/releases">GitHubWaynePhillipsEA</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/0*5Oc2lw6-vRpqV8qh" /></figure><p><em>No new releases this week.</em></p><p>Originally published at <a href="https://nolongerset.com/twinbasic-update-december-17-2023/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=81b5b21a276c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Week in Review: December 16, 2023]]></title>
            <link>https://medium.com/@NoLongerSet/week-in-review-december-16-2023-9a21b9e256cf?source=rss-78acf5965d4c------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a21b9e256cf</guid>
            <category><![CDATA[vba]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[microsoft-access]]></category>
            <dc:creator><![CDATA[No Longer Set]]></dc:creator>
            <pubDate>Sun, 17 Dec 2023 02:46:58 GMT</pubDate>
            <atom:updated>2023-12-17T02:46:58.820Z</atom:updated>
            <content:encoded><![CDATA[<h4>Highlights include my recent talk on using classes with import/export specs, many 64-bit VBA guides, and a new release of Adam Waller’s version control add-in.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PNheboz5oJzAt1Kb.png" /></figure><p><em>By </em><a href="https://nolongerset.com/author/mike/"><em>Mike Wolfe</em></a><em> (connect on Twitter: </em><a href="https://twitter.com/@NoLongerSet"><em>@NoLongerSet</em></a><em>)</em></p><h4>Just Published</h4><p>This section includes videos, articles, and interesting discussions from the past 7 days.</p><h4>Articles</h4><ul><li><a href="https://www.accessforever.org/"><strong>Access Forever</strong></a></li><li><a href="https://www.accessforever.org/post/access-conferences-in-2024">Access Conferences in 2024</a>, <em>by Karl Donaubauer</em></li><li><a href="https://www.accessforever.org/post/1st-birthday-of-accessforever-org">1st Birthday of AccessForever.org</a>, <em>by Karl Donaubauer</em></li><li><strong>Jonathan Halder | Steven Halder</strong> (<a href="https://www.accessjumpstart.com/blog/">Access JumpStart 2.0</a>)</li><li><a href="https://www.accessjumpstart.com/commencing-tomato/">Commencing Tomato!</a></li><li><a href="https://www.accessjumpstart.com/the-process-of-daily-emails/">The process of daily emails</a></li><li><a href="https://www.accessjumpstart.com/tdd-013-pausing-to-re-evaluate-my-goals/">TDD — 013 — Pausing to re-evaluate my goals</a></li><li><a href="https://www.accessjumpstart.com/tdd-014-a-new-structure-beginning-to-congeal/">TDD — 014 — A new structure beginning to congeal</a></li><li><a href="https://www.accessjumpstart.com/tdd-015/">TDD — 015 — To Assert or Not To Assert</a></li><li><strong>Daniel Pineault</strong> (<a href="https://www.devhut.net/"><em>DEVelopers HUT</em></a>)</li><li><a href="https://www.devhut.net/microsoft-access-compact-and-repair/">Microsoft Access Compact and Repair</a></li><li><a href="https://www.devhut.net/microsoft-access-database-bloating-main-causes/">Microsoft Access Database Bloating Main Causes</a></li><li><strong>Colin Riddington</strong> (<a href="https://isladogs.co.uk/home/index.html"><em>Isladogs on Access</em></a>)</li><li><a href="https://isladogs.co.uk/32-64-future-plans/index.html">32 to 64-bit: My Future Plans</a></li><li><a href="https://isladogs.co.uk/email-tester/index.html">CDO EMail Tester</a> <em>(updated)</em></li><li><a href="https://isladogs.co.uk/exam-timer/index.html">Exam Timer</a> <em>(updated)</em></li><li><a href="https://isladogs.co.uk/aeu-22/index.html">AEU22: Streamline Import Specs with VBA Classes</a> <em>(updated)</em></li><li><a href="https://isladogs.co.uk/error-3611-refresh-links/index.html">FIXED: Error 3611 when refreshing links using code</a> <em>(updated)</em></li><li><a href="https://isladogs.co.uk/32-64-handle-procedures/index.html">32 to 64-bit: Manage Procedures</a></li><li><strong>Mike Wolfe</strong> (<a href="https://nolongerset.com"><em>NoLongerSet</em></a>)</li><li><a href="https://nolongerset.com/32-64-bit-deep-dive/">32-bit vs. 64-bit VBA: Deep Dive</a></li><li><a href="https://nolongerset.com/getcanvas/">GetCanvas(): Convenience Function for Working with Windows API Calls in Access</a></li><li><a href="https://nolongerset.com/centerform/">CenterForm(): Using the Windows API to Center Forms on the Access Canvas</a></li><li><a href="https://nolongerset.com/getinneraccesshwnd/">GetInnerAccessHwnd(): Retrieve the Window Handle to the Microsoft Access Canvas</a></li><li><a href="https://nolongerset.com/hwndaccessapp-return-type/">The Curious Case of the Return Type of the hWndAccessApp Method in 64-bit VBA</a></li></ul><h4>Videos‌</h4><ul><li><strong>Access User Group Recordings</strong> (<a href="https://www.youtube.com/@AccessUserGroups">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=VUEMv_05hws">AEU 22 — Streamline Your Import/Export Spec Workflow with VBA Classes</a> (51:32): <em>with Mike Wolfe</em></li><li><strong>Richard Rost</strong> (<a href="https://www.youtube.com/@599CD">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=BGdvZ1_09Is">Edge Browser Control</a> (23:35): <em>Using the New Edge Browser Control in Microsoft Access</em></li><li><a href="https://www.youtube.com/watch?v=YXkuLQQ57iM">AI Took Our Jobs!</a> (09:40): <em>AI Took Our Jobs! Thriving in the Age of AI Disruption. Adapt with Lifelong Learning!</em></li><li><a href="https://www.youtube.com/watch?v=nzwtlYqwaT4">Next Leap Year</a> (17:57): <em>How to Calculate the Next Leap Year Following a Given Year in Microsoft Access VBA</em></li><li><a href="https://www.youtube.com/watch?v=7oK0HIV8Ics">Too Few Parameters</a> (20:45): <em>How to Fix Run-Time Error 3061 Too Few Parameters in Microsoft Access VBA</em></li><li><a href="https://www.youtube.com/watch?v=VwRB6nj3Ijo">Recordsets</a> (20:48): <em>Understanding Recordsets in Microsoft Access VBA — a Beginner’s Guide</em></li><li><a href="https://www.youtube.com/watch?v=ypAYeJzXfyc">Access Custom MsgBox Builder</a> (05:49): <em>Microsoft Access Custom MsgBox Builder: Easy VBA Code Generator for Advanced Message Boxes</em></li><li><strong>Daniel Pineault</strong> (<a href="https://www.youtube.com/@DanielPineault">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=k9n8mrYhWhI">Microsoft Access — Database Bloating</a> (25:37)</li><li><a href="https://www.youtube.com/watch?v=kKW_5H0O3Ks">Microsoft Access — Compact and Repair</a> (17:19)</li><li><strong>Pharos Technology [Dr. Richard Hanson]</strong> (<a href="https://www.youtube.com/@PharosTechnology">YouTube channel</a>)</li><li><a href="https://www.youtube.com/watch?v=-DZQTOscqxk">Can AI replace Human Database Developers?</a> (16:19): <em>Can AI replace Human Database Developers?</em></li></ul><h4>Select Open Source Projects: New Releases</h4><ul><li><a href="https://github.com/joyfullservice/msaccess-vcs-addin#version-control-add-in-msaccess-vcs-addin"><strong>msaccess-vcs-addin</strong></a><strong>: </strong><a href="https://github.com/joyfullservice/msaccess-vcs-addin/releases/tag/v4.0.30-beta"><strong><em>v4.0.30-beta (dev branch)</em></strong></a></li></ul><h4>New to Me</h4><p>This section includes content I discovered this week that has been around for awhile.</p><p><em>Nothing new this week.</em></p><h4>Upcoming Access User Group Events</h4><p>NOTE: Only English-language user group meetings with scheduled guest speakers or topics are listed. For a complete list of upcoming events, visit the <a href="https://accessusergroups.org/calendar/">Access User Group event calendar</a>.</p><ul><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-01-03/">January 3, 2024</a>: <strong>Ramachandran (A.P.R.) Pillai</strong> — Streamlining the Form Module Code in the standalone Class Module</li><li><a href="https://accessusergroups.org/pacific/event/access-pacific-monthly-meeting-2024-01-04/">January 4, 2024</a>: <strong>Kent Gorrell — </strong>The Power of Sub classes in Access VBA</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-02-07/">February 7, 2024</a>: <strong>Carlos Quintero</strong> — Features of MZ-Tools to make you more productive with VBA</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-03-06/">March 6, 2024</a>: <strong>Thomas Möller</strong> — Better Access Charts in the new Edge Browser Control</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-04-03/">April 3, 2024</a>: <strong>Dale Fye — </strong>Working with Command Bars and the Access Shortcut Tool</li><li><a href="https://www.donkarl.com/devcon/">April 18–19, 2024</a>: <strong>Access DevCon Vienna</strong> — (<em>Online in Microsoft Teams</em>) Agenda to be announced</li><li><a href="https://accessusergroups.org/europe/event/access-europe-2024-05-01/">May 1, 2024</a>: <strong>Colin Riddington</strong> — View &amp; Edit Import/Export (IMEX) Data Task Specifications</li></ul><p>‌</p><h4>Access Roadmap</h4><p><em>There were </em><strong><em>NO CHANGES</em></strong><em> to the roadmap between the last Week in Review (2023–12–09) and this one (2023–12–16).</em></p><p><em>The </em><a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months"><em>development priorities</em></a><em> were last updated at the German-language AEK conference on October 14, 2023.</em></p><p>Listed below is a snapshot of the <a href="https://www.microsoft.com/en-us/microsoft-365/roadmap?filters=Access">official Access Roadmap</a>.</p><p>“In Development”, “Rolling Out”, and “Launched” are Microsoft terms that I pulled straight from the public roadmap.</p><p>“Development Priorities” do not appear on the Access Roadmap. Instead, they get updated from time to time in official Access blog posts or Access engineering team presentations. I’ll include a link to the source of the current development priorities as they get updated.</p><h4>Development Priorities</h4><p>The items listed below reflect Microsoft’s order of priority and were published in the following article, <a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months"><em>Microsoft’s Plans for Access in the Next 6 Months</em></a>.</p><p>The items are listed in priority order according to Principal Engineering Manager Dale Rector. The “Expected Benefit” of each feature is shown in italics after the description of the feature itself.</p><p>New priorities added since the <a href="https://techcommunity.microsoft.com/t5/access-blog/our-road-ahead-microsoft-access-engineering-priorities-oct-2022/ba-p/3651894">previous set of priorities</a> are shown in bold below. Dropped priorities are struck through.</p><ol><li>Continued Focus on Monthly Issue Fixes: <em>(Monthly Issue Fix Blog) Improved product quality and reliability</em></li><li><strong>Access becomes Large Address Aware</strong>: <em>Removal of key customer error issue</em></li><li>Dataverse export improvements: <em>Make it easier and faster for admins to migrate their data to Dataverse</em></li><li><strong>Large monitor support for forms</strong>: <em>Improved support of Access on the latest hardware</em></li><li><strong>Modern Chart Improvements</strong>: <em>Expanded support for the most popular chart types and options</em></li><li><strong>SQL Editor Improvements</strong>: <em>Significantly improved SQL query editing experience</em></li><li>Inconsistent Database Error Fix</li></ol><p>Special thanks to Karl Donaubauer for posting the updated priorities at <a href="https://www.accessforever.org/post/microsoft-s-plans-for-access-in-the-next-6-months">AccessForever.org</a>.</p><h4>In Development</h4><ul><li>NOV 2023: Making 32-bit Access <a href="https://nolongerset.com/laa-flag/">Large Address Aware</a> (LAA)</li></ul><h4>Rolling Out</h4><p>None.</p><h4>Launched</h4><ul><li>APR 2023: Modern Web Browser Control</li><li>MAR 2023: New Modern Web Browser Form Control</li></ul><p>Originally published at <a href="https://nolongerset.com/week-in-review-2023-12-16/?utm_campaign=zapier&amp;utm_source=medium&amp;utm_medium=social">NoLongerSet.com</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a21b9e256cf" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>