PHPなどは理解しておりますが、VBに関してはまったく素人で何もわからないものです。
今回、クリップボードの中身を常に監視して、ある文字列が含まれていたらそのまま、それ以外の文字列の場合は空にするアプリが必要になりました。
そこでネットでいろいろ探して次のように作りました。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'クリップボードの文字列データを取得する
Dim ClipBoardValue As IDataObject
Dim ClipBoardString As String
Dim okng As Boolean
Do
'クリップボードのデータを取得()
ClipBoardValue = Clipboard.GetDataObject
ClipBoardString = ClipBoardValue.GetData(DataFormats.Text).ToString
okng = ClipBoardString.Contains("反応あり")
If (okng) Then
'クリップボードに文字列をコピーする
Clipboard.SetDataObject("反応あり")
Else
Clipboard.SetDataObject("")
End If
Loop
End Sub
End Class
一つのフォームにボタンを一つ設置し、起動したら監視開始、ボタンをクリックしたら終了という形にしています。
動作させると、以下の問題があります。
・どんな文字をコピーしてもすぐ空になってしまう
・フォームが表示されない
・起動時にクリップボードの中身が空だとエラーが表示される
(オブジェクトのインスタンスにはnewを使用しろとかなんとか。。。)
正しい動作をするコードを教えていただけないでしょうか。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
タイマーを配置し、EnabledをTrueにした上で、
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim target As String = "ある文字列"
If Not String.IsNullOrEmpty(Clipboard.GetText) Then
If Not Clipboard.GetText.Contains(target) Then
Clipboard.Clear()
End If
End If
End Sub
これで動きます。
>どんな文字をコピーしてもすぐ空になってしまう
再現しないので原因不明ですが、Clipboard.SetDataObject("反応あり")は不要だと思います。
>フォームが表示されない
Page_Loadが無限ループで終了しないからです。
>起動時にクリップボードの中身が空だとエラーが表示される
「ClipBoardValue.GetData(DataFormats.Text).ToString」のClipBoardValue.GetData(DataFormats.Text)がNothing(VBでのnull)を返しているためです。
ToStringを呼ぶ前にNullチェックが必要です。
No.2
- 回答日時:
> どんな文字をコピーしてもすぐ空になってしまう
あらかじめ「反応あり」という単語がクリップボードに入っていないと
Clipboard.SetDataObject("")
で中身を空っぽにしているからです。目的のキーワードがクリップボードにないのなら、中身には手をつけない(SetDataやClearを呼び出さない)ことです。
> フォームが表示されない
Form_Loadイベント内で無限ループしている(イベントを完了していない)からです。実行ラインがForm_Loadを完了しないと、フォームは表示されません。
> 起動時にクリップボードの中身が空だとエラーが表示される
ClipBoardValue.GetData(DataFormats.Text)
この時点でnull(VBではNothing)であり、
.ToString()
がnullに対して実行されるのでNullReferenceExceptionが発生します。
テキストデータがクリップボードに格納されているかをチェックしてから取り出すようにしましょう。
<アドバイス>
まず、.NETのようなイベント駆動のアプリケーションにおいてイベントハンドラ内で無限ループは使いません。ウィンドウメッセージをそこで止めることになり、OSが用意したコントロールやコンポーネントが正しく動作しなくなります。しかもこの方法では、CPU稼働率が100%になり、システムのパフォーマンスを大きく低下させます。クリップボードの監視にはタイマーを使うほうがよいでしょう。
アプリケーションの終了に Endステートメント を用いるのは推奨されていません。Me.Close() としてフォームを閉じて終了してください。
> 正しい動作をするコードを教えていただけないでしょうか。
厳しいことを言いますが、ここはコードの代筆を依頼する場所ではありません。問題点と改善法は示しましたので、まずはご自分で考えてみてください。その上で、分からない部分があればもう少し範囲を絞って再度質問を出してください。
丁寧な解説ありがとうございました。
回答のコードそのものを寄越せというのは失礼だと重々承知しておりました。
ちょっと急いでいたのと、あまり難しい動作ではない(っと思った)ので正解をみて勉強したいという思いがあったのですが、回答する方には自力でやる気がないと取られてしまっても仕方がないですね。
失礼致しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームのテキストボ...
-
Form_Load と Form_Activate の...
-
MSGBOXのフォント大きさ変更
-
クリックイベントなのに、2回ク...
-
フォームのテキストボックスな...
-
VBAでユーザーフォームを再表示...
-
Excelにて、ユーザーフォームで...
-
ACCESSのフォーム、開くんです...
-
Microsoft Formsの「個人情報や...
-
【VBAユーザーフォームで閉じる...
-
テキストボックス入力データの...
-
エスケープキーを押して、フォ...
-
VBA(エクセル)のユーザー...
-
コントロールの存在確認
-
モードレスでユーザーフォーム...
-
FilemakerでCTI
-
VBA コンボボックスとテキスト...
-
Excelのユーザーフォームのテキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
クリックイベントなのに、2回ク...
-
Microsoft Formsの「個人情報や...
-
ユーザーフォームのテキストボ...
-
【VBAユーザーフォームで閉じる...
-
モーダルフォームとモードレス...
-
VBAでユーザーフォームを再表示...
-
エクセルVBAのフォームを最...
-
MSGBOXのフォント大きさ変更
-
Form_Load と Form_Activate の...
-
ユーザーフォーム上に現在日時...
-
Excelにて、ユーザーフォームで...
-
Hideについて(.NET)
-
フォームウィンドウを最前面に...
-
コントロールの存在確認
-
VBA(エクセル)のユーザー...
-
'ユーザーフォーム右上隅の[×...
-
エクセルVBA フォーム上でOnkey...
-
ブックをCloseまたはQuitで閉じ...
おすすめ情報