VB2005で複数のキーワードから数値を検出する方法

このQ&Aのポイント
  • VB2005入門者による、カンマ区切りのテキストからキーワードを元に数値を検出する方法について説明します。
  • 特定のキーワードを持つ行の数値を検出して変数に格納する方法をまとめました。
  • 複数のキーワードを条件として、カンマ区切りのテキストから数値を検出して格納する方法について説明します。
回答を見る
  • ベストアンサー

VB2005複数のキーワードから

VB2005入門者です。 カンマ区切りのテキスト"C:\DATA.txt"からキーワード"POINT"と"AA"をもとに 数値 "1" を検出し変数"answer"に格納したい場合 ------------------------------ POINT , AA , 1 , 2 , 3 , 4 POINT , AB , 5 , 6 , 7 , 8 NUM , AA , 9 , 10 , 11 , 12 NUM , AA , 13 , 14 , 15 , 16 POINT , AC , 17 , 18 , 19 , 20 ・'以下続く ・ ・ ------------------------------ 下記に何を加えればよいのでしょうか。 Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim reader As New System.IO.StreamReader("C:\DATA.txt", System.Text.Encoding.Default) Dim line As String Dim Field() As String Dim answer As Integer Do Until reader.EndOfStream line = reader.ReadLine() Field = line.Split(",") If Field(0) = "POINT" Then answer = Field(2) End If Loop End Sub ちなみに If Field(0) = "POINT" and Field(1) = "AA" Then ←ではエラーがでました。。。 又、同様のケースで10項目の処理を続けて行い、"answer"にカンマ区切りのまま続けて格納 したい場合はどのようにすればいいのでしょうか。 イメージは最後にexcelに貼り付けていきたいです。

  • npupu
  • お礼率68% (41/60)

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>If Field(0) = "POINT" And Field(1).Replace(" ", "") = "AA" Then >とすることで、なんとか"1"だけは拾うことができました。 例えば読み込んだ変数lineに含まれているかを判断して実行であれば、 Dim reader As New System.IO.StreamReader("R:\abcd.txt", System.Text.Encoding.Default) Dim line As String Dim Field As Object Dim i As Long = 0 Dim j As Long Dim answer() As Object ReDim answer(0 To 0) Do Until reader.EndOfStream line = reader.ReadLine() If (line.Contains("POINT") * line.Contains("AA")) Then Field = line.Split(",") answer(i) = Trim(Field(2)) i = i + 1 ReDim Preserve answer(0 To i) End If Loop For j = 0 To UBound(answer, 1) - 1 Debug.Print(answer(j)) Next Erase answer こんな方法でもいいのかな?

npupu
質問者

お礼

ありがとうございます。 不明個所があります Dim Field As Object ←なぜobjectなのかがわかりません。 If (line.Contains("POINT") * line.Contains("AA")) Then ← 文字列の特定にContainsを使うのですね! でもなぜ * なのでしょうか。

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

>Dim Field As Object ←なぜobjectなのかがわかりません。 ExcelVBAだとValiantを使ってますが、それがないので使ってました。 詳しくはないんですけどね。 >If (line.Contains("POINT") * line.Contains("AA")) Then ← 文字列の特定にContainsを使うのですね! >でもなぜ * なのでしょうか。 ヘルプでContainsを調べてみると、 「value パラメータがこの文字列内に存在するか、 value が空の文字列 ("") の場合は true。それ以外の場合は false。」 とあります。 ようは2つの検索結果を掛け算することで、 false * false = false (0) true * false = false (0) false * true = false (0) true * true = true (1) IF文はtrue(0以外)の時に以降を実行してますから、双方に存在していれば 実行する事になります。 ExcelVBAではたまに使う手法です。(式は違いますけど)

npupu
質問者

お礼

返事遅くなり申し訳ありませんでした。 丁寧な解説ありがとうございました!

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Dim reader As New System.IO.StreamReader("R:\abcd.txt", System.Text.Encoding.Default) Dim line As String Dim Field As Object Dim i As Long = 0 Dim answer() As Object ReDim answer(0 To 0) Do Until reader.EndOfStream line = reader.ReadLine() Field = line.Split(",") If Field(0).Contains("POINT") Then answer(i) = Field(2) i = i + 1 ReDim Preserve answer(0 To i) End If Loop MsgBox(UBound(answer, 1) & "_" & i) とか? Excelに貼り付けるのが目的であれば、ExcelVBAで行なうのはダメなのでしょうか? (VBは不得意です)

npupu
質問者

お礼

早速のアドバイスありがとうございます。 試したところ メッセージボックスには 3_3 が表示されました。 勉強不足の為、なぜ3_3が表示されるのかわからないので じっくり考えていきたいと思います。 複数キーワードで If Field(0) = "POINT" and Field(1) = "AA" Then にて"POINT"と"AA"から"1"を得られなかったのは 元のテキストにスペースが入っていたのが原因なようで If Field(0) = "POINT" And Field(1).Replace(" ", "") = "AA" Then とすることで、なんとか"1"だけは拾うことができました。 ExcelVBAではなくVBで作成しなければならない環境なので あえてVB2005を使用しています。

関連するQ&A

  • VB2005 配列から要素を検索する方法

    VB2005入門者です。 配列の中要素を検索し、一致すれば処理を行うというプログラムを組みたいのですがうまくいきません。 1列目hoge_nameと2列目hoge_noが既に配列に代入してあり 0列目 POINT と1列目hoge_name[AやB]と2列目hoge_no[A00~A03]が一致した場合、3列目のhoge_id(0)からhoge_id(17)に格納したいのです。 hoge.txtは BEBE,A,A00  ,ABC POINT,A,A00  ,ABC POINT,A,A01 ,DEF POINT,B,A02 ,ABC ETC,A,A03   ,GHI POINT,B,A03  ,GHI POINT,A,A03  ,GHI といった感じで、スペースが不特定数混じったカンマ区切りテキストです。 以下で実行すると6行目の3列目でA04を探してしまい、6行目の情報をとってくれません。 hoge_no配列に含まれる文字列から検索し、一致した場合に処理できれば解決するのでは、と思いましたが。Allay.indexOfを試したりしましたがうまくいきませんでした。アドバイス頂きたいのでどなたかよろしくお願いします。 Dim reader1 As New System.IO.StreamReader(geo_name, System.Text.Encoding.Default) Dim i As Long = 0 Dim j As Long Dim answer() As String ReDim answer(0 To 0) Do Until reader1.EndOfStream line = reader1.ReadLine() If (line.Contains("POINT")) Then field = line.Split(",") answer(i) = Trim(field(1)) + "," + (field(2).Trim) + "," + (field(7)) If (field(1).Trim = hoge_name(i) = True And field(2).Trim = hoge_no(i)) = True Then hoge_id(i) = field(7) i = i + 1 ReDim Preserve answer(0 To i) ReDim Preserve hoge_id(0 To i) End If End If Loop For j = 0 To UBound(answer, 1) - 1 reader.Close() Next

  • VBを2008を用いてCSVを取り込む ””で区切られていない数値混入

    VBを2008を用いてCSVを取り込む ””で区切られていない数値混入 文字列に,が含まれている場合がある。 題名どおりなのですが、以下のようなCSVファイルをVB2008で取り込もうと考えています。 "AAAAA",BBBBB,CCCCC,"DDDD,DDD","EEEEE","FFFFF" (同じアルファベットが本来同じ項目のデータ、BとCは0-9の数字のみ入ります またBCには常に””が含まれません。 Dは文字列なのですが、まれに「,」が含まれます) 下のものが現在使用しているソースですがsplitで「,」を指定しているので 当然Dが2つのデータとして認識されています。 BやCが””で囲まれていれば「”,”」で区切ればすむのですが一部が””なしなので どうやろうか迷っています。 実現したいこととしては ""なしの時は必ず、コンマまでが1つのデータ、 ""があれば""で区切られたデータが1つのデータとできればいいんですが。。。 以下ソースです。 ちなみにASPXファイルです。 (replaceDoubleQuotesというのは”を削除するための関数で無視していただいて結構です。 また以下のソースでは取り込み自体はせずにタイトル行がはいっているCSVファイルを弾く作業をしているのですが CSVからデータを取り出す作業は同じなので短いソースを使用させてもらっています) Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim Reader2 As New IO.StreamReader("C:\UploadedFiles\Uriage.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items2() As String 'CSVの各項目を表す配列 Dim Line2 As String = Reader2.ReadLine 'CSVの一行 Items2 = Line2.Split(",") Dim num_hantei As String = "^[0-9]+$" If Not (Regex.IsMatch(replaceDoubleQuotes(Items2(3)), num_hantei)) Then Dim objFSO As Object objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile("C:\UploadedFiles\Uriage.txt", True) objFSO = Nothing Label1.Text = "取り込みエラー。タイトル行がはいっている可能性があります。" Exit Sub End If Reader2.Close() End Sub Function replaceDoubleQuotes(ByVal apdata As Object) As String '文字列に変換する Dim tmp As String = String.Format("{0}", apdata) '1つのダブルクォーテーションを0個に置換する つまり消去する replaceDoubleQuotes = tmp.Replace("""", "") End Function

  • VB OpenFileDialogと読み込み

    OpenFileDialogを使用したテキストファイルの読み込みについて質問します。 TextFile.txt, TextFile2.txt, TextFile3.txt(内容は名前,電話番号)というファイルがあるとし、OpenFileDialogで選択してラベルまたはテキストボックスに表示させたいのですが、TextFile.txti以外のファイルを選んでもTextFile.txtの内容が表示されます。 VBの本に載っている二つのコードをそのまま使用してみました。 Imports Microsoft.VisualBasic.FileIO Public Class Form1 ' decrare modul level variable 'モジュールレベルの宣言 Private NamePhoneTextFieldParser As TextFieldParser Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Instatiate the ThextFieldPerser and set the deliminate 'Deliminateの設定とか Dim Filestring As String = "TextFile.txt" Try NamePhoneTextFieldParser = New TextFieldParser(Filestring) NamePhoneTextFieldParser.TextFieldType = FieldType.Delimited NamePhoneTextFieldParser.SetDelimiters(",") Catch ex As Exception MessageBox.Show("Unable to read the file:" & Filestring, "File Error") End Try End Sub Private Sub OFDBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OFDBtn.Click Dim ReponseDialogResult As DialogResult Dim stream As System.IO.Stream ' Set up and display the OpenFileDialog 'OpenFIleDialogのセットアップ With OpenFileDialog1 .FileName = "TextFile.txt" .Title = "Directory for File" .Filter = "Text File (*.txt)|*.txt|All Files (*.*)|*.*" 'DIsplay Dialog Box ReponseDialogResult = .ShowDialog If ReponseDialogResult = DialogResult.OK Then stream = OpenFileDialog1.OpenFile() Else Exit Sub End If '電話番号と名前をファイルから読み取る On Error Resume Next Dim FieldString() As String ' Must be a strng array for deliminated fields If Not NamePhoneTextFieldParser.EndOfData Then FieldString = NamePhoneTextFieldParser.ReadFields() ' 最初の Field Nametxt.Text = FieldString(0) '二番目の Field Phonetxt.Text = FieldString(1) Else MessageBox.Show("No more records to display.", "End of Data") End If End With End Sub End Class です。 Dim Filestring As String = "TextFile.txt" NamePhoneTextFieldParser = New TextFieldParser(Filestring) または .FileName = "TextFile.txt" のどれかが影響しているのかなと疑っているのですが(特に前者)、合ってますでしょうか? 上記のコードでTextFile.txtを指定してしまっているのを、TextFile2.txt, TextFile3.txtと自分で選択したものを読み込ませて表示させたい場合、どう記述を変更したらよいでしょうか? ちなみにいずれのテキストファイルもカンマで区切られた一組の名前と電話番号です。

  • VBのテキスト書き込み読み出し

    VB初心者です。 VBのテキスト書き込み読み出しについて質問させていただきます。 ~使用オブジェクト~ textbox1 textbox2 button1 button2 現在下記の通りtextbox1とtextbox2に書いた文字(length 10まで)をbutton1 clickで C:\test.txtに書き出し、 button2 clickでtextbox1 と textbox2に戻すプログラムを書いてみました。 読み込みのところが現在は2個ですが、実用的には膨大な数にしたいと思っています。 単純に沢山書けばいいのでしょうが現実的ではないのでスッキリと書く書き方はないでしょうか? さらに、例としてtextbox1にAさんの名前textbox2にAさんの年齢をいれたとします。 その際、Bさん以降を登録したいのですがその場合テキストへの書き込みを次行に書き込み 次行を読み込むにはどのように書けばよろしいでしょうか? ご教授お願い致します。 Public Class Form1 '##################################################### '"C:\test.txt"へ書き込み '##################################################### Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim write_data As New System.IO.StreamWriter("C:\test.txt", False, _ System.Text.Encoding.Default) Dim str As String Dim str1 As String str = String.Format("{0, -10}", TextBox1.Text) str1 = String.Format("{0, -10}", TextBox2.Text) write_data.Write(str & str1) write_data.Close() End Sub '##################################################### '"C:\test.txt"の読み込み '##################################################### Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim Reader As New IO.StreamReader("C:\test.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) While Reader.Peek() > -1 '10文字取得 Dim c(9) As Char Dim d(9) As Char Reader.ReadBlock(c, 0, c.Length) Reader.ReadBlock(d, 0, d.Length) TextBox1.Text = c TextBox2.Text = d End While Reader.Close() End Sub End Class

  • Visual Basicでデータベース接続について

    こんにちは。 VB初心者です。 前任者が作成したCSVファイルをメモリに格納するプログラムから Oracleテーブルのデータからメモリへ格納するプログラムへ 変更したいのですが、全くのVB初心者でわかりません。 ヒントでもいいですので教えてください。 CSVファイルをメモリに格納するプログラムは以下の通りです。 Function ReadCSV(ByVal szFilePath As String) As String()() ' (全般) に Imports 追記 ' Imports System.IO ' Imports System.Text Dim arrayTempLines()() As String = {} ' ストリームを開きます Dim reader As New IO.StreamReader(szFilePath, System.Text.Encoding.Default) Dim iIdx As Integer = 0 ' 一気に読み込みます Dim szData As String = reader.ReadToEnd() ' 不要な文字を取り除きます szData = szData.Replace(vbCr, "") ' 改行で分離して配列に格納します Dim arrayLines() = szData.Split(vbLf) Dim szLine As String For Each szLine In arrayLines Dim iCount As Integer = 0 Dim szTemp As String = "" Dim bValid As Boolean = False If szLine.Length > 1 Then ' 配列の追加します ReDim Preserve arrayTempLines(iIdx) ' カンマ区切りで分離して配列に格納します arrayTempLines(iIdx) = szLine.Split(",") ' データのチェックをします If arrayTempLines.Length >= 1 And _ arrayTempLines(iIdx)(0) <> "" Then bValid = True ' 不要データを除きます For Each szTemp In arrayTempLines(iIdx) arrayTempLines(iIdx)(iCount) = _ szTemp.Replace(Chr(34), "").TrimEnd() ' Chr(34)は"のことを指します iCount += 1 Next ' 配列数チェックをします If bValid Then iIdx += 1 End If Next ' 配列を切り詰めます 'ReDim Preserve arrayTempLines(iIdx - 1) ' 読み込み用のストリームを閉じます If (Not reader Is Nothing) Then reader.Close() reader = Nothing End If ReadCSV = arrayTempLines End Function 以上です。 ちなみに、Oracleテーブルの中にはフィールドが二つあります。

  • VB6.0にてStreamReaderを使用したいのですが、

    VB6.0にてStreamReaderを使用したいのですが、 Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", のコードが赤字でエラーになります。 どう修正すればよろしいでしょうか? ご存知の方教えてください。よろしくお願いします。 Dim strTemp As String Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) strTemp = Reader.ReadToEnd msgobox strTemp Reader.Close

  • VB2010 bitmapとして取り込む

    現在、panelを移動させて図形を作成するプログラムを書いています。 このpanelを移動させて作成した図形を画像?(bitmap等)として取り込み、他のフォームで読み込ませたいと考えております。 panelを移動させるコード Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown Panel4.AllowDrop = True End Sub Private Sub Panel1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown, Panel2.MouseDown, Panel3.MouseDown sender.DoDragDrop(sender, DragDropEffects.Move) End Sub Private Sub Panel4_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel4.DragDrop Dim srsPnl As Panel = e.Data.GetData(GetType(Panel)) Dim dstPnl As New Panel dstPnl.Size = srsPnl.Size dstPnl.Location = Panel4.PointToClient(CursorPosition) 'New Point(e.X, e.Y) dstPnl.BackColor = srsPnl.BackColor AddHandler dstPnl.MouseDown, AddressOf dstPnl_MouseDown AddHandler dstPnl.MouseMove, AddressOf dstPnl_MouseMove Panel4.Controls.Add(dstPnl) End Sub Private Sub Panel4_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel4.DragEnter If e.Data.GetDataPresent(GetType(Panel)) Then e.Effect = DragDropEffects.Move End If End Sub Private previousPos As Point Private Sub dstPnl_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown previousPos = CursorPosition() End Sub Private Sub dstPnl_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) If e.Button = Windows.Forms.MouseButtons.Left Then Dim nowPos As Point = CursorPosition() DirectCast(sender, Panel).Left += nowPos.X - previousPos.X DirectCast(sender, Panel).Top += nowPos.Y - previousPos.Y Console.WriteLine(nowPos.X & "-" & previousPos.X) previousPos = nowPos End If End Sub Function CursorPosition() As Point Return New Point(CInt(Cursor.Position.X / 10) * 10, CInt(Cursor.Position.Y / 10) * 10) End Function 上記のコードでpanel4へpanel1,panel2,panel3を自由に移動させて任意の図形を作成することができます。 このコードを用いて画像のような図形を作った際に、その図形を他のフォームで読み込ませたいです。 わかる方がいらっしゃいましたら、お力添えしていただけると幸いです。 よろしくお願いします。

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

  • マウスで画像の移動(VB2010)

    FormにPanelを配置してそのなかにPicturBoxを配置しています。 エクスプローラから画像をドラッグアンドドロップして、マウスで画像を移動させようと考えています。 (Panelのサイズを250,250にして、1024*768ピクセルの画像の一部を窓から見ているような感じ) 下記のコードを書いたのですが、マウスを左クリックした状態のままマウスを移動させると、画像がちらつきます。 PictureBox1.Refresh()を入れて多少現象しましたが、根本的な問題の解決には至っておりません。 どなたか?詳しい方いらっしゃいましたら教えて頂けないでしょうか?宜しくお願いいたいます。 Private drawFlag As Boolean Private ptStart As Point Private ptEnd As Point Private Sub PictureBox1_DragEnter(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles PictureBox1.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub Private Sub PictureBox1_DragDrop(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles PictureBox1.DragDrop Dim strFileName As String() = CType(e.Data.GetData(DataFormats.FileDrop), String()) Dim fi As New System.IO.FileInfo(strFileName(0)) Dim MyBmp As Bitmap = System.Drawing.Image.FromFile(strFileName(0)) PictureBox1.Image = MyBmp End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize PictureBox1.AllowDrop = True drawFlag = False End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseMove If drawFlag = False Then Exit Sub End If ptEnd = e.Location Dim ptMove As Point ptMove = ptEnd - ptStart Dim MyLocation As Point MyLocation = PictureBox1.Location + ptMove PictureBox1.Location = MyLocation PictureBox1.Refresh() ptStart = ptEnd End Sub Private Sub PictureBox1_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then drawFlag = True ptStart.X = e.X ptStart.Y = e.Y End If End Sub Private Sub PictureBox1_MouseUp(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseUp drawFlag = False End Sub