excel vbaでユーザーフォームを作りました。
その中で
ComboBox1に「青」を選択すると(TextBox1、TextBox2)がSheet1に
ComboBox1に「赤」を選択すると(TextBox1、TextBox2)がSheet2に
転記されるようにしたいと思っています。
(ComboBox1の青や赤は転記する必要なし)

どのようにすればいいのか、どなたかご教示願います。

よろしくお願いします。

A 回答 (1件)

素直に



pvivate sub ComboBox1_Change()
 dim s as worksheet
 select case me.combobox1.value
 case "青"
  set s = worksheets("Sheet1")
 case "赤"
  set s = worksheets("Sheet2")
 end select

 if not s is nothing then
  s.range("A1") = me.textbox1.value
  s.range("A2") = me.textbox2.value
 end if
end sub

などと言った具合に,「青ならこうする」「赤ならこれをする」と仕分けていけば十分な様子に思われます。
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳ございません!!
完璧にできました!! とってもすっきりしました。
ありがとうございました。

お礼日時:2011/04/25 17:41

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

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

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

Q上書き、修正、転記

入力用シートで、データシートから"名前"を検索し、
入力用シートへ転記をした後、修正をして元のデータシートへ
上書き転記をします。
新規転記、検索転記まで出来ましたが、上書き転記ができません。
参考になるサイトや、アドバイスを宜しくお願いします。

Aベストアンサー

>検索転記まで出来ましたが
データシートから入力シートに検索転記したのなら、上書き転記はその逆をするだけのような。。。
感じがしますけど、違うのかな。

Qexcel ユーザーフォームでシートごとに転記2

先日ユーザーフォームへの転記について質問させていただきました。
ご回答いただき、ありがとうございました。

今度はオプションボタンで選択したときに、シートごとに転記する方法を
教えていただけますでしょうか。

ユーザフォーム上で、オプションボタンを選択。
OptionButton1・・・シート1へ転記
OptionButton2・・・シート2へ転記
これをOKボタンを押したときに転記するようにしたいと思っています。

Private Sub OK_Click()

Dim CLrow As Long
Dim KYrow As Long


CLrow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
KYrow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row

If OptionButton1.Value = True Then

Worksheets("Sheet1").Range("A" & CLrow).Value = .TextBox1.Value

ElseIf OptionButton2.Value = True Then

Worksheets("Sheet2").Range("A" & KYrow).Value = .TextBox1.Value

End With

End Sub

ここまでやってみたのですが「参照が不正または不完全です」
と出てしまいます。

どなたかご教示願います。

よろしくお願いします。

先日ユーザーフォームへの転記について質問させていただきました。
ご回答いただき、ありがとうございました。

今度はオプションボタンで選択したときに、シートごとに転記する方法を
教えていただけますでしょうか。

ユーザフォーム上で、オプションボタンを選択。
OptionButton1・・・シート1へ転記
OptionButton2・・・シート2へ転記
これをOKボタンを押したときに転記するようにしたいと思っています。

Private Sub OK_Click()

Dim CLrow As Long
Dim KYrow As Long


CLrow = Worksheets("Sheet1").Ran...続きを読む

Aベストアンサー

>「参照が不正または不完全です」

…Value = .TextBox1.Value
     ↑ここのTextBox1の前のピリオドが「何にもぶら下がっていない」と警告のようですね。

End Withが書いてあるのに,対応するWithが書いてないのも間違いです。
If then構造がEnd Ifで閉じていないのも間違いです。


Private Sub OK_Click()

Dim xrow As Long

If OptionButton1.Value = True Then
xrow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
Worksheets("Sheet1").Range("A" & xrow).Value = me.TextBox1.Value

ElseIf OptionButton2.Value = True Then
xrow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row
Worksheets("Sheet2").Range("A" & xrow).Value = me.TextBox1.Value

End if

End Sub

>「参照が不正または不完全です」

…Value = .TextBox1.Value
     ↑ここのTextBox1の前のピリオドが「何にもぶら下がっていない」と警告のようですね。

End Withが書いてあるのに,対応するWithが書いてないのも間違いです。
If then構造がEnd Ifで閉じていないのも間違いです。


Private Sub OK_Click()

Dim xrow As Long

If OptionButton1.Value = True Then
xrow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
Worksheets("Sheet1").Range("A" & xrow).Value = me.TextBox1.Value

ElseIf ...続きを読む

Qマクロ 値の転記 再度

マクロ 値の転記 再度

昨日はkyboさんに解答を頂き大変助かりました。
ありがとうございました。

教えて頂いたコードを別のマクロでも活用しよう思ったのですが
どのように改変していけばいいのかまた悩んでいます。
度々で申し訳ありませんが、どなたか宜しくお願い致します。

やりたいこと
転記元のBに0以外の数字が入っている場合、転記先のA列に
同じ値を常に5回転記させたい。
"あ"を5回転記→1行あける→"う"を5回転記→(続く・・・)

★Sheet1 転記先(7行目から転記したい)
  A
-------------------
7 あ
8 あ
9 あ
10 あ
11 あ
--------------------
12 空行
--------------------
13 う
14 う
15 う
16 う
17 う
--------------------
18 空行
--------------------
19 以下 5つの纏まりの枠が300行位まで続く


★Sheet2 転記元(5行目からデータがある)
  A    B
--------------------
5 あ
6 あ
7 あ計  100
--------------------
8 空行
--------------------
9 い
10 い
11 い
12 い計  0
--------------------
13 空行
--------------------
14 う
15 う
16 う
17 う計  500
--------------------
18 空行
19 (以下、続く)


Sub テスト()
Dim i As Long
'転記元のデータ開始行は5行目
For i = 5 To 300
 '転記元のB列が0以外
 If Worksheets("転記元").Cells(i, "B") <> 0 Then
   Worksheets("転記先").Cells((i - 1) * 5 + 1, "A").Resize(5) _
= Worksheets("転記元").Cells(i, "A")
 End If
Next i
End Sub

マクロ 値の転記 再度

昨日はkyboさんに解答を頂き大変助かりました。
ありがとうございました。

教えて頂いたコードを別のマクロでも活用しよう思ったのですが
どのように改変していけばいいのかまた悩んでいます。
度々で申し訳ありませんが、どなたか宜しくお願い致します。

やりたいこと
転記元のBに0以外の数字が入っている場合、転記先のA列に
同じ値を常に5回転記させたい。
"あ"を5回転記→1行あける→"う"を5回転記→(続く・・・)

★Sheet1 転記先(7行目から転記したい)
  A
-------------------...続きを読む

Aベストアンサー

安易に教えて頂いたコードを理解せず、全く仕様の違う要件に同じコードで適用する事が問題です。
前回の仕様と今回の仕様の違いを認識することから行って下さい。
ヒント:(1)転記開始行が異なるので「i」は共有できない、(2)転記先の開始は7行目→13行目→19行と改行幅は「6」という事です。

QEXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作り

EXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作りました。そのワークシート上での定数や、プロシージャや関数をワークシートのモジュールに置いています。そして、その定数や関数などをユーザーフォームのイニシャライズなどで使いたいと思いますが、ユーザーフォームのモジュールはワークシートのモジュールとは別なので、使えません。他への影響を考えると、標準モジュールには、置くのは不適切だと思います。
特定のワークシート上でのみ使うユーザーフォームと、そのワークシートとで、共通の定数や関数などを使う方法は、あるのでしょうか。どのようにすればよいのでしょうか。

Aベストアンサー

>シートモジュールは多用しない方がいい

Excelの場合、シートというローカルモジュールを多数増やしてしまうのですが、その中のモジュール等は、共有性がないものがありますので、その都度、同じようなものを作る手間やメモリ配分を考えると、標準モジュールの方に書き込むという手段が取れるようになっていったと考えています。

あくまでも、Excelの問題ですが、Excelは他のOffice などとは違う特徴を持っています。それだけに、MS側も古い機能をExcel VBAには残しているようです。最大の問題は、シートモジュールはシートを親オブジェクトとして、一緒にコピーされたり、移動されたりしますが、完全に実行されないこともあったり、前の部分のオブジェクトの痕跡を残したり、都合の悪いことも往々にしてあります。ただし、イベントなど、シートオブジェクトに付随したものはこの限りではありません。

Excelのシートに該当するようなオブジェクトは、他のアプリケーションには基本的にはありません。
Wordなどは、Document は似ていても、ThisDocument モジュールと、表面のDocument は直結しています。
Access は、フォームによってコントロールしますから、共有の関数型プロシージャ等以外は、標準モジュールは使わないです。また、管理がしにくくなります。

今度は、Excelの標準モジュールを使う場合、単に、標準モジュールに書き込むというよりも、そのモジュールを機能別に別けていくということを考えるようにします。例えば、ワークブックを開けた時に、設定する場合はに、ThisWorkbook も一部は代わりにはなるのですが、多くは標準モジュールに書くのが一般的です。理由は、オートメーション化した場合、標準モジュールのほうが切り離しが行われるからです。

絶対に、標準モジュールでなくてはならない、ということはないのですが、標準モジュールは、そのままグローバル変数やグローバル・プロシージャや関数になっていますから、うっかり、Public ステートメントを忘れても、それで動かないということはありません。ただし、Class モジュールでは、必ず要求されることがあります。

>プログラミングはバグとの闘いです。それは間違わないように注意しても間違うのが人間だからです。より間違いにくいような環境が提供されている方が、やはり優れた環境だと思います。

私は、Excelの場合、バグとの闘いというような感覚はありません。数百行ぐらいでは、そんなに間違いを起こさないのです。プロシージャ・レベル、モジュールレベルの修正で、最初の設計の段階で、間違えていなければ、後は、ほとんどプロシージャ・レベルの修正になりますが、ただし、修正方法には独特の「コツ」があります。まずい時は、バグ探しはせずに、プロシージャ自体の全面取り替えということになります。だから、よほどのことがない限りは、バグつぶしというようなことはありません。

これは、VBAは、旧VB6と同じく、構造化をするから可能なのです。既存のオブジェクトは、確かに階層化はされていますが、それは、ほとんどのカスタマイズは難しいです。

>階層化を自分自身で構築できる方が、より間違いにくいと感じています。ワークシート上のユー……

私は、他の言語の知識もあるつもりですが、そういうものは、VBAにも、VBにもありませんね。たぶん、クラスの概念のことを言っているかもしれませんが、VBAで、最初から、そういうものを作っても、上手くできないはずです。もともと、オブジェクト指向は導入されていません。単なる真似事しかできません。

Excelは、OLEオブジェクトの集合体で、アプリケーションに対して、並列に並んでいると考えたほうがよいと思います。本当は、プロ・レベルの作成した作り方などを学べると良いのですが、掲示板の単発のコードでは、設計の仕方は分かりません。私たちがあれこれいっても、実際には、いろいろなものを作っていただいて、そこで自分で体得していただくしかありません。設計の仕方などは、以前のデベロッパーの書籍などには、多少、触れていたと思います。

マクロの作成で、ある程度の規模のマクロを何年か書いてきて、もしかしたら、こうかもしれない、というものが、確信に変わっていくものだと思います。

>シートモジュールは多用しない方がいい

Excelの場合、シートというローカルモジュールを多数増やしてしまうのですが、その中のモジュール等は、共有性がないものがありますので、その都度、同じようなものを作る手間やメモリ配分を考えると、標準モジュールの方に書き込むという手段が取れるようになっていったと考えています。

あくまでも、Excelの問題ですが、Excelは他のOffice などとは違う特徴を持っています。それだけに、MS側も古い機能をExcel VBAには残しているようです。最大の問題は、シートモジュ...続きを読む

Q仕訳してから勘定に転記や試算表が苦手です (簿記3級独学)

私は、6月の日商簿記検定試験3級受験に向けて、独学で勉強しています。
仕訳した後勘定に転記するのですが、よく転記ミスをしてしまいます。
仕訳したものを転記する問題は、勘定ごとにいっぺんに転記したほうがいいのでしょうか? たとえば、仕訳問題があって、現金なら現金だけを借方貸方全てを転記してから、他の勘定科目を転記するほうがいいのでしょうか?今までは問題の日付順に、借方にある科目を転記してから、貸方科目を日付順に転記していました。
例としたら、
1/1 現金 500 売上    500
1/2 仕入 1000 売掛金  1000
1/9 売掛金 1000 現金  1000
とした仕訳した場合、1/1現金500を転記して、次には1/2仕入1000、その次は1/9売掛金1000と、借方から転記して、借方と同じように貸方も、日付順に転記しています。
後、試算表も今勉強し終わったのですが、苦手です。今は問題集で、仕訳問題をやっていますが。
仕訳してからの転記ミスなのか、電卓での計算ミスなのか、貸借の合計が合わなかったりよくします。それに問題集とかの目標時間ではなかなか解くことが出来ません。
仕訳からの転記や、試算表の問題を解く時に、効率よくスムーズに問題を解くコツはあるでしょうか?
独学なもので、そういう解き方のコツとか知らないもので。
よろしくお願いします。

私は、6月の日商簿記検定試験3級受験に向けて、独学で勉強しています。
仕訳した後勘定に転記するのですが、よく転記ミスをしてしまいます。
仕訳したものを転記する問題は、勘定ごとにいっぺんに転記したほうがいいのでしょうか? たとえば、仕訳問題があって、現金なら現金だけを借方貸方全てを転記してから、他の勘定科目を転記するほうがいいのでしょうか?今までは問題の日付順に、借方にある科目を転記してから、貸方科目を日付順に転記していました。
例としたら、
1/1 現金 500 売上    500
1...続きを読む

Aベストアンサー

仕分後の勘定元帳への転記が苦手ということですか?
であれば、問題解いていれば慣れてくるので、大丈夫だと思います。
ちなみに自分は日付ごとにやります。

それでも出来ないようであれば、勘定元帳は作らずに、仕分したら
直接、試算表を作ってみてはどうですか?
これで転記ミスはなくなると思います。
あとは、落ち着いて、抜けと計算ミスがないように注意すれば大丈夫です。仕分を間違えなければ。
時間は慣れてくれば、十分間に合います。

QVBA データ左側から3文字で分類し新規シート転記

お知恵を貸して下さい。
エクセルに入力された問合せ内容をまとめていく上で困っています。
2列目の会員種別に入力されているデータがくせ者で、左側ら3文字で会員の種類が分かれます。

やりたい仕事は、この会員種別ごとに新規でシートを起こし、3文字mmというタイトルで(mmは上書きで書き換えます)保存までを自動化でしたいのです。
その際、元のデータから特定のセルを選んで転記するのではなく、あくまで会員種別の左から3文字で仕分けます。行は丸ごとコピーする必要があります。

新規シートでシート名までを自動で作成したいのでVBAかと思いまして。

どなたか助けて下さい、宜しくお願いします。

Aベストアンサー

1行目はタイトル行,2行目から実データとして。
会員種別がB列に列記されているとして。
(といったような具体的なあなたのシートのレイアウトは,そもそもご相談であなたの方から提示してください)


sub macro1()
 dim h as range
 dim w as worksheet
 dim s as string
 s = activesheet.name

’転記する
 on error goto errhandle
 for each h in range("B2:B" & range("B65536").end(xlup).row)
  h.entirerow.copy destination:=worksheets(left(h, 3)).range("A65536").end(xlup).offset(1)
 next
 on error goto 0

’保存する
 for each w in worksheets
  if w.name <> s then
   w.copy
   activeworkbook.saveas filename:="c:\test\" & activesheet.name & "mm.xls"
   activeworkbook.close savechanges:=false
  end if
 next
 exit sub

’シートを新調する
errhandle:
 worksheets.add after:=worksheets(worksheets.count)
 worksheets(s).range("1:1").copy destination:=activesheet.range("A1")
 activesheet.name = left(h, 3)
 resume
end sub

1行目はタイトル行,2行目から実データとして。
会員種別がB列に列記されているとして。
(といったような具体的なあなたのシートのレイアウトは,そもそもご相談であなたの方から提示してください)


sub macro1()
 dim h as range
 dim w as worksheet
 dim s as string
 s = activesheet.name

’転記する
 on error goto errhandle
 for each h in range("B2:B" & range("B65536").end(xlup).row)
  h.entirerow.copy destination:=worksheets(left(h, 3)).range("A65536").end(xlup).offset(1)
 ...続きを読む

Q超ビギナーです!仕訳→転記の仕方

超ビギナーです!仕訳→転記の仕方

3級受けようと思い勉強し始めたビギナーです。
全く独学のため超基本的なことがわからずとまどっています。

仕訳→転記の順について、たとえば

・商品\40,000を仕入れ(仕訳)、代金は小切手を振り出して支払った(仕訳)… →最後に転記
のように問題の最後にまとめて転記していたのですが、そうではなく

・商品\40,000を仕入れ(仕訳・転記)、代金は小切手を振り出して支払った(仕訳・転記)…

のようにその都度転記するものなのでしょうか?


試験の場合はどのようにするのが効率が良いか教えてください。
また実務ではどうされているのかも気になります。
どうぞよろしくお願いいたします!

Aベストアンサー

わたしは、設例のような場合には

> 商品40,000を仕入れ
「商品3区分法で回答を要しているから、借方は『仕入4万』だね」と考えて、
回答欄の借方に仕入4万を記入

> 代金は小切手を振り出して支払った
「小切手だから、貸方は『当座預金4万』だね」と考えて、
回答欄の貸方に当座預金4万を記入

当座貸越が発生しているかどうかは最後に確認して、貸越が発生した時以降の仕訳科目を『当座預金』の「預金」を消しゴムで消して「貸越」と書き換える。
1件ずつ「当座貸越」しているかどうかを考えながら仕訳していたら時間が掛かってムダと考えています。

Q別シートから値のある行を検索し、別シートに転記

シート1とシート2があり、

シート1のA7がシート2のB列にあり、シート1のB20がシート2のその行のD列の値と同じ場合、シート2該当行のF列の値をシート1のL20に書き込むのですが、どのようにマクロを記述すればいいでしょうか

例えば、
シート1のA7に「A社」、B20に「商品A」があり、 シート2のB10に「A社」が、D10に「商品A」がある場合、F10の値をシート1のL20に返す方法です。
シート2のB列には「B社」や「C社」もあるため、B列の中からシート1のA7と合致する行を検索することになります。

Aベストアンサー

あまり手の込んだことをせず簡単に,上から順番に調べます。

sub macro1()
 dim i as long
 for i = 1 to worksheets("Sheet2").range(B65536").end(xlup).row
  if worksheets("sheet2").cells(i, "B") = worksheets("Sheet1").range("A7") _
  and worksheets("sheet2").cells(i, "D") = worksheets("Sheet1").range("B20") then

   worksheets("Sheet1").range("L20") = worksheets("Sheet1").cells(i, "F")
   exit sub

  end if
 next i
end sub



#ご利用のエクセルのバージョンも相変わらずナイショのままですが,エクセル2007以降をご利用で,F列の値が数値であれば,SUMIFS関数を使った方が遙かに簡単です。
ご相談投稿では,普段あなたが使うソフトのバージョンまでキチンと明記する事を憶えて下さい。

あまり手の込んだことをせず簡単に,上から順番に調べます。

sub macro1()
 dim i as long
 for i = 1 to worksheets("Sheet2").range(B65536").end(xlup).row
  if worksheets("sheet2").cells(i, "B") = worksheets("Sheet1").range("A7") _
  and worksheets("sheet2").cells(i, "D") = worksheets("Sheet1").range("B20") then

   worksheets("Sheet1").range("L20") = worksheets("Sheet1").cells(i, "F")
   exit sub

  end if
 next i
end sub



#ご利用のエクセルのバージョンも相変...続きを読む

Q別表5(1)の未納法人税はどの別表から転記される?

別表5(1)の27~30の納税充当金と未納法人税等の部分は、別表5(2)と別表4のどちらから転記されてくるのでしょうか?

別表5(2)から転記されてくると、転記が簡単にできてわかりやすいように思います。
しかし別表4では納税充当金や損金計上法人税、損金計上住民税が留保とされ、別表5(1)に転記されるようにもなっています。

一体どちらから別表5(1)には転記されていくのですか?

Aベストアンサー

#2,4です。gihumではなくgihun(和名=義憤)です。

結論を簡潔に記述します。
結局のところ、別表5(1)の1欄から30欄までの間で、別表4と繋がっていないのは、未納法人税等(28欄~30欄)の[増]の部分だけなのです。この部分は、法人税等の中間納付発生額と確定額のことで、いずれも税務署に「うん」と言わせなければならない金額でした。で、それ以外は"すべて"別表4と繋がっています。


(参考1)
このことを念頭に、別表5(1)における期首利積と期末利積の関係を数式で記述すると、"論理学"を思い出すまでもなく、
期首利積+(繋がっている部分)+(繋がっていない部分)=期末利積
となります。期首利積と期末利積の間に介在するのは繋がっている部分と繋がっていない部分以外にはないのですから、上式は当たり前のことを言い表しているに過ぎません。
ここで改めて注書にある検算式の各項と対比してみると、
(繋がっている部分)というのは別表4の留保の合計、(繋がっていない部分)というのはまさに(中間+確定)のことであり、(繋がっていない部分)は現実には一般的にマイナスの数値ですね。つまり、検算式の左辺第3項は減算項を想定しています。
これで検算式の意味するところを理解できたと思います。

(参考2)
中間納付が還付されるときなど、税の還付が生じる場合には、正規には別表5(1)の25欄より上に、「未収還付法人税」などと記載し[増]欄にプラスの金額を記入します。この項目の本質は、「未納法人税」と同じで、符号がプラマイ逆なだけです。つまりこの部分も(繋がっていない部分)ということになります。勿論、税務署が「うん」という数値でなければなりません。
そして、還付がある場合は検算式における左辺第3項の「確定額」にはゼロを代入することになり、検算式は合いません。これが注書に「通常の場合には・・・」と記載されている所以です。
但し、未収還付法人税の金額を「マイナスの確定額(マイナスの未納法人税)」として28欄にマイナス記入したと考え、それを「確定額(但し、マイナスですが)」とおけば、検算式は合うのです。注書にある検算式は、還付ある場合のことには触れていないのです。

#2,4です。gihumではなくgihun(和名=義憤)です。

結論を簡潔に記述します。
結局のところ、別表5(1)の1欄から30欄までの間で、別表4と繋がっていないのは、未納法人税等(28欄~30欄)の[増]の部分だけなのです。この部分は、法人税等の中間納付発生額と確定額のことで、いずれも税務署に「うん」と言わせなければならない金額でした。で、それ以外は"すべて"別表4と繋がっています。


(参考1)
このことを念頭に、別表5(1)における期首利積と期末利積の関係を数式で記述すると、"論理学"を思い出すまで...続きを読む

QVBA ユーザーフォームの×ボタン制御の不具合

PowerPoint VBAで複数のユーザーフォームからなるVBAマクロを作成しました。

フォーム内の「次へ」「前へ」ボタンでのみ、マクロの実行制御をしているので、途中で右上の×を押されると、想定外エラーが発生します。

そこで、一番下に貼りつけたようなコードを全てのフォームに挿入することで、右上の×が表示されないようにしました。


あくまでフォームにしかコードは埋め込んでいません。
(標準モジュール、クラスには入ってません)

ですが、極稀に、「フォームの右上×」ではなく、「PowerPointの右上×」が非表示になってしまう現象が発生します。
いろいろやるうちに再現はするのですが、厳密な再現手順がよくわかりません。
状況と下記ソースから、どこらへんに原因がありそうかアドバイス頂けないでしょうか?

全コードは出せない部分が多いのですが、アドバイスにあたり必要なコードがあれば、別途貼らせて頂きます。



Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000

' ウィンドウに関する情報を返す
Private Declare Function GetWindowLong Lib "USER32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
' ウィンドウの属性を変更
Private Declare Function SetWindowLong Lib "USER32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
' Activeなウィンドウのハンドルを取得
Private Declare Function GetActiveWindow Lib "USER32.dll" () As Long
' メニューバーを再描画
Private Declare Function DrawMenuBar Lib "USER32.dll" (ByVal hWnd As Long) As Long

' フォームアクティブ時処理
Private Sub UserForm_Activate()

Dim hWnd As Long
Dim Wnd_STYLE As Long

hWnd = GetActiveWindow()
Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE)
Wnd_STYLE = Wnd_STYLE And (Not WS_SYSMENU)
SetWindowLong hWnd, GWL_STYLE, Wnd_STYLE
DrawMenuBar hWnd

End Sub

PowerPoint VBAで複数のユーザーフォームからなるVBAマクロを作成しました。

フォーム内の「次へ」「前へ」ボタンでのみ、マクロの実行制御をしているので、途中で右上の×を押されると、想定外エラーが発生します。

そこで、一番下に貼りつけたようなコードを全てのフォームに挿入することで、右上の×が表示されないようにしました。


あくまでフォームにしかコードは埋め込んでいません。
(標準モジュール、クラスには入ってません)

ですが、極稀に、「フォームの右上×」ではなく、「PowerPoint...続きを読む

Aベストアンサー

こんにちは。

今、見ただけで試験していませんが、どこかで拾ったコードでしょうか?

> hWnd = GetActiveWindow()

GetActiveWindow で、ハンドルを取るというのは目的が違うのではありませんか?

Office のバージョンによっても違いますが、現行では、UserForm のクラス名、"ThunderDFrame" だったはすですね。

だから、

Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'-------------------------------------------
strClassName = "ThunderDFrame"
hWnd = FindWindow(strClassName, Me.Caption)

などとしますね。もしかしたら、UserForm 自身に、ハンドルを持っているバージョンもあったような気がしますが、そうしたら、直接使ってください。

'-------------------------------------------
それと、
>Private Const GWL_STYLE = (-16)
>Private Const WS_SYSMENU = &H80000

Long型と指定したほうがよいのでは?

最後に、通常、UserForm で終了ボタンは消さずに、QueryClose イベントで処理するはずです。

こんにちは。

今、見ただけで試験していませんが、どこかで拾ったコードでしょうか?

> hWnd = GetActiveWindow()

GetActiveWindow で、ハンドルを取るというのは目的が違うのではありませんか?

Office のバージョンによっても違いますが、現行では、UserForm のクラス名、"ThunderDFrame" だったはすですね。

だから、

Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'--------------...続きを読む


人気Q&Aランキング