社内のサーバにアクセスできなくなった。
他の端末にリモートデスクトップ接続して、その端末からは接続できるのに!
コントロール パネル > ユーザー アカウント > 資格情報マネージャー
で、
① 接続できなくなったサーバの資格情報を削除
② サーバに接続
として、解決。
何故私だけ・・・
ハブられているのかと思ったぜ。
社内のサーバにアクセスできなくなった。
他の端末にリモートデスクトップ接続して、その端末からは接続できるのに!
コントロール パネル > ユーザー アカウント > 資格情報マネージャー
で、
① 接続できなくなったサーバの資格情報を削除
② サーバに接続
として、解決。
何故私だけ・・・
ハブられているのかと思ったぜ。
あぁーーーーーーーーーーーーー
鬱陶しいわぁ
鬱陶って漢字、本当にうっとうしい感じでスキ
じゃなくて、
Windows11のエクスプローラーで右クリックすると出てくるポップアップメニュー
あれ、本当に鬱陶しい。
で、はなっから全部出てくるようにしたい
PowerShellを管理者権限で起動し、以下のコマンドを入力して、設定を追加
reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve
この設定を削除するときは
reg.exe delete “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}” /f
いずれも、Enterキー押下後に「この操作を正しく終了しました。」とメッセージが出ればOK。
あとはOSを再起動するだけ。
だそうだけど、はじめっからこんな設定すんな!
この間のAWS Summit Japanで動画見て、早速やってみた!
VisualStudio Codeに拡張機能「Amazon Q」を入れるのね、ハイハイ。
んで、AWS Builder IDが要るのね、ハイハイ持ってますよ。
ん、このWorkだけに使いたいんやけど、あぁ権限ないのね。
んじゃ、全体で。
適当に使ってみた
英語で答えてくれるぅぅ~~~
いや、日本語で答えてほしいねんけどさぁ~~~
どこからやったらええんかな?設定?
あらへんがな、言語設定。
とりあえず、CHATに入れてみた。
「日本語で答えて」
答えてくれた。日本語で!!
うれしい。あぁこんなことで喜びを感じるとは・・・
最近コーディングの確認に一番つかうのがChatGPT。
なんといったって、日本語で、
えぇ~とさ~、こんなフレームワークでaをやりたいんだよね、
でもさ、a’みたいなことはやりたくないんだよね~
どうしたらいいかなぁ~
みたいな感じで質問して、ちゃんとそれなりに答えてくれるんだもの。
挙句、とりまとめとかしてくれて。
SQL文書いたら設計書書いてくれるし、プログラムだって設計書書いてくれる。
こんな時代がやってきたのか!って話。
しかし、こんなやり方ばっかりだと、自分で考えるということをしなくなるのでは?という恐れもあり、Google検索もやってそこからサイトにアクセスして確認するということも、一応やっている。
やっていはいるのだが、最近の技術系のサイトというのは、もうとにかく広告!
開いたら広告
サイト上は、自社の広告、記事の合間に広告
スクロールするたびに広告!
最後に自社の広告再び!
って、もう何せ広告が多い。
そのうえ、
・まずはじめに、しょうもないAさんBさんのやりとり!みたいなのがあり、
・つぎに目次(アジェンダ)
・そうして、長々と本文
・やたらにでかいヘッダとフッタ
という、構成。
ついさっき、
偶数奇数の判定をどうやってやるのかを知りたくてのぞいたサイトは酷かった。
だって、a % 2 == 0 の1文で済む話なんだよ?
どうして、目次が要るのさ!!
アホすぎて、話にならんわ。
どうせなら、同じような判定で、こんな感じのものだったらこうするよ!っていうのを複数並べてくれりゃいいものを
宣伝して利益を得るためのことしか頭にないのか、記事は細分化されていくのだ。
AIのほうが賢くないか?
よけいな広告もださなければ、大したものでなければ、無料で対応してくれる。
そうやって、データというAIにとっての食糧をたくさん得ているわけだ。
そりゃ、人間淘汰されていくよね・・・
某QAサイトを眺めてまして、
まぁ上記のようなことをやりたいと質問している人がいて、
そもそも、DBなんだから、そんなことやる必要ないだろ?、とか逆だろ?とか
書いてあるのね。
いやいや、やりたいんだからしょうがないでしょ!!
って思うんですよ、私は。
と、質問者でもないのに、勝手に外野がイキリ立ってもしょうがないだけどさ。
で、なんとか簡単にできないものかって思って調べてたら、FIND_IN_SETというものが使えそうなんだね。
FIND_IN_SET
例えば、
SELECT FIND_IN_SET(‘a’, ‘a,c,d’)
とすると、1と返ってくる。
SELECT FIND_IN_SET(‘d’, ‘a,c,d’)
とすると、3と返ってくる。
んで、
SELECT FIND_IN_SET(‘e’, ‘a,c,d’)
とすると0って返ってくる。
つまりは、第1引数で設定したものが第2引数のどこにあるか、教えてくれるわけ。
で、このままだとアレなんで、これにマスタを紐づけてやるの。
cd |name
—————
egg |たまご
bacon |ベーコン
apple |りんご
cubet |キャベツ
という、sozai テーブルがあったとして、
これを使って、文字列 ’bacon,apple’ を縦にするのよ!
SELECT cd, name FROM sozai WHERE FIND_IN_SET(cd, 'bacon,apple') > 0
とすると、
cd |name
—————
bacon |ベーコン
apple |りんご
と、表示される!!
え、sozaiテーブルみたいなマスタテーブルないとダメじゃんって?
まぁ、そこはご愛敬ということで・・・
今日から1週間の日付をレコードにする(縦に並べる)ときは、
ha_sequenceを使えばいいということで、
まず、ライブラリをインストールしよう
INSTALL SONAME “ha_sequence”;
としたら、
そもそもlibフォルダに、そのライブラリがないよ?ってなった。
なけりゃMariaDBの公式ページから取って来いやぁ!みたいなことがかいてあるページを見て、
ほいほいと公式のをDLしなおしたけど、中見たらやっぱりなかった。
でも、なんか元々入っているぽかった。
なんじゃいな!
SELECT (CURRENT_DATE + INTERVAL (seq) DAY) AS target_date FROM seq_0_to_6;
とかでちゃんと出てきた。
seqが0,1,2…6になるということで、これは色々使えそうな予感。
【Version】
Laravel 11.9
Vue 3.4
vue-i18n 9.14
php 8.3
大変だったわ~
ChatGPTもいろんなページも見たけど、自分が作っているバージョンに当てはまるものがなくて。
Karnel.phpに設定して!って言われても、Karnel.phpないし。
vue-i18nのインストールについては他のサイトを参照。
結局公式サイトをちゃんとチェックしないとダメということですな。
参照URL:Vue I18n #Composition API
だいぶん端折って、関係のあるところだけメモしておく。
resources/js/app.js
import { createI18n } from "vue-i18n";
const i18n = createI18n({
locale: __locale,
legacy: false,
messages,
});
createInertiaApp({
title: (title) => `${title} - ${appName}`,
resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')),
setup({ el, App, props, plugin }) {
return createApp({ render: () => h(App, props) })
.use(i18n)
....
resources/js/Pages/***.vue
<script setup>
import { computed, watchEffect } from 'vue';
import { useI18n } from 'vue-i18n';
// 多言語変換の関数名をtとして設定
const { locale: i18nLocale, t } = useI18n();
watchEffect(() => {
i18nLocale.value = *****; // ←ここに今利用すべき言語('ja','en',....を設定)
});
// メソッド内で使うとき
const msg = computed(() => t('load')); // computedで変換してから利用
console.log(msg);
</script>
<!-- タグ内で使うとき -->
<template>
<span>{{ t('load') }}</span>
</template>
今のバージョンだと、$tでなくて、tになってる。
alertとかで使うときは、computedで変換してから利用しないとエラーになる。
他のページにある、this.$t(‘***’)とかでエラーになったので困っていたけど、
これで何とか多言語対応もいけそうな気がする。
こんなんで解除できるパスワードって、なんのためについているのやら・・・
と思ったりするが、まぁパスワード忘れたときは非常にありがたいのだ。
参考URL
ホームページ制作のサカエン「Excel VBA マクロ パスワードを解除する方法 32ビット 64ビット」
ここからは64bit版だけ転載
(LongPtrをLongに、PtrSafeを削除すれば32bit版になる)
——————————-
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr
Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
GetPtr = Value
End Function
Private Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As LongPtr
Dim OriginProtect As LongPtr
Hook = False
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
p = GetPtr(AddressOf MyDialogBoxParam)
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
Flag = True
Hook = True
End If
End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function
Public Sub VBAProjectパスワード解除()
If Hook Then
MsgBox "VBAProjectのパスワード解除成功!", vbInformation, "Congratulations"
End If
End Sub
リンクテーブルをローカルテーブルに変換したい!VBAで!!
と、色々調べてみたのだが、
同じようなことをしたいという質問に、
「エクスポートしたら?」とか、「手作業でできるよね?」
とか、そういう話ばっかりで、
「いやいや、質問者の意図わかってんの?」
って回答しかなくってウンザリ。
で、苦手な英語、といってもカタコト英語だが、
convert linktable to localtable
みたいな感じで調べてみたら、外国人はちゃんとVBAでの解決策を答えてくれていた。
で、回答。
DoCmd.SelectObject acTable, "TABLE1", True DoCmd.RunCommand acCmdConvertLinkedTableToLocal
“TABLE1” のところを変換したいリンクテーブル名にしてやる。
これ調べるのに半日かかったわ。
でも、もう最悪、テーブルを別ファイルにエクスポートしてからインポートしようかとさえ思っていたので、本当に助かった。
やっぱり、いろんな言語ができたほうがいいのね。
(日本語しかできません。ってか、日本語もできません。)
参考URL:
https://stackoverflow.com/questions/59038993/access-vba-convert-linked-table-to-local
いつも忘れるのでメモ。
Oracleのアカウントがあれば、以下のサイトから
いろんなバージョンのOracleやOracleClientを取得できる。
(開発だけしかしないなら使えるらしい)
Oracle Software Delivery Cloud
https://edelivery.oracle.com/osdc/faces/SoftwareDelivery
「sample」シートにパスワード「****」でロックをかける
ただし、グループ開閉はさせたいとき、EnableOutliningをTrueにしておく
With Thisworkbook.Worksheets("sample")
.EnableOutlining = True
.Protect Password:="****", UserInterfaceOnly:=True
End With
VMで仮想サーバ(Windows Server2019)を構築しているのだが、そのせいでHyper-Vのインストールがうまくいかない。
で、色々調べて試してムリそうだったんだが、YouTubeで外国人の人が何かやっているのを見て試してみることにした。
guestOS = "winhyperv"
末尾に下記1行追加
CPUID.V0 = "FALSE"
そもそもなんでWindowsServerにDockerを入れようとしているのか、自分でもよく分からなくなって、もう
勉強のため!
みたいなモードに入っている。
PowerShellで docker version と打ったとき、ClientとServerの情報が見られるのだが、
C:\Program Files\Docker\config\daemon.json
に、
{
"experimental": true
}
を入れてみてもServer側のExperimental: がfalseになってしまうので、どうしたものかと思って
C:\ProgramData\docker\configのフォルダに同じdaemon.jsonを入れてサーバ再起動してみたら、
Server: Mirantis Container Runtime Engine: Version: 20.10.9 API version: 1.41 (minimum version 1.24) Go version: go1.16.12m2 Git commit: 9b96ce992b Built: 12/21/2021 21:33:06 OS/Arch: windows/amd64 Experimental: true
とうまくいきやした!
Access起動時にパラメータを引き渡し、
渡されたパラメータによって処理をかえる方法。
起動スイッチというのがあるらしい。
参照:Microsoft Office 製品のコマンド ライン スイッチ
ということで
"C:¥.........¥MSACCESS.EXE" "......accdb" /cmd "para1" "para2" "para3" ...
順に
Accessのexe 起動するAccessファイル /cmd パラメータ(必要分)
をそれぞれダブルクォーテーションで括って設定するのが重要らしい。
そして、Access側のVBAはこの引数を引き取って処理を行う。
Command関数
参照:Microsoft Support Command関数
このようにパラメータで渡された文字列は、AutoExecマクロ内で処理をすることにする。
ex) RunProc() ← 必ず()をつける
標準モジュールを追加して、2.のマクロで実行させるFunctionプロシージャを追加する
ex) Function RunProc() …. End Function
Functionでないとダメで、SubだとCommandを認識しなかった。
Function RunProc()
' Trimを忘れずに.これはパラメータが複数の時なので1つしかない時は、Trim(Command())でOK
Dim cmd() As String
cmd = Split(Trim(Command()), " ")
' 1つめの引数で処理を分岐
Select Case cmd(0)
Case "para1"
' ここに処理
Case "paraX"
' ここに処理
Case Else
' ここに処理
End Select
End Function
<注意点>
Command関数の結果は必ずTrimすること。起動コマンドで””で括っているが後ろにスペースが入って渡ってくる。
起動コマンドで最初にexeを指定したくない、ランタイム起動でも問題ない、という場合は、
"......accdb" /runtime /cmd "para1" "para2" "para3" ...
と、/runtimeを挟むと、exeの指定をせずにCommandが引き渡され、処理が走る。
んで、次。
もう1つ別のやり方があるのだが、それは /x スイッチ。
"......accdb" /runtime /x "macro1" /cmd "para1" "para2" "para3" ...
という感じにすると、
/x の後ろに入れたマクロ「macro1」を実行させられるようになる。
で、さっきと同じくプロシージャの実行をマクロに追加して、実行させるFunctionプロシージャを指定する。
VBA側は下記のようにしてパラメータを読み込んでおけばいい。
Function RunMacro1()
Dim cmd() As String
cmd = Split(Trim(Command()), " ")
' ここに処理
End Function
このやり方だと、わざわざ分岐処理を書く必要がないので、見た目が良いかなと思ったりする。
さて、最後。
起動コマンドからランタイム実行(/runtime 付)させたときに、AutoExecは走らせたくないなぁって思ったら、
AutoExecで動くFunction(またはSub)内の先頭に、こういう1文を先頭に入れておくといい。
If SysCmd(acSysCmdRuntime) Then Exit Function
普通に起動させたときは後続処理が走るが、ランタイム起動させたときはプロシージャを抜けるようにしておくこともできるわけだ。
奥が深いぜ、Accessさんよぉ
※ランタイム:Accessから開発機能(フォーム、クエリ、レポート、VBAの作成編集機能)を除いたもの
WHERE update_date BETWEEN 20200101 AND 20200131
とか書いて、ちゃんとupdate_dateが2020/1/1~1/31のデータを取ってきちゃってる。
どういうこったぁ!!!と調べたら、
“BOKU”のITな日常 『日付リテラルで日付の比較はしないほうがよさそうだ/MariaDB(MySQL)(備忘)』
という記事の中に
A DATE literal can also be an integer, in one of the following formats: YYYYMMDD or YYMMDD.
DATEリテラルは、YYYYMMDDまたはYYMMDDのいずれかの形式の整数でもかまいません。
という文章が。
MySQL
MySQL Docs『9.1.3 Date and Time Literals』
Maria
MariaDB Docs 『Date and Time Literals』
に同文がある。
ぬおぉぉぉ!スッゴ!
でも、なんか気色悪い・・・
んで、この引用記事の日付リテラルでの比較の話でうまく動かない理由は、
select case when '2018-09-01' > '2018-08-31' then 0 else 1 end;
というSQL文だと、単純に左辺側の’2018-09-01’が文字型扱いになっていることだけで、
select case when CONVERT('2018-09-01',DATE) > '2018-08-31' then 0 else 1 end;
としてやれば、解決する。
比較の対象が文字型として認識されているから、日付リテラル云々の話ではなくなっていて、
左辺が日付型と判断されれば、日付リテラルが利用できると推測する。
理解が不十分だとこういうことになるので注意が必要だが、ちゃんと基本に則り型定義通りに比較すればいいだけの話なのだよ。
WordPressにもサイトヘルス機能が入ったのだね。
う~ん、しかし対応できるものがない・・・
Wordpressとは別にPHPで簡易的なシステムを入れているのだが、そっちの対応をしなきゃいけない。
時間がない、というよりやる気が起きないので未だそのまま放置状態にしているのだが、そろそろ本当にあきません!となりそう。
さて、MySQLでのExport、ダンプの件。
dumpでエラーが起きたから調べた。
cd /d “c:\Program Files\MySQL\MySQL Workbench 8.0 CE”
でパス(場所は端末差あり)を切り替えてから、
mysqldump -u [user_id] -h [HOST IP-Address] -p [DB-name] > [output-filename]
パスワードを聞かれる→入力
mysqldump: … Unknown table ‘COLUMN_STATISTICS’ in information_schema (1109)
とエラーが出る。
<原因・対策>
モヒカンメモ『mysqldumpコマンドで “Unknown table ‘COLUMN_STATISTICS’ in information_schema (1109)” と怒られる原因と対策』
に、わかりやすく整理されて書かれているので省略するが、要はダンプexeとDBバージョン違いで発生。
書かれてある通り、オプション追加で、再実行。
mysqldump –skip-column-statistics -u [user_id] -h [HOST IP-Address] -p [DB-name] > [output-filename]
今度は成功。
Accessで住所支援入力というのがあるが、プロパティで設定せずにロジックで行うにはどうしたらよいかという問題への対応策。
使うのは住所支援入力で使っているライブラリと同じもの(だとは思う)。MsYubin7.dll。
3つのテキストボックスPrefText、CityText、TownTextに、都道府県、市区町村、町域をそれぞれ設定する前提で。
まず呼出元。
Dim res() As String
ConvZip2arrAddr("1600005",res)
PrefText = res(0)
CityText = res(1)
TownText = res(2)
まず呼出先。これは別モジュールを作成して記載しておけばいい。
Private Declare PtrSafe Function zcGetZipDecision Lib "MSYubin7.dll" Alias "GetZipDecision" _
(ByVal ZipCode As String, _
ByVal szKen As String, _
ByVal szCty1 As String, _
ByVal szCty2 As String, _
ByVal szTwn As String, _
ByVal szTwnExt As String) As Long
Public Sub ConvZip2arrAddr(ByRef zipCd As String, arrAddr() As String)
Dim pref As String * 40
Dim city1 As String * 40
Dim city2 As String * 40
Dim town1 As String * 40
Dim town2 As String * 500
Dim arrRet(4) As String
On Error GoTo ErrFunc
If zipCd = vbNullString Then Exit Sub
If Len(zipCd) <> 7 Then Exit Sub
If Val(zipCd) Then
zcGetZipDecision zipCd, pref, city1, city2, town1, town2
arrRet(0) = Left$(pref, InStr(pref, vbNullChar) - 1)
arrRet(1) = Left$(city1, InStr(city1, vbNullChar) - 1)
arrRet(2) = Left$(city2, InStr(city2, vbNullChar) - 1)
arrRet(3) = Left$(town1, InStr(town1, vbNullChar) - 1)
arrRet(4) = Left$(town2, InStr(town2, vbNullChar) - 1)
ReDim arrAddr(0 To 2)
arrAddr(0) = arrRet(0)
arrAddr(1) = arrRet(1) & arrRet(2)
arrAddr(2) = arrRet(3) & arrRet(4)
End If
Exit Sub
ErrFunc:
Debug.Print "No." & Err.Number & ":" & Err.Description
End Sub
Access2019で試したが、他のバージョンでもそれほど違いはないと思う。
VBAの例外処理の話。
JavaやC#とかだと、Try-CatchのCatchの中でのエラーについては、Catch内にさらにTry-Catchを入れるという手法を取ると思うのだけれど、VBAになると、少々めんどくさい。いやかなりめんどくさい話になる。
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~『VBA|エラー処理を2回目以降も処理できる方法』
この記事でいくと、VBAの例外処理(On Error文)で気をつけておかなければならないことがあるようだが、
端的に言えば、下の2つのことを考慮するとよいということになる。
というので実践編。
Sub Sample1
On Error Goto ErrLabel1
*** エラー発生(1) ***
Exit Sub
ErrLabel1:
MsgBox "No." & Err.Number & Err.Description , "Error"
Resume ErrLabel2 '←←←←ココで仕切り直し!!
ErrLabel2:
On Error Resume Next
*** エラー発生(2) ***
End Sub
まずは「On Error Goto ErrLabel1」で例外処理へスキップする処理を入れる。
エラー発生(1)の箇所でエラーが発生すると、ErrLabel1ラベルに飛ぶ。
エラーを表示させた後の「Resume ErrLabel2」というところが仕切り直しの箇所。
なので、Errをウォッチすると、「Resume ErrLabel2」の箇所ではエラーNoが設定されているが、ErrLabel2ラベル下の「On Error Resume Next」の行になると、エラーはクリアされている。
よって、ErrLabel2以降で、再度トラップ可能なOn Error文を指定してあげればよい。
(ここではResume
Nextにしているので、エラーがあると次行へ進むようになっている)
因みに、こういうことをやらずにErr.Clearとかしてみたらどうなるのか試したのだが、これだと2つ目のエラーはトラップされなかった。
んじゃぁ、Resumeじゃなくて、Gotoだったら?とやってみたが、この場合はErrにそのままエラー情報が残った状態で、ErrLabel2に飛んでいた。
なので、「Resume ラベル名」
面倒だがこういう手を使わなければならない。
AccessではAutoExecなどという起動時に走らせるマクロがある。
ExcelならばAuto_Openなどというプロシージャで昔は作っていたようだ。(今だとThisWorkbook_Openとかだろうか)
Accessファイルを起動するとき、このマクロを起動させたくなければ、一旦Shiftキーを押しながらファイルを開くのだが、これをVBAで実施したいときどうすればよいのだろうか・・・
Excelファイルを開くときは、
Excel.Application.EnableEvents = False
とすればよいのだが、Access.Applicationにはそのようなプロパティがない。
というので、前にちらっとSendKeyでShiftキーを押して起動しているコードを見たこともあり、同じようなものを作ってみることにした。
ただ、SendKeyはちょっと嫌なのでSendInputというAPIを使った方法にすることにした。(どっちも嫌だけど)
まずはTypeの定義
Private Type KEYBDINPUT
VK As Integer
Scan As Integer
Flags As Long
Time As Long
ExtraInfo As Long
Dummy1 As Long
Dummy2 As Long
End Type
Private Type INPUT_TYPE
IType As Long
KI As KEYBDINPUT
End Type
WinAPIの定義(64bitの場合PtrSafeをお忘れなく)
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As INPUT_TYPE, ByVal cbsize As Long) As Long
利用する定数の定義
Private Const VK_SHIFT As Long = &H10 'Shiftキー Private Const KEYEVENTF_KEYUP As Integer = &H2 'KeyUp(KeyDownのほうは0) Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1 '拡張コード Private Const INPUT_KEYBOARD As Integer = 1 'KeyboardイベントでSendInputを利用する
ここまでで定義が済んだので、Accessファイル起動処理を書いていく。
SendInputについての情報は以下の通り。
Dim ac As Object
set ac = CreateObject("Access.Application")
Dim it(0) As INPUT_TYPE
'Shiftキー押下
With it(0)
.IType = INPUT_KEYBOARD
.KI.Vk = VK_SHIFT
.KI.Scan = 0
.KI.Flags = KEYEVENTF_EXTENDEDKEY Or 0 'DOWN
.KI.Time = 0
.KI.ExtraInfo = 0
End With
SendInput 1, it(0), Len(it(0))
'Accessファイルを開く
ac.OpenCurrentDatabase {起動するファイル名}, True, {パスワード}
'Shiftキー押下の戻し
it(0).KI.Flags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP 'UP
SendInput 1, it(0), Len(it(0))
最終的にAccessを閉じて処理終了
ac.Quit acQuitSaveNone
フラグを渡すのに「KEYEVENTF_EXTENDEDKEY Or 」というのをつけないと、反映されなかった。
ここに手間取り結構時間がかかったのと、あとはとにかく「こんなことやりたいねん!」って検索しても出てこない、っていうところで時間がかかった。
VBA Access Autoexec 無効 とかキーにしても、Shiftキー押しながら起動すればいいよ!としか出なくて腹立つぅ~~~!!
って思ってしまった。検索能力ってIT技術の1つだなぁ~とつくづく実感。
参考URL
VBレスキュー(花ちゃん) 『3.SendInput 関数を使ってプログラム上からキーボードを操作する(12_Key_03)』
JavaScriptでファイル選択する処理のなかにファイルタイプまで確認する処理が入っているものがあって、
それが災いして、新しいChromeのバージョン100.**でファイルが選択できなくなってしまった。
MIMEタイプとかいうらしいが、
File.type – Web API | MDN
CSVファイルは、
Chromeのバージョンが99.***までだと「application/vnd.ms-excel」になっていた。
ところが、バージョン100になったとたん、「text/csv」になり、
「application/vnd.ms-excel」でタイプを確認していた箇所は軒並み不具合を起こすこととなった。
ちなみにIE11で同じCSVファイルを選択してみたところ、「application/vnd.ms-excel」になり、
Edgeだと「text/csv」という結果になった。
m.o.b windows での csv アップロード
というサイトではExcelが入っているかどうかで決まるっぽいことを書いてあるのだが、
今回はすべてExcel2019が入っているPCで、同じサイトを確認したので、違うような感じがする。
そして、こんなサイトを見つけた。
Qiita CSVファイルのMIMEタイプが環境によって異なる
「application/octet-stream」って・・・
ただでさえ、バージョン3桁行きました!問題があるのに、こういうのやめてほしいんですけど・・・
(ってか、なんで、MIMEタイプまでチェックしてんだ?)