質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

670閲覧

Access VBA Withエラー

Yoshikun_0945

総合スコア224

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/11/24 09:20

編集2019/11/24 12:27

前提・実現したいこと

編集で使用するテキストボックス名を配列に代入し、
繰り返し処理にて、配列の値を使用したテキストボックスのプロパティ指定を実行しようとしています。

発生している問題・エラーメッセージ

繰り返し処理中に、withを使用して配列に代入したテキストボックスのプロパティ設定を行いたかったのですが、型が異なるそうです。
どのように修正すればWithが使用できますか?

VBA

1実行時エラー'13'型が一致しません。

該当のソースコード

VBA

1'『Module_Hiragana』という標準モジュールに記述しています。 2Public Sub Hiragana_Load() 3 Call Txt_Name 4 '整数型の変数を宣言し、初期値を格納する 5 Dim i, j, k, ken, a As Integer: ken = 0 6 'フォーム名用の変数を宣言し、フォーム名を格納する 7 Dim FormName(1) As Form: Set FormName(0) = Forms!F02_メイン!F02_1_サブ.Form 8 Set FormName(1) = Forms!F02_1_サブ.Form 9 'コントロール名用の変数を宣言する 10 Dim TxtName, SubForm, LaName, TxtName2 As String 11 'サブフォーム名を設定する 12 SubForm = "F02_1_入力画面" 13 '現在押されたボタンの文字コードを変数に格納する 14 Now(0) = Asc(Hiragana(0)) 15 16 '押されたボタンが『あ』~『の』の場合 17 If Now(0) <= -32052 Then 18 '検索開始のレコード(行)番号と検索終了のレコード(行)番号を変数に格納する 19 Hiragana(1) = 0: Hiragana(2) = No 20 '押されたボタンが『は』~『わ』の場合 21 Else 22 '検索開始のレコード(行)番号と検索終了のレコード(行)番号を変数に格納する 23 Hiragana(1) = Ha: Hiragana(2) = Wa 24 '分岐処理を終了する 25 End If 26 27 '処理開始行と処理終了行の初期値を-1とする 28 Hiragana(3) = -1: Hiragana(4) = -1 29 '処理開始行と処理終了行を検索する 30 For i = Hiragana(1) To Hiragana(2) 31 '押されたボタンと最初に一致した場合 32 If Now(0) <> Asc(Stock(i, 3)) And Now(0) = Asc(Stock(i, 3)) Then 33 '現在参照中の行番号を変数に格納する(処理開始行番号) 34 Hiragana(3) = i 35 '押されたボタンと最後に一致した場合 36 ElseIf Now(0) = Asc(Stock(i, 3)) And Now(0) <> Asc(Stock(i + 1, 3)) Then 37 '現在参照中の行番号を変数に格納する(処理終了行番号) 38 Hiragana(4) = i 39 '繰り返し処理から強制離脱する 40 Exit For 41 '分岐処理を終了する 42 End If 43 '繰り返し処理に戻る 44 Next 45 46 '処理を実施する行のあいだ繰り返す 47 For i = Hiragana(3) To Hiragana(4) 48 '処理を実施する列のあいだ繰り返す 49 For j = 0 To 9 50 '省略記述を開始する 51   'この行で型不一致のエラーが出ます。 52 With FormName(0).Controls(TxtName(ken, j)) 53 'テキストボックスを画面に表示し、編集可能状態にする 54 .Visible = True: .Enabled = True: Locked = False 55 '貯蔵品配列の列番号が3 ・ 5以外の場合 56 If j <> 2 And j <> 4 Then 57 '貯蔵品配列の情報をテキストボックスに出力する 58 .Visible = Stock(i, j + 1) 59 '貯蔵品配列の列番号が3 ・ 5の場合 60 Else 61 .Visible = "" 62 End If 63 '省略記述を終了する 64 End With 65 '繰り返し処理に戻る 66 Next 67 '繰り返し処理に戻る 68 Next 69 '親フォームの水平と垂直のスクロールバーを表示する 70 FormName(1).ScrollBars = 3 71 '現在の行数を変数に格納する 72 TxtVisible = i - 1 73 '現在の画面に表示している行が30行未満の場合 74 If TxtVisible < 30 Then 75 '現在の画面に表示している行が10行未満の場合 76 If TxtVisible <= 10 Then 77 '親フォームのスクロールバーを水平方向だけにする 78 FormName(1).ScrollBars = 1 79 '分岐処理を終了する 80 End If 81 '30行目まで繰り返す 82 For i = TxtVisible + 1 To 30 83 '10列分繰り返す 84 For j = 0 To 9 85 'テキストボックスを非表示にする 86 FormName(0).Controls(TxtName(i, j)).Visible = False 87 '繰り返し処理に戻る 88 Next 89 '繰り返し処理に戻る 90 Next 91 '分岐処理を終了する 92 End If 93End Sub

VBA

1'『Module_Txt』という標準モジュールに記述しています。 2Public Sub Txt_Name() 3'『F02_1_サブ』というサブフォームのテキストボックス名を変数に格納する処理 4 'カウント用変数を宣言する 5 Dim i, j, moji As Integer 6 '行数分繰り返す 7 For i = 0 To 29 8 LaName(i) = "La_a" & i + 1 9 '文字コードを98『b』にセットする 10 moji = 98 11 '列数分繰り返す 12 For j = 0 To 9 13 'テキストボックス名を変数に格納する 14 TxtName(i, j) = "Txt_" & Chr(moji) & i + 1 15 '文字コードを加算する『b → c → d → e …』 16 moji = moji + 1 17 Next 18 Next 19End Sub

VBA

1'『F02_3_ひらがなボタン』という名称のサブフォームに設置しているボタンで動作します。 2Private Sub Img_A_Click() 3 DoCmd.OpenForm "F02_1_入力画面", acNormal, , , acFormEdit, acHidden 4 '『あ』ボタンが押されたことを変数に記録する 5 Hiragana(0) = "あ" 6 'ひらがな処理に移動する 7 Call Hiragana_Load 8End Sub 9 10Private Sub Img_E_Click() 11 '『え』ボタンが押されたことを変数に記録する 12 Hiragana(0) = "え" 13 'ひらがな処理に移動する 14 Call Hiragana_Load 15End Sub 16 17Private Sub Img_I_Click() 18 '『い』ボタンが押されたことを変数に記録する 19 Hiragana(0) = "い" 20 'ひらがな処理に移動する 21 Call Hiragana_Load 22End Sub 23 24Private Sub Img_No_Click() 25 Hiragana(0) = "の" 26 Call Hiragana_Load 27End Sub 28 29Private Sub Img_O_Click() 30 '『お』ボタンが押されたことを変数に記録する 31 Hiragana(0) = "お" 32 'ひらがな処理に移動する 33 Call Hiragana_Load 34End Sub 35 36Private Sub Img_U_Click() 37 '『う』ボタンが押されたことを変数に記録する 38 Hiragana(0) = "う" 39 'ひらがな処理に移動する 40 Call Hiragana_Load 41End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/11/24 09:59

「FormName.Controls((TxtName(i,j))」にてカッコの数が不一致のように見えますが。コピペミスでしょうか??
guest

回答2

0

手打ちのソースでは、エラーの判定が出来ません。

ソースコードは、実際にエラーが起きているプログラムをコピペしてください。

投稿2019/11/24 10:37

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yoshikun_0945

2019/11/25 01:33

コードを修正いたしましたのでご確認いただけますでしょうか。
iruyas

2019/11/25 03:07

(1) 変数宣言の強制について 各モジュールの先頭に Option Explicit と書いてください。 変数の宣言/使用に誤りがあったり、 スペルに誤りがある場合コンパイルエラーになります。 (2) 変数の型宣言について Dim i, j, k, ken, a As Integer と書いた場合は、 Dim i As Variant, j As Variant, k As Variant, ken As Variant, a As Integer と書いたのと等価です。 また、32/64ビット環境では、Integer を使用するメリットはありません。 Dim i As Long, j As Long, k As Long, ken As Long, a As Long としましょう。 Dim TxtName, SubForm, LaName, TxtName2 As String 等も同様です。 (3) 変数のスコープについて Public Sub Hiragana_Load() の中で TxtName の宣言をしていますが、 そのままでは、 Public Sub Txt_Name() の中で使うことは出来ません。 いろいろな方法がありますが、引数で渡すのが王道です。 Public Sub Hiragana_Load() の中で、 Dim TxtName(29, 9) As String と宣言しておいて Call Txt_Name(TxtName) と、引数を付けて呼び出す。 呼ばれる方では、 Public Sub Txt_Name(ByRef TxtName() As String) のように宣言する。
guest

0

ベストアンサー

Hiragana_Loadプロシージャの冒頭で TxtName をVariant型で宣言していますね。(型を省略するとVariant型になります)

vba

1Dim TxtName, SubForm, LaName, TxtName2 As String

Hiragana_Loadプロシージャの中頃で、TxtName(ken, j)というように配列変数のように記述してますね。

vba

1 With FormName(0).Controls(TxtName(ken, j))

配列でないものを配列として扱おうとしているので当然、「型が一致しません。」と怒られます。

おそらくグローバル変数として TxtName を配列として宣言しているだと推測しますが、同じ名前の場合、ローカルで宣言した変数が優先されます。

グローバル変数を多用するとコードが読みづらくなるし、今回のようなバグの原因にもなるので、なるべく使わないようにするのが常識です。

プロシージャ間で共有するデータは、引数や戻り値で引き渡すようなコーディングにすることをお勧めします。

投稿2019/11/25 02:02

編集2019/11/25 02:17
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問