🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

1回答

2183閲覧

ユーザーフォームのコマンドボタン実行時にユーザーフォームが閉じる

nakaj1ma

総合スコア1

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2021/03/21 05:52

前提・実現したいこと

Youtube等でVBAを学び始めて2週間程度の初心者です。
UserFormに記載した内容をエクセルシートの最終行に転記したいです。

  ・テキストボックスにグレー表記で記載例を表示
・テキストボックスに触ったら何も記載がない状態で入力できる
・いくつか必須の入力項目がある
・いくつかコンボボックスから選択する項目がある
・コマンドボタンをクリックした時点で転記されるようにしたい

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

UserFormに記載した後、コマンドボタンを押した時に以下の事象が発生します

 ・転記されない
・UserFormが自動的に閉じる
・もう一度UserFormを呼び出すと記載した内容が消えている
・転記されることもある(3回に1回程度)

該当のソースコード

######標準モジュールに記載したコード

Module1

1※こちらは標準モジュールに記載しました。 2 Sub 入力フォーム呼出()          3 UserForm1.Show vbModalless 4 End Sub

######UserForm1に記載したコード

Private Sub UserForm_Initialize() 種別.AddItem "出張"                              '種別 = コンボボックスのオブジェクト名 種別.AddItem "休暇" 種別.AddItem "その他"   Dim 最終行, 一覧 '変数設定「最終行」「一覧」  最終行 = Worksheets("カレンダー").Cells(Rows.Count, 13).End(xlUp).Row  For 一覧 = 12 To 最終行   担当者.AddItem Worksheets("カレンダー").Cells(一覧, 13)             '担当者 = コンボボックスのオブジェクト名  Next 一覧  End Sub -----------------------------------------------------------------------------------------------------------------------  Private Sub 対象日_Enter()                            '対象日=テキストボックスのオブジェクト名   With 対象日   If .Value = "例) 10/10 or 2022/10/10" Then    .Value = ""    .ForeColor = vbBlack    .Font.Size = 14     End If     End With   End Sub -----------------------------------------------------------------------------------------------------------------------  Private Sub 対象日_Exit(ByVal Cancel As MSForms.ReturnBoolean)   With 対象日   If .Value = "" Then    .Value = "例) 10/10 or 2022/10/10"    .ForeColor = rgbGray    .Font.Size = 12   対象日必須.Caption = "対象日は必須入力です"              '対象日必須 = ラベルのオブジェクト名    End If    End With    End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 種別_Enter() With 種別 If .Value = "右の▼から選択" Then .Value = "" .ForeColor = vbBlack .Font.Size = 14 End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 種別_Exit(ByVal Cancel As MSForms.ReturnBoolean) With 種別 If .Value = "" Then .Value = "右の▼から選択" .ForeColor = rgbGray .Font.Size = 12 種別必須.Caption = "種別は必須入力です"                   '種別必須 = ラベルのオブジェクト名 End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 担当者_Enter() With 担当者 If .Value = "右の▼から選択" Then .Value = "" .ForeColor = vbBlack .Font.Size = 14 End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 担当者_Exit(ByVal Cancel As MSForms.ReturnBoolean) With 担当者 If .Value = "" Then .Value = "右の▼から選択" .ForeColor = rgbGray .Font.Size = 12 担当者必須.Caption = "担当者は必須入力です" End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 備考_Enter()                           '備考=テキストボックスのオブジェクト名 With 備考 If .Value = "例) ※担当者名を書く時は必ずひらがなで記載!!" Then .Value = "" .ForeColor = vbBlack .Font.Size = 14 End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 備考_Exit(ByVal Cancel As MSForms.ReturnBoolean) With 備考 If .Value = "" Then .Value = "例) ※担当者名を書く時は必ずひらがなで記載!!" .ForeColor = rgbGray .Font.Size = 12 End If End With End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 登録_Click() '登録=コマンドボタンのオブジェクト名 ActiveSheet.Protect UserInterfaceOnly:=True If 対象日.Value = "例) 10/10 or 2022/10/10" Then MsgBox "対象日は必須入力です" Exit Sub End If If 種別.Value = "右の▼から選択" Then MsgBox "種別は必須入力です" Exit Sub End If If 担当者.Value = "右の▼から選択" Then MsgBox "担当者は必須入力です" Exit Sub End If Worksheets("入力シート").Range("B3").End(xlDown).Offset(1, 0).Select ActiveCell.Value = 対象日.Value 対象日.Value = "例) 10/10 or 2022/10/10" 対象日.ForeColor = rgbGray 対象日.Font.Size = 12 ActiveCell.Offset(0, 16).Value = 種別.Value ActiveCell.Offset(0, 18).Value = 担当者.Value If 備考 <> "例) ※担当者名を書く時は必ずひらがなで記載!!" Then ActiveCell.Offset(0, 19).Value = 備考.Value End If MsgBox "新規登録しました" End Sub ----------------------------------------------------------------------------------------------------------------------- Private Sub 閉じる_Click()                             '閉じる=コマンドボタンのオブジェクト名 ActiveSheet.Protect UserInterfaceOnly:=True Unload UserForm1 End Sub

試したこと

コードを記載する順番が関係あるのかな?と調べましたが全然わかりませんでした。
デバックモードにも移行しないので、コード自体に間違いはない気がしているのですが…。

補足情報(FW/ツールのバージョンなど)

office365を利用しています。

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

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

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

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

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

hatena19

2021/03/21 06:26

vbModalless って、実際のコードですか。vbModeless の写し間違いですか。 どのコマンドボタンを押したときにそうなりますか。 ステップ実行で確かめてみてはどうですか。
nakaj1ma

2021/03/21 06:52

ありがとうございます。 登録というコマンドボタンを押した時に転記されずにユーザーフォームが消えてしまいます。 ステップ実行、やってみます。(やりかた調べてから)
guest

回答1

0

ベストアンサー

標準モジュールに記述したShowメソッドの引数を vbModalless とタイプしていますが、正しくはvbModelessではないでしょうか?
Option Explicitを記述していないので、これでも動くとは思いますが、変数が宣言されていないことで、意図通りの挙動をしてくれないことは有り得ます。
各モジュールにOption Explicitを記述して、「デバッグ」-「VBAprojectのコンパイル」を実行してみてはいかがでしょう?

投稿2021/03/21 09:23

morisame

総合スコア18

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

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

nakaj1ma

2021/03/22 05:04

ご回答ありがとうございました。 おっしゃる通り、変数の宣言をしてみたらデバッグで分かりました! 元々、最終行をセレクトした後にActivecell.Offset(?,?)で転記セルを設定していたのですが、Activecellを認識している時としていない時があったみたいです。 Activecellでなく、Rangeで場所を指定したらエラーが起きなくなりました! 助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問