I think Ron's answer is correct regarding the practical Windows configuration change needed, but doesn't really talk much about why it has this effect.
Chr() converts byte values according to the system's currently selected "ANSI codepage", usually one of the Windows-125x codepages depending on region (e.g. cp1252 for Western, cp1257 for Baltic).
ChrW() instead takes Unicode BMP codepoints, which are two-byte values in the range 0..65535 and have the same mapping everywhere regardless of region.
The two functions only happen to match in the 0..127 range, because both Windows-125x and Unicode are based on the same 7-bit ASCII and define this range in exactly the same way. But beyond that range, they're indeed two different codepages.
The Windows-125x codepages used by Chr() are single-byte codepages covering the values 0..255 (minus the "control" range 0..31). That's why Chr(256) returns #VALUE! – it literally has no meaning for single-byte codepages, whereas ChrW(256) in Unicode is just ordinary U+0100 Ā.
So what's the actual reason the old Chr() stopped working?
As mentioned, Chr() uses a region-specific codepage which Windows calls the "ANSI codepage". The ANSI codepage is considered a legacy feature, kept around for compatibility with programs originally written for Windows 95/98 (which weren't Unicode-based).
(Many Windows APIs actually have two sets of nearly identical functions, one for "ANSI" and one for "Unicode", e.g. MessageBoxA() accepts text in the legacy ANSI-codepage while MessageBoxW() accepts text in Unicode. Similarly CreateFileA() vs CreateFileW(), etc.)
The big change in Windows 10 (i.e. the checkbox that Ron Rosenfeld shows in the other answer) is that the "ANSI" functions no longer use Windows-125x – they use UTF-8. The UTF-8 codepage is another way of working with Unicode codepoints, and it is not single-byte – it is variable-width, with a character being anywhere from 1 byte to 4 bytes.
The first 128 bytes of UTF-8 (0..127) still deliberately match ASCII, so you still get the same results as with Windows-125x. However, the other half (bytes 128..255) have a completely different meaning – they are used for multi-byte sequences, and have no meaning when used alone.
For example, é in UTF-8 is two bytes, 195 followed by 169. If you use Chr(195) + Chr(169), you should probably get an "é" back. But when either of them is used alone, that's an incomplete sequence; the UTF-8 decoder gives you an "�" because the single byte has no meaning by itself.
The reason why Microsoft added this new feature is that the "ANSI" functions are becoming less useful for compatibility with old software, whereas UTF-8 can be very useful for modern software that's ported from other operating systems (such as Linux), as those programs tend to use UTF-8 as the only codepage.
However, notably, ChrW() returns no character from 128 to 160 (€ to nonbreakable space), which I find rather peculiar
That's normal – as mentioned above, ChrW() uses Unicode mapping, and Unicode has no characters in this range.
Windows-1252 (Western) is based on the ISO 8859-1 codepage, with one difference: the original ISO 8859 reserves the values 128..159 (0x80..0x9F) for a second control characters range, which has no visible characters. However, Microsoft does in fact put additional graphical characters in this range, which is what you get when calling Chr(128) and so on.
The first two Unicode blocks, covering 0..255 in total (or rather U+0000..U+00FF), are also based on the ISO 8859-1 – therefore codepoints 128..159 aka U+0080..U+009F (part of Latin-1 Supplement block) contain the same invisible control characters.
The issue is only limited to my new PC and only to the Chr() function - if I use the ChrW() function, the results display correctly. I can use ChrW() for future, however I am rather unwilling to redo all the existing macros...
You should really be using ChrW().
Because it takes Unicode codepoints, it will always return the same result no matter what your Windows region settings are. It means your macros will continue to work for people who for some reason need their OS to be set to Cyrillic, or Baltic, or Greek, or Turkish.
(Old programs with embedded assumptions about regional settings have caused me and my coworkers a lot of headache, and I'm a bit vocal about this as a result. I strongly believe this nonsense should not continue into the 2020s – after all, Windows itself has already been Unicode-based for more than two decades.
We've had people's names mangled on official documents because of codepage mismatch. We've had to tell people to change their regional settings to something completely wrong for their language, just to make a legacy program work. We have a program which requires YYYY/MM/DD dates, and we have a program which requires YYYY-MM-DD dates, and we needed to find a way to run both on the same computer. Dealing with programmers who are rather unwilling to improve is not the slightest bit of fun.)
?AscW(Mid(theString,2,1))chcpfrom the command prompt. (Typecommandinto the windows search bar (below the start menu). Then type chcp after the prompt and see what returns.