[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォーム上でのコピー貼り付け』(ひで)
ユーザーフォーム上にラベル枠を貼り付けて 文字を表示しています。 ここに表示されている文字をコピーし 同一のフォーム上のテキストボックスに貼り付ける事って 可能でしょうか。もしできるとしたら どのように設定すればよいのでしょうか。 また,テキストボックス上の文字も範囲設定はできるのですが, コピーできません。これも可能かどうか教えてください。
よろしくお願いいたします。
LabelはCaption でTextBoxはValue ですね。
>テキストボックス上の文字も範囲設定はできるのですが, >コピーできません。
Ctrl + C でコピーできます。 貼付けは、 Ctrl + V です。 (MARBIN)
>LabelはCaption
でTextBoxはValue ですね。
そういう設定になっています。
ラベル上ではやはりキーボード,マウスともに無理でしょうか。
(ひで)
>LabelはCaption >でTextBoxはValue >ですね。
これはVBAで転記する場合です。 Me.TextBox1.Value = me.Label1.Caption
>ラベル上ではやはりキーボード,マウスともに無理でしょうか。 無理だと思います。 むしろ、ユーザーに操作させたくないときにLabelが好んで使われます。 (MARBIN)
私も無理だとは、思いますが、無理に作れば 可能ですよ!!
(但し、ラベルのドラッグは出来ませんが)
こんな例で考えます。
ユーザーフォーム上にラベルをひとつ、
テキストボックスを二つ、コマンドボタンをひとつ
配置したものを作ります。
コマンドボタンのクリックでひとつのテキストボックスの内容をラベルに表示する
機能としては、これだけのユーザーフォームです。
新規ブックに ユーザーフォームを作成します
ユーザーフォーム(UserForm1)
ラベル1 ラベル という見出し
ラベル2 テキストボックスの内容を表示する
ラベル3 テキストという見出し
テキストボックス1 ラベルに表示する内容を入力する
ラベル4 テキストという見出し
テキストボックス2 ラベル2の内容を貼り付けるために使用
コマンドボタン テキストボックス1の内容をラベル2に表示
こんなユーザーフォームを作成します。
このユーザーフォームの中で ラベル2とテキストボックス2に関して、
マウスでコピー&ペースト(カット&ペースト)の実現を考えます。
(但し、ラベルは、コピーだけ)
本来なら、これらは事前にコントロールを配置すれば簡単ですが、
同期をとるためにコントロールの配置はコードで行います。
では、コードです。
新規ブックにユーザーフォーム(UserForm1)だけ作成してください。
コントロールは、コードで作成しますから、何も配置しないで下さい。
このUserForm1のモジュールに
'============================================================================
Option Explicit
Private lbl As MSForms.Label
Private txt1 As MSForms.TextBox
Private txt2 As MSForms.TextBox
Private WithEvents btn As MSForms.CommandButton
Private Class_ccp As Class1
Private Sub btn_Click()
lbl.Caption = txt1.Text End Sub
Private Sub UserForm_Initialize()
'****************************************************************
With Me .Width = 316 .Height = 220 With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 24 .Width = 60 .Height = 18 .Caption = "ラベル" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set lbl = .Controls.add("Forms.Label.1", , True) With lbl .Left = 71.95 .Top = 24 .Width = 222 .Height = 18 .Caption = "" .BackColor = &HFFFFC0 .Font.Size = 14 .SpecialEffect = 2 End With With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 60 .Width = 60 .Height = 18 .Caption = "テキスト1" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set txt1 = .Controls.add("Forms.TextBox.1", , True) With txt1 .Left = 71.95 .Top = 60 .Width = 222 .Height = 18 .Font.Size = 12 End With With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 96 .Width = 60 .Height = 18 .Caption = "テキスト2" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set txt2 = .Controls.add("Forms.TextBox.1", , True) With txt2 .Left = 71.95 .Top = 96 .Width = 222 .Height = 18 .Font.Size = 12 End With Set btn = .Controls.add("Forms.CommandButton.1", , True) With btn .Left = 168 .Top = 132 .Width = 126 .Height = 42 .Caption = "テキスト--->ラベル" End With End With '********* ここまでは、本来は、事前にコントロールを配置すれば、要らないコードです Set Class_ccp = New Class1 With Class_ccp .init .add lbl .add txt2 End With End Sub
Private Sub UserForm_Terminate()
Class_ccp.term End Sub
次にコピー&ペーストを実現するクラスモジュールを二つ作ります。
一つ目のクラスモジュール クラス名 Class1
'===============================================================================
Option Explicit
Private WithEvents btnCopy As Office.CommandBarButton
Private WithEvents btnCut As Office.CommandBarButton
Private WithEvents btnPaste As Office.CommandBarButton
Private barM As Office.CommandBar
Private conttmp As MSForms.Control
Const Bnm As String = "ccpmenu"
Const Ctxt As String = "TextBox"
Const Clbl As String = "Label"
Private cpt() As Class2
Sub init()
On Error Resume Next Application.CommandBars(Bnm).Delete Set barM = Application.CommandBars.add(Bnm, msoBarPopup, , True) With barM Set btnCut = .Controls.add(msoControlButton) btnCut.Style = msoButtonCaption btnCut.Caption = "切り取り" Set btnCopy = .Controls.add(msoControlButton) btnCopy.Caption = "コピー" btnCopy.Style = msoButtonCaption Set btnPaste = .Controls.add(msoControlButton) btnPaste.Caption = "貼り付け" btnPaste.Style = msoButtonCaption End With End Sub Sub term() On Error Resume Next Dim g0 As Long For g0 = LBound(cpt()) To UBound(cpt()) Set cpt(g0) = Nothing Next Application.CommandBars(Bnm).Delete On Error GoTo 0 End Sub Sub add(ByVal Cobj As MSForms.Control) Dim g0 As Long On Error Resume Next g0 = UBound(cpt()) + 1 If Err.Number <> 0 Then g0 = 1 ReDim Preserve cpt(1 To g0) Set cpt(g0) = New Class2 If TypeName(Cobj) = Ctxt Then Set cpt(g0).Txtev = Cobj ElseIf TypeName(Cobj) = Clbl Then Set cpt(g0).Lblev = Cobj End If Set cpt(g0).parent = Me cpt(g0).id = g0 On Error GoTo 0 End Sub Sub callback(ByVal contP As MSForms.Control) Set conttmp = contP If TypeName(conttmp) = Ctxt Then btnCut.Enabled = True btnPaste.Enabled = conttmp.CanPaste ElseIf TypeName(conttmp) = Clbl Then btnCut.Enabled = False btnPaste.Enabled = False End If barM.ShowPopup End Sub Private Sub btnCopy_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Copy ElseIf TypeName(conttmp) = Clbl Then Dim dobj As DataObject Set dobj = New DataObject dobj.SetText conttmp.Caption dobj.PutInClipboard Set dobj = Nothing End If End Sub Private Sub btnCut_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Cut End If End Sub Private Sub btnPaste_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Paste End If End Sub
二つ目のクラスモジュール クラス名 Class2
'=================================================================================
Option Explicit
Public WithEvents Txtev As MSForms.TextBox
Public WithEvents Lblev As MSForms.Label
Public id As Long
Private cpo As Object
Property Set parent(pcpo As Object)
Set cpo = pcpo End Property Private Sub Lblev_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = 2 Then cpo.callback Lblev End If End Sub Private Sub Txtev_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = 2 Then cpo.callback Txtev End If End Sub
最後に標準モジュールに
'=========================================================================
Option Explicit
Sub main()
UserForm1.Show End Sub
標準モジュールは、これだけ・・・。
mainを実行してみてください。
・ユーザーフォームが表示されます。
・テキスト1に何か入力して コマンドボタンをクリックしてください。
・入力内容がラベルに表示されます。
・入力内容が表示されたラベルにマウスをポイントし、右クリックしてください。
・コピーのメニュー(ラベルの場合は、コピーのみ可)が表示されます。
「コピー」をクリックしてください
・テキスト2をマウスでポイントし、右クリックしてください。
同じメニューが表示されます(今度は、3機能全部 可)。
ペーストをクリックすると、テキスト2にラベルの内容が表示されます。
上記のコードでは、表示ラベルとテキスト2のみ「コピー&ペーストメニュー」を表示するように
設定してあります。
うまくいくようでしたら
コードを理解して、テキスト1でも「コピー&ペーストメニュー」が表示されるように
設定してみてください。
この改良自体は コードが理解できれば簡単です。
また、クラスモジュールにしてありますから、
再利用が簡単に出来るようになっています。
ichinose
本来は、この二つのクラスモジュールは、別プロジェクトに保存して(アドインファイル)
、これを参照設定して使います。
そうしておくと、Class1とClass2の中身が隠蔽でき、
ユーザーは、インターフェースだけ知っていれば利用できますよね!!
ichinose
ichinoseさん、すばらしいコードですね。やりたいことはほとんどこれなんです。 尊敬に値します。
ただ、すでに作ってしまったるユーザーフォーム上のラベル(ラベル88)に表示されてい る文字列を 何とか範囲選択してコピーできるようにしたかったのです。
そして同一フォーム上にあるテキストボックス(テキストボックス31,32,33, 34=4つです)に貼り付けられればいいと思いました。貼り付けるテキストボックスは任意で貼り付けたいテキストボックス上で右クリックなどでできないかと思ったのです。
ichinoseさんの作成していただいたコードを変更するのは 今の初心者である今の私には難解です。
ありがとうございます。時間はかかるかもしれませんが、理解できるようにがんばりま す。 もし、これからも教えていただけるのならよろしくお願いいたします。(ひで)
** すでに作ってしまったるユーザーフォーム上のラベル(ラベル88)に表示されてい る文字列を 何とか範囲選択してコピーできるようにしたかったのです。
これは、コントロールがラベルだと私には、方法が見つかりません。
代替案として、このラベル88もテキストボックスに変えてしまうという案はいかがですか? 前回、私が提示したコードのラベル2をラベルでなく、テキストボックスにするということです。
テキストボックスでも入力不可にすることはできますからねえ・・・。
ラベルをテキストボックスに変えただけのコードを提示しますから、検討してみてください。 尚、クラスモジュールに訂正もありましたから、併せて投稿します。
前回同様、新規ブックにユーザーフォーム(UserForm1)だけ作成してください。 UserForm1のモジュールに
'=================================================================================== Option Explicit Private txt_lbl As MSForms.TextBox Private txt1 As MSForms.TextBox Private txt2 As MSForms.TextBox Private WithEvents btn As MSForms.CommandButton Private Class_ccp As Class1 Private Sub btn_Click() txt_lbl.Text = txt1.Text End Sub Private Sub UserForm_Initialize() '**************************************************************** With Me .Width = 316 .Height = 220 With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 24 .Width = 60 .Height = 18 .Caption = "ラベル" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set txt_lbl = .Controls.add("Forms.TextBox.1", , True) With txt_lbl .Left = 71.95 .Top = 24 .Width = 222 .Height = 18 .Text = "" .BackColor = &HFFFFC0 .Font.Size = 12 .SpecialEffect = 2 .Locked = True .TabStop = False End With With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 60 .Width = 60 .Height = 18 .Caption = "テキスト1" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set txt1 = .Controls.add("Forms.TextBox.1", , True) With txt1 .Left = 71.95 .Top = 60 .Width = 222 .Height = 18 .Font.Size = 12 End With With .Controls.add("Forms.Label.1", , True) .Left = 12 .Top = 96 .Width = 60 .Height = 18 .Caption = "テキスト2" .BackColor = &HC0FFFF .Font.Size = 14 .SpecialEffect = 2 End With Set txt2 = .Controls.add("Forms.TextBox.1", , True) With txt2 .Left = 71.95 .Top = 96 .Width = 222 .Height = 18 .Font.Size = 12 End With Set btn = .Controls.add("Forms.CommandButton.1", , True) With btn .Left = 168 .Top = 132 .Width = 126 .Height = 42 .Caption = "テキスト--->ラベル" End With End With '********* ここまでは、本来は、事前にコントロールを配置すれば、要らないコードです Set Class_ccp = New Class1 With Class_ccp .init .add txt_lbl .add txt2 End With End Sub Private Sub UserForm_Terminate()
Class_ccp.term End Sub
Class1のモジュールに
'==================================================================================== Option Explicit Private WithEvents btnCopy As Office.CommandBarButton Private WithEvents btnCut As Office.CommandBarButton Private WithEvents btnPaste As Office.CommandBarButton Private barM As Office.CommandBar Private conttmp As MSForms.Control Const Bnm As String = "ccpmenu" Const Ctxt As String = "TextBox" Const Clbl As String = "Label" Private cpt() As Class2 Sub init() On Error Resume Next Application.CommandBars(Bnm).Delete Set barM = Application.CommandBars.add(Bnm, msoBarPopup, , True) With barM Set btnCut = .Controls.add(msoControlButton) btnCut.Style = msoButtonCaption btnCut.Caption = "切り取り" Set btnCopy = .Controls.add(msoControlButton) btnCopy.Caption = "コピー" btnCopy.Style = msoButtonCaption Set btnPaste = .Controls.add(msoControlButton) btnPaste.Caption = "貼り付け" btnPaste.Style = msoButtonCaption End With End Sub Sub term() On Error Resume Next Dim g0 As Long For g0 = LBound(cpt()) To UBound(cpt()) Set cpt(g0) = Nothing Next Application.CommandBars(Bnm).Delete On Error GoTo 0 End Sub Sub add(ByVal Cobj As MSForms.Control) Dim g0 As Long On Error Resume Next g0 = UBound(cpt()) + 1 If Err.Number <> 0 Then g0 = 1 ReDim Preserve cpt(1 To g0) Set cpt(g0) = New Class2 If TypeName(Cobj) = Ctxt Then Set cpt(g0).Txtev = Cobj ElseIf TypeName(Cobj) = Clbl Then Set cpt(g0).Lblev = Cobj End If Set cpt(g0).parent = Me cpt(g0).id = g0 On Error GoTo 0 End Sub Sub callback(ByVal contP As MSForms.Control) Set conttmp = contP If TypeName(conttmp) = Ctxt Then btnCut.Enabled = Not conttmp.Locked btnPaste.Enabled = conttmp.CanPaste ElseIf TypeName(conttmp) = Clbl Then btnCut.Enabled = False btnPaste.Enabled = False End If barM.ShowPopup End Sub Private Sub btnCopy_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Copy ElseIf TypeName(conttmp) = Clbl Then If conttmp.Caption <> "" Then Dim dobj As DataObject Set dobj = New DataObject dobj.SetText conttmp.Caption dobj.PutInClipboard Set dobj = Nothing End If End If End Sub Private Sub btnCut_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Cut End If End Sub Private Sub btnPaste_Click( _ ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) If TypeName(conttmp) = Ctxt Then conttmp.Paste End If End Sub
Class2のモジュール
'=============================================================================== Option Explicit Public WithEvents Txtev As MSForms.TextBox Public WithEvents Lblev As MSForms.Label Public id As Long Private cpo As Object Property Set parent(pcpo As Object) Set cpo = pcpo End Property Private Sub Lblev_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = 2 Then cpo.callback Lblev End If End Sub Private Sub Txtev_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = 2 Then cpo.callback Txtev End If End Sub
最後に
標準モジュールに
'===================================================================== Option Explicit Sub main() UserForm1.Show End Sub
これで mainを実行して、前回と同様な処理を行ってみてください。
今度は、文字列の選択が出来るでしょう!!
これで代替できませんか?
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.