シートをコピーして新規Bookで保存するマクロを作成しています。
このシートには「クリックするとユーザーフォームを開く」ボタンをつけているのですが、コピー先のBookにユーザーフォームをコピーすることができません。
(全て自動化したいので、両方のBookをVBEで開いてドラッグでコピーするようなことは考えていません。)
良い方法がありましたら、アドバイスください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

フォームをエクスポートして新しいブックにインポートすればOKです。


下はユーザーフォームのMyFormをC:\myform.frmにエクスポーとして新しいブックにインポートする例です。

Dim newBook As Workbook
ThisWorkbook.VBProject.VBComponents.Item("MyForm").Export "C:\myform.frm"
Set newBook = Workbooks.Add
newBook.VBProject.Import "C:\myform.frm"
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサブフォームに変数を代入し、RecordSourceの値を取得したい

サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。

Sub test1()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
End Sub
*******************************************************************
Sub test2()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource

End Sub

オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)
*******************************************************************
Sub test3()

Dim サブフォーム As String
Dim フォーム As String

フォーム = "土台"
サブフォーム = "フォーム1"

MsgBox Forms(サブフォーム).RecordSource

End Sub

実行時エラー'2450'
マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。
*******************************************************************
test1~3のうち
test1のみはうまくいくのですが
変数を代入したいです。
ヘルフ゜のには
Forms![受注]![受注サブフォーム].Formとなってますが
これじゃ変数を代入できないですよね。

どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか?

よろしくお願いします。

サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。

Sub test1()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
End Sub
*******************************************************************
Sub test2()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
MsgBox Fo...続きを読む

Aベストアンサー

No.1です。

> この「.Form」はどこにつければいいのでしょうか?

えーと・・・すみません、後半に余計な説明が多すぎたようです(汗)
一応、前回回答の前半部分に書いていたんですが、式としては

 MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

になります。

蛇足ついでに、式の構成を簡単に(?)説明すると、
 Forms(~)
  展開済のフォーム群(=複数形:Formsコレクション)から、指定された
  名前のフォームを参照
 Controls(~)
  そのフォーム内のコントロール群(=複数形:Controlsコレクション)から、
  指定された名前のコントロールを参照
 Form.RecordSource
  指定したコントロール(サブフォーム)の、フォームとしてのプロパティ
  (ここではRecordSource)を参照
  (「Form」プロパティを経由しないと、サブフォームの「RecordSource」
   プロパティを参照できない、ということ)
ということです。

※「Forms」と「Form」は英単語上は前者が後者の複数形という関係ですが、
 プログラム上での関連性は薄いので、前者が前側につき、後者が後ろ側
 につくのは、「コレクションやプロパティの使い方・定義がそうなって
 いるから」として割り切るしかないかと思います(汗)


・・・また余計な説明が長くなりすぎた気がしますが(汗)、参考まで。

No.1です。

> この「.Form」はどこにつければいいのでしょうか?

えーと・・・すみません、後半に余計な説明が多すぎたようです(汗)
一応、前回回答の前半部分に書いていたんですが、式としては

 MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

になります。

蛇足ついでに、式の構成を簡単に(?)説明すると、
 Forms(~)
  展開済のフォーム群(=複数形:Formsコレクション)から、指定された
  名前のフォームを参照
 Controls(~)
  そのフォーム内のコントロー...続きを読む

Q単票フォームと帳票フォームを連動 アクセス

どういう構成にすればいいか教えてください。

元データはT_testのみですが
T_testを元に、単票フォームと帳票フォームを作り、
この二つのフォームをサブフォームにし、1つの親フォームにはめて、
帳票フォームのレコードをクリックする(カレントレコードが変わる)度に
単票フォームは、帳票フォームのデータを表示させたいのですが
どうすればいいでしょう?

レコードソースは親フォームに設定すればいいのでしょうか?
それとも単票フォームと帳票フォームそれぞれにT_testを設定すればいいでしょうか?

帳票フォームのレコードをクリックして単票フォームのデータを表示させる際は、
帳票フォームの値を取得して単票フォームにフィルタをかければいいのでしょうか?

Aベストアンサー

No2 さんの方法を VBA を使用しないで実現。

hatena さんのを拝借して

帳票フォームの埋め込んであるサブフォームコントロール名を、SubForm1
単票フォームの埋め込んであるサブフォームコントロール名を、SubForm2
とします。

「T_test」の中に、オートナンバ「an」フィールドがあると仮定します。
オートナンバでなくてもレコードを一意に決定できるフィールドなら OKです。

細工1)
メインに不可視のテキストボックス「txt1」を配置します。
txt1 のコントロールソースを
=[subform1].[Form].[an]

細工2)
SubForm2 の リンク親/子フィールドを設定します。
(直接の手入力で:ビルドは使いません(この状況では使えません))
・リンク親フィールド : txt1
・リンク子フィールド : an

QAccess メインフォームのリフレッシュについて

Access2003 にて、下記の手順で処理するプログラムを作成しています。

メインフォーム(埋め込みサブフォーム ※データシートビュー 一覧表)
→埋め込みサブフォームの対象のレコードセレクタをダブルクリック。
→別フォームを起動し、データ入力更新。別フォームを閉じる。
→メインフォームのリフレッシュ し別フォームで変更した内容を反映させたい。

メインフォームのリフレッシュを行いたいのですが、うまくいきません。

■試してみたこと
メインフォーム、サブフォーム、別フォームとあり、

1.
別フォームのデータ更新が終了したあと、
別フォームを閉じる直前にForms![メインフォーム名].requery をしてみた
メインフォームは別フォームを開く前の状態と、変化なし

2.
別フォームのデータ更新が終了したあと、別フォームを閉じ
サブフォーム内ロジックで、Forms![メインフォーム名].requery をしてみた
メインフォームは別フォームを開く前の状態と、変化なし

3.
別フォームのデータ更新が終了したあと、別フォームを閉じ
サブフォーム内ロジックで、Me.requery をしてみた
メインフォームは別フォームを開く前の状態と、変化なし

-----
いずれもメインフォームには変化はありませんでした。
出来れば、メインフォームにはForm_Loadした時と同じように
処理を走らせたい(メインフォームを閉じることなくフォームロードから処理を再開させたい)
と考えています。

サブフォームを含め、メインフォームごとリフレッシュするような処理はないでしょうか。
ご存知のかた宜しくお願いいたします。

Access2003 にて、下記の手順で処理するプログラムを作成しています。

メインフォーム(埋め込みサブフォーム ※データシートビュー 一覧表)
→埋め込みサブフォームの対象のレコードセレクタをダブルクリック。
→別フォームを起動し、データ入力更新。別フォームを閉じる。
→メインフォームのリフレッシュ し別フォームで変更した内容を反映させたい。

メインフォームのリフレッシュを行いたいのですが、うまくいきません。

■試してみたこと
メインフォーム、サブフォーム、別フォームとあり、

1.
別フォーム...続きを読む

Aベストアンサー

#1 です。余談ですが、DAO と ADO の選択の目安としては、Access オンリーの設計としていいか、汎用性を持った設計にしたいか、みたいなところではないでしょうか。

DAO は完全に Jet に特化したオブジェクトなので、Jet に対する速度や細かな操作が得意です。
ADO は OLE DB を経由するため、速度に若干ムラがあり、かゆいところに手が届きにくいところがありますが、OLE DB プロバイダを変更すれば、接続するデータベースの変更が容易という利点があります。
Access でクローズされたアプリには DAO のほうが合ってるのかもしれませんね。でも、私はDAO はあまり使ったことがありません。

この紛らわしい省略単語、なんとかならんもんですかね・・・・・・・。

QVBで子フォーム以外をマウスダウンすると子フォームが閉じる

Visual BASICで Mainフォームからある操作をしたときに、子フォーム(グリッド)を 「子フォーム名.show」 の命令で表示させています。
その子フォームを閉じたくないのに、Mainフォームをマウスでクリックすると子フォームが閉じてしまいます。
べつに、Mainフォームのマウスダウンイベントで子フォームを閉じる命令は記述していないのですが。
また、「子フォーム名.show」と「子フォーム名.visual=true」とではなにが違うのですか?
分かる方がおられましたが教えてください。

Aベストアンサー

Mainフォームがアクティブになっているだけで、子フォームは
閉じられていないのではないでしょうか?

子フォーム名.Show vbModeless, Me

とすれば、親フォームより後ろになることはありません。

まあ、親フォームを触らせないようにするのなら、

子フォーム名.Show vbModal

でもよいですが・・・。

Q親フォームからサブフォームのレコードソースを設定

親フォームからサブフォームのレコードソースを設定するには?
フォーム1にテーブル1をドロップアンドドラッグして、「テーブル1のサブフォーム」を作成しました。

フォーム1にあるコマンドボタンから「テーブル1のサブフォーム」のRecordSourceを設定する方法を教えてください。

「テーブル1のサブフォーム」からなら
Private Sub Form_Load()
Me.RecordSource = ""
End Sub

とできるのですが、
やりたいことはフォーム1からのイベントなので
「テーブル1のサブフォーム」からのイベントは使えません。

だからってフォーム1の
Private Sub コマンド2_Click()
Me.テーブル1のサブフォーム.RecordSource = "テーブル1のサブフォーム"
End Sub

とするとコンパイルエラーになります。

良い方法があれば教えてください。アドバイスよろしくお願いします。

Aベストアンサー

No2です。説明もれがあったので追加しておきます。
No2のところで、

>このとき、「テーブル1のサブフォーム」
>のフィールドには「#Name?」のような表示がされていると
>思います。すなわちこときはサブフォームにはレコードソースが
>設定されていないからです。

としていますが、「#Name?」と表示される理由はフィールドの
コントロールソースが設定されているために、「#Name?」のような
表示が出てきます。


ここからは蛇足ではありますが、コントロールソースが設定されていなければ
こうした表示はでませんが、もしコントロールソースも取り除いて
いるならば、コマンド1でもコマンド2のクリックイベントでもどちらでも
かまいませんが、たとえば「テーブル1のサブフォーム」の
フィールドのコントロールソースをすべて取り除いておいて、
コマンド2のクリックイベントで設定するとすれば、一応
「テーブル1のサブフォーム」のフィールドの名前をID、名前、住所として
テーブル1のフィールド名を同じくID、名前、住所とするならば、

Private Sub コマンド2_Click()
Me.テーブル1のサブフォーム.Form.RecordSource = "テーブル1"
Me.テーブル1のサブフォーム.Form.Controls("ID").ControlSource = "ID"
Me.テーブル1のサブフォーム.Form.Controls("名前").ControlSource = "名前"
Me.テーブル1のサブフォーム.Form.Controls("住所").ControlSource = "住所"
End Sub

として、レコードソース、コントロールソースを設定します。

No2です。説明もれがあったので追加しておきます。
No2のところで、

>このとき、「テーブル1のサブフォーム」
>のフィールドには「#Name?」のような表示がされていると
>思います。すなわちこときはサブフォームにはレコードソースが
>設定されていないからです。

としていますが、「#Name?」と表示される理由はフィールドの
コントロールソースが設定されているために、「#Name?」のような
表示が出てきます。


ここからは蛇足ではありますが、コントロールソースが設定されていなければ
こうした表示はで...続きを読む

Qaccess 直前まで開いていたフォームを閉じる。

宜しくお願いします。

仕様環境 Access(2002-2007)

請求書作成フォームを作りました。
(顧客情報を入力して印刷などができるスタンダードなものです)

フォームは「履歴」「新規」「検索」と3つのフォームで構成されています。
それぞれに他のフォームに移動出来るようにコマンドボタンがついていて、
例えば、「履歴フォーム」を開いて「新規」というボタンを押すと「新規フォーム」が
開く仕様です。

ただ、この場合、履歴フォームを開いたまま、新規フォームが開く感じになるので、
実質、画面上は2枚のフォームが開いています。(重なるので1枚に見えますが・・)
更に言えば、この状態から「検索」というボタンで検索フォームを開くと
3枚のフォームが開いた状態になります。

これを、例えば履歴フォームから新規フォームを開くと
履歴フォームが閉じる仕様にしたいと思っています。
また別のフォームを開くと直前まで開いていたフォームが
閉じる仕様にしたいと思っています。

まとめると、
”新しいフォームを開くと直前まで開いていたフォームは自動的に閉じられる。”

こんな感じにしたいのですが、何か方法はありますでしょうか。
複数枚(2枚以上)のフォームがあるのが鍵だと思います。

お知恵をお貸しください、宜しくお願いします。
(当方、マクロです)

宜しくお願いします。

仕様環境 Access(2002-2007)

請求書作成フォームを作りました。
(顧客情報を入力して印刷などができるスタンダードなものです)

フォームは「履歴」「新規」「検索」と3つのフォームで構成されています。
それぞれに他のフォームに移動出来るようにコマンドボタンがついていて、
例えば、「履歴フォーム」を開いて「新規」というボタンを押すと「新規フォーム」が
開く仕様です。

ただ、この場合、履歴フォームを開いたまま、新規フォームが開く感じになるので、
実質...続きを読む

Aベストアンサー

「常に1つのフォームだけが開いた状態」にしたいということでよろしければ、
以下のようなマクロを作成し、3つのフォームの『開くとき』イベントで
実行させれば、おおむねOKです。
※「おおむね」の理由については後述。

<アクション>
 閉じる
<引数>
 オブジェクトの種類: フォーム
 オブジェクト名: =Screen.ActiveForm.Name
 ※先頭に「=」が必須となるのでご注意下さい。
  (なお、入力後は自動的に角括弧で括られます)

「Screen.ActiveForm.Name」は、現在アクティブになっているフォームを
確認できるので重宝します。
但し、最初にフォームを開くときはアクティブなフォームがないために、
エラーになってしまうという問題があります(→上で「おおむね」とした理由)。

これを回避するために、新たにダミーのフォームを作成して、Autoexec
マクロか『起動時の設定』で開くフォームにはこれを指定した上で、
そのフォームをアクティブにしてから、ユーザーが最初に触るフォームを
開くようにしてください。

【ダミーフォームの『開くとき』イベントに組み込むマクロ】
全部で2つのアクションになります。

<アクション>
 値の代入
<引数>
 アイテム: Forms!ダミーフォーム.Visible
 式: True
 ※ダミーフォームを強制的にアクティブ化

<アクション>
 フォームを開く
<引数>
 フォーム名: (「履歴」「新規」「検索」のどれか)

※最初に開くフォームをAutoexecマクロで開いている場合は、『開くとき』
 イベントに組み込む代わりに、同マクロに直接、
   『フォームを開く』(ダミーフォーム)
   『値の代入』(Forms!ダミーフォーム.Visibleへの代入)
   『フォームを開く』(「履歴」「新規」「検索」のどれか)
 を組み込む形でも可です。

「常に1つのフォームだけが開いた状態」にしたいということでよろしければ、
以下のようなマクロを作成し、3つのフォームの『開くとき』イベントで
実行させれば、おおむねOKです。
※「おおむね」の理由については後述。

<アクション>
 閉じる
<引数>
 オブジェクトの種類: フォーム
 オブジェクト名: =Screen.ActiveForm.Name
 ※先頭に「=」が必須となるのでご注意下さい。
  (なお、入力後は自動的に角括弧で括られます)

「Screen.ActiveForm.Name」は、現在アクティブになっているフ...続きを読む

Qユーザーフォームの呼び出し元

ユーザーフォーム1で処理のボタンを押すと、パスワードの入力フォーム(ユーザーフォーム3)が表示されます。
ユーザーフォーム2でも処理のボタンを押すと、パスワードの入力フォーム(ユーザーフォーム3)が表示されます。
このようにパスワードの入力フォーム(ユーザーフォーム3)が共用の場合に、パスワードの入力結果を呼び出し元のユーザーフォームに帰したいのですが、
ユーザーフォーム1、2のどちらから呼び出されたのか、呼び出し元を識別する方法をアドバイス下さい。

Aベストアンサー

こんにちは。

ユーザーフォーム識別用の変数を用意するというはどうですか?Piblicで宣言しておけば、どこでも使えます。

あるいは、パスワード入力用のユーザーフォーム3のTagプロパティを使う。
Tagプロパティは、自由に値を設定できるプロパティです。

QAccessのサブフォームについて

メインフォームとサブフォームのあるフォームを作成しました。メインフォームを入力してから、サブフォームを入力し、次のレコードへ移動するのにメインフォームの移動ボタンを押すと、次のレコードのカーソルがサブフォームのフィールドへ移動します。メインフォームに移動する方法はありませんか?

Aベストアンサー

レコード移動時イベントで、メインフォームのコントロールに
フォーカスを移してやれば大丈夫だと思います。

Me!コントロール名.SetFocus

QAccess2013 vbaサブフォームのレコード

[Access2013 vba]
■したいこと
サブフォームのレコードの中から、一レコードだけをチェックボックスなどで選択したいのですが、どのようにしたら出来ますでしょうか。
複数行選択は出来ないようにしたいです。
選択したのち、メインフォームの選択ボタンを押すと、そのレコードのID番号を取得して、呼出元のフォームのIDフィールドに代入したいです。

■画面の流れ・・・
Aフォーム → 帳票型Bフォームで、レコードを選び「開く」ボタンを押す→
B 'メインフォームとCサブフォーム)が開く
Cサブフォームのレコードをチェックボックスにチェックを入れて選択する
B ' メインフォームの「選択」ボタンを押すと B ' メインフォームと、その前のBフォームが閉じて
Aフォームに戻り、AフォームのIDフィールドに選択したIDが格納される。

よろしくお願いします。

Aベストアンサー

揚げ足とりの意図では無い旨、あらかじめお断りしたうえで。

> うまく行きません。
「どう」うまく行きませんか?
「コピペしたので補足の記述が一字ー句違わない」なら、
[MyID]と[optSelect]の間はカンマではなく ! であるべき。

NzでNull対策すれば、iifの条件式そのものが結果として欲しい値。
iifもthenの値、elseの値、それらを区切るカンマもカッコも不要です。


画面の流れではフォームが3つになりましたが、必要?
以下、AフォームのIDフィールドと内容が見える状態で進めて下さい。

> Aフォーム → 帳票型Bフォームで、レコードを選び「開く」ボタンを押す→
Bが子フォームですので、「レコードを選び」の段階で
親フォームであるAフォームのIDフィールドへ値が入りますか?
3つのフォームなら、親・子・孫です。代入のイベントをどこに書いてますか?
孫フォームでクリックしたoptSelectのIDが親フォームに届いてますか?
まずはこれを確認してみて下さい。

#タブレットの手書き入力なのでしんどい。
#夕食の支度したら戻って来ます。

揚げ足とりの意図では無い旨、あらかじめお断りしたうえで。

> うまく行きません。
「どう」うまく行きませんか?
「コピペしたので補足の記述が一字ー句違わない」なら、
[MyID]と[optSelect]の間はカンマではなく ! であるべき。

NzでNull対策すれば、iifの条件式そのものが結果として欲しい値。
iifもthenの値、elseの値、それらを区切るカンマもカッコも不要です。


画面の流れではフォームが3つになりましたが、必要?
以下、AフォームのIDフィールドと内容が見える状態で進めて下さい。

> Aフォーム → ...続きを読む

QACCESS2003でサブフォームを使う

すみませんが教えてください。
親フォームの中に、サブフォームを作ります。

サブフォームにはクエリの内容が表示されています。
そのサブフォームの内容を、親フォームに表示させたいです。
(サブフォームをクリックすると、親フォームの内容も切り替わる)

VBAが必要なのでしょうか。
もしそうであれば、参考になるページ、もしくはコードを教えていただけるとありがたいです。

現在、親フォームのほうには [Forms]![登録内容クエリ2フォーム]![登録内容マスタのサブフォーム] ![Forms]![内容]と設定しているのですがこのままではうまくいかないのですね;;

ヨロシクお願いします。

Aベストアンサー

> VBAが必要なのでしょうか。

親フォームのデータに合致するレコードをサブフォームに表示するのであれば
VBAではなくても可能ですが(→サブフォームのプロパティシートで、「リンク親
フィールド」と「リンク子フィールド」を設定)、今回はそれとは逆のパターンなので、
VBA(又はマクロ)が必要です。

仮に、サブフォームのID,Text1,Text2の各データを、親フォームのID,Text1,Text2の
各テキストボックスに転記するのであれば、以下のようになります。
(なお、ここでは、親フォームの各コントロールは非連結と想定しています:
 親フォームのデータをサブフォームのデータで上書き、という場合は連結でも可)

'サブフォームのレコード移動時:
Private Sub Form_Current()

  '親フォームのID,Text1,Text2の各テキストボックスに、
  'サブフォームのID,Text1,Text2のデータを転記します
  With Me.Parent
    !ID = Me!ID
    !Text1 = Me!Text1
    !Text2 = Me!Text2
  End With

End Sub

   ------------------------

なお、親フォームも連結フォームで、サブフォームでの選択結果を元にして
レコードを絞り込む、という想定でしたら、親フォームに『対象ID』といった
非連結コントロールを設置して(不可視または使用不可でOK)、これを
絞り込み条件とするクエリを、親フォームのレコードソースにして下さい。
こうすれば、上と同様に、サブフォームのレコード移動時イベントで対象IDに
サブフォームのIDを代入した後、親フォームを再クエリすることで、
親フォームの表示を切り替えられると思います。

親フォームのレコードソース:
Select * From テーブル名 Where ID Like Forms!親フォーム名!対象ID

※親フォームの全レコード表示(絞り込み解除)を、『対象ID』への「*」の代入
  で対応するため、「ID = ~」ではなく「ID Like ~」としています。
  (ワイルドカード文字(*,#など)を入れなければ、曖昧検索にはなりません)
  (フォーム展開時のエラーを回避するため、対象IDの既定値は「"*"」にしておきます)

'サブフォームのレコード移動時:
Private Sub Form_Current()

  With Me.Parent
    !対象ID = Me!ID
    .Requery
  End With

End Sub


'親フォームの「絞り込み解除」ボタンのクリック時:
Private Sub 絞り込み解除_Click()

  'メッセージボックスで「キャンセル」を選択したら、解除を中止
  If MsgBox("絞り込みを解除します。", vbOKCancel, "確認") = vbCancel Then Exit Sub
  '対象IDに「*」を代入して再クエリすることで、全レコードを表示
  '(親フォーム「ID」が主キーを想定しているため、Null(空白)はないという前提)
  With Me
    !対象ID = "*"
    .Requery
  End With

End Sub

> VBAが必要なのでしょうか。

親フォームのデータに合致するレコードをサブフォームに表示するのであれば
VBAではなくても可能ですが(→サブフォームのプロパティシートで、「リンク親
フィールド」と「リンク子フィールド」を設定)、今回はそれとは逆のパターンなので、
VBA(又はマクロ)が必要です。

仮に、サブフォームのID,Text1,Text2の各データを、親フォームのID,Text1,Text2の
各テキストボックスに転記するのであれば、以下のようになります。
(なお、ここでは、親フォームの各コントロールは非...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報