ネムリヤモリ

ツイッターの鍵の向こうに置いておきたいものを書きます

Excel・Access・Word、VBAで困ったことをまとめたメモ

【スポンサーリンク】


f:id:teali_s:20210901071943p:plain

Twitterに内容と解決をぶん投げ続けていたものが溜まってきたのでまとめました。
1つの記事にできそうなものは個別記事に、できなさそうな短いものはここに追加していく予定です。


Excel

画像を貼り付けたシートを他のブックにコピーすると印刷時だけサイズが変化する

『サイズ変更を行った画像が存在するシート』を他のブックにコピーした時、コピー先で発生。(その時はシートをコピーして新規ブック作成だったはず)
図のサイズの数値はコピー元と変わっていないのに、印刷プレビューを比較すると明らかに違う大きさになっている。
図のリセットをして再度同じサイズに変更してもやっぱり同じ大きさにならず、シートを元のブックに戻しても変化した画像が元に戻ることはない。

解決

画像のプロパティの「セルに合わせて移動やサイズ変更をしない」を選択することで元のブックと同じサイズになる。
(元々の設定が「セルに合わせて移動するがサイズ変更はしない」だからサイズ変わるのがおかしい気がするけど…)

Access

正常に動いているサブフォームのRecordSourceを変数に入れて使うとエラーが起きる

Dim sSQL As String
sSQL = Me.サブフォーム.Form.RecordSource & "WHERE ~ ORDER ~"

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open sSQL, cn, adOpenKeyset, adLockOptimistic


※実際はsSQLに代入する処理でサブフォーム側のORDERをReplaceしているが省略

フォームのレコードソースにWHEREとORDERをくっつけてSQL文を作りString型変数に入れ、それをRecordset.Openに使うとエラー。
変数の中身(SQL文)をイミディエイトウィンドウに表示すると途中で不自然な改行がされている。(テーブル名の間で改行されている、とか。手動では絶対やらない)
変数の中身をコピーして改行を消し、クエリを新規作成→SQLビューに貼り付け→デザインビューに切り替えると正しくレコードが表示される。
元ネタのフォームのレコードソースには変な改行がなく正常に動作している。

原因

行が長すぎます | Microsoft Docs
レコードソースの文字数がVisual Basic Editorの1行の文字数の限界を超えているため、勝手に改行されて処理がうまくできなかったらしい。
上記リンクでは1023文字と書いてあるが、当該SQL文にLen関数を使ったら990文字だった。
ちなみにイミディエイトウィンドウも最大文字数が同じでLenを挟み込む余地がなかったため、Excelに行をコピーして調べた。
仕様追加でフィールドが増えてレコードソースの文字数も増え、エラーが起きるようになったと思われる。

解決

フォームのレコードソースをSQLビューで開いてSQL文をコピーし、下記のように適当なところで区切りながら変数に入れた。

"SELECT 1行目--" & _
"2行目---------" & _
"3行目---------"


レポートのデザインを変更しても保存できない

レポートをデザインビューにして変更をかけ、閉じる時の保存確認で「はい」を選択してもレポートが閉じない。保存もされない。
かといって保存せず閉じたら当然保存はされない。

解決

フォームの変更が保存出来ない - Microsoft コミュニティ
「Access レポート 保存 閉じない」でググって先頭に出てきた上記リンクにある解決策、「レポートのコード保持プロパティを『いいえ』にする」を実行した。

フォーム一覧に存在せずコードも見れずエラーを吐き続けるフォームを消す

(解決してそこそこ経っているのでうろ覚えです)

・プロジェクトエクスプローラーには存在する
・フォーム一覧には出てこない
・コードを見ることはできない(開けない?)
・どこかのオブジェクトから呼び出され(?)、エラーを吐き続ける
というフォームがあった。
当時の自分はTwitterに『亡霊的なフォーム』と書いていたので、以下『亡霊』とする。

解決

新規フォームを作成し、亡霊と同名で保存するとコードを開けるようになった。
コードから呼び出し元を特定して亡霊の繋がりを断ち、亡霊のコード保持を「いいえ」にしてフォームを削除することで成仏。

Word

Wordテンプレートファイルをテンプレートとして開く

どう頑張ってもテンプレートファイルとしてではなく通常のファイルとして開いてしまう。

解決

Documents.Add メソッド (Word)
VBAでWordテンプレート(dotx)をテンプレートとして開く場合はOpenではなくAddを使う。

Openは「既存のファイルを開く」
Add「既存のファイルを利用して新しいWordファイルを作成」
という感じ。

Private Sub CmB_TempOpen_Click()
    Dim doApp As Object: Set doApp = CreateObject("Word.Application")
    doApp.Visible = True
    doApp.Documents.Add "テンプレを置いている場所のフルパス\テンプレ.dotx"
    Set doApp = Nothing
End Sub


(そりゃ「Access Wordテンプレート 開く」とか「Access VBA dotx Open」で調べても出てこないわけだ…OpenじゃなくてAddだったとは…)

VBA

Microsoft Office 16.0 Object Libraryへの参照設定ができない

「参照可能なライブラリファイル」の一覧に「Microsoft Office 16.0 Object Library」が存在せず、修復しても出てこない。
(会社のパソコンなので再インストールは試していない)

解決

昔誰かが作ったシステムの参照設定を見たらObject Libraryへの参照があり、途中までのパスが確認できたので、それを基にフォルダを潜って「MSO.DLL」を選択し、Accessを再起動したら無事に参照設定できた。

そのパスはこちら↓
C:\Program Files (x86)\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE16

(これ何に使うんだっけ?と思って調べたらファイル選択ダイアログ(Application.FileDialog)を使うためのものだった)

【スポンサーリンク】