パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

VBのフォームから、Accessのレポートを印刷する(VisualStudio.NET以降)

2011-07-28 09:00:16 | Visual Basic
今日は、久しぶりにViasual Basicを取り上げます。

現在制作中の業務管理システムにおいて、
VBからAccessのレポートを印刷する必要が出てきました。

そこで、その方法をご紹介します。

今回は、VBのフォームにあるボタンをクリックすると、
指定されたアクセスファイルが開かれ、指定したレポートを印刷するという処理を実装します。

アクセスファイルは、VBの実行ファイルと同じフォルダ内に用意しておいてください。
実行ファイルは、デバッグの際には、保存したプロジェクトフォルダの中の
binフォルダ内のDebugフォルダ内に作成されます。
ここに今回は、yaoya.mdbという名前のアクセスファイルをコピーしておきます。
また、印刷するレポート名は、「卸商品明細」とします。




まずは、VisualStudioを起動し、任意の名前で新規プロジェクトを作成してください。
画面は、VisualStudio2008ですが、>NET以降のバージョンなら大丈夫です。

フォームにボタンを1つ貼り付けます。
コントロール名は、初期設定のままでいきます。
表示文字列は、「印刷」としました。(Textプロパティです)



このボタンをダブルクリックすると、コードウィンドウに切り替わります。

以下のように書いてください。

Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) _
               Handles Button1.Click
    'Accessファイルを開き、レポートを印刷()
    'この実行ファイルと同じディレクトリにあるとする
    'ファイル名は、yaoya.mdb

    Dim myPath As String = My.Application.Info.DirectoryPath & "\yaoya.mdb"
    Dim AccObj As Object = CreateObject("Access.Application")

    With AccObj
      .OpenCurrentDataBase(myPath)
      .DoCmd.OpenReport("卸商品明細")
      .Quit()
    End With

    AccObj = Nothing
    MessageBox.Show("印刷が終了しました")

  End Sub
End Class

画像も載せておきます。



実行ファイルのパスは、My.Application.Info.DirectoryPath で簡単に取得できます。

アクセスアプリケーションのインスタンスは、CreateObject で作成します。
あとは、そのインスタンスのもつメソッドを記述します。
OpenCurrentDataBaseメソッドでデータベースファイルを開き、
DoCmd.OpenReport で、レポートの印刷を行います。
DoCmdオブジェクトは、AccessVBAを書いたことのある方ならおなじみでしょう。
最後に、Quitメソッドでアプリケーションを終了します。

なお、AccObj にNothingを代入することで、インスタンスを削除しています。





実行すると、ちゃんとプリンタからレポートが印刷されて出てきました。

VBで印刷関係を実装するとなると、結構大変です。
Accessの優れたレポート機能を活用することは、大きなメリットになるでしょう。


それでは、また。


だい
コメント (6)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

VBからAccessを最大化して起動する(Visual Studio2008)

2011-05-17 09:00:45 | Visual Basic
前回は、VBからエクセルを最大化して起動する方法をご紹介しました。

ご覧になっていない方は、こちらからどうぞ。

今回は、ウィンドウを最大化してアクセスを起動する方法を取り上げます。

同じMicrosoftの製品でも、コードの内容が異なることがお分かりいただけるでしょう。
一緒にしてくれればいいのに、と思うのは、僕だけでしょうか。


それでは、任意の名前で新規プロジェクトを作成します。

フォームが表示されたら、ボタンを1つ配置します。

名前は、初期設定の「Button1」のままです。
Textプロパティに「Access起動」と設定しました。
(下の図参照)




このボタンをクリックしたときに、Accessを起動し、最大化します。

なお、Accessは、データベースを開かないと意味がないので、
フルパスで、任意のデータベースファイルを指定するようにします。

フォームのボタンをダブルクリックして、コード画面に切り替えます。

以下のように記述してください。



Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) _
               Handles Button1.Click

    'Accessを最大化して起動する
    'WinApiを使用する方法もあるらしいが、この方が簡単です
    'Accessの持っている機能を使う 

    'Accessのファイルに書いても、アプリは最大化しない(原因は不明)

    Const acCmdAppMaximize As Long = 10

    Dim path As String = "I:\xxxxxx\pcc\pcc2007.mdb"
    Dim ac As Object = CreateObject("Access.Application")

    ac.OpenCurrentDataBase(path)
    ac.RunCommand(acCmdAppMaximize)
    ac.visible = True

  End Sub
End Class


画像も載せておきます。






pathという変数に、フルパスで開くファイルを指定します
CreateObject関数で、Accessオブジェクトを生成します。

あとは、このAccessオブジェクトの持つメソッドとプロパティをうまく使います。

OpenCurrentDataBaseメソッドで、ファイルを開きます。

このあとが最大化処理です。
RunCommandメソッドで、アプリケーションの最大化を行います。

エクセルと違って、Accessは、アプリケーションの最大化というメソッドを持っているのです。
このメソッドの引数に acCmdAppMaximize を指定していますが、
これは組み込み定数といい、AccessVBAの中で数字の代わりに使えるようになっているものです。
ですから、正体は、数値です。
ただし、今は、AccessVBAで制御しているわけではありません。
したがって、組み込み定数をそのまま使うと、エラーとなります。

この対策として、
Const acCmdAppMaximize As Long = 10

の行で、組み込み定数を変数として宣言し、正体の10という数値を代入しています。
これで、使用できるようになります。
(もちろん、引数に直接 10 と入れても大丈夫ですが、可読性を考慮しています)

あとは、Visibleプロパティで、表示すれば完了です。



デバッグ実行すると、Accessのウィンドウが最大化して起動することがわかります。


なお、Accessの組み込み定数の正体の数値を見抜く方法をご紹介します。

任意のデータベースファイルを開き、VisualBasic Editorを開きます。
「表示」メニューの「オブジェクトブラウザ」をクリックします。

画面左の<グローバル>をクリックし、右側の一覧から、acCmdAppMaximize を選択します。

すると、画面下に、数値が10であることが示されます。





なお、開かれるデータベースファイルに、ウィンドウ最大化のコードを書いてもいいような気がしますが、
確認すると、うまく動作しませんでした。

どなたかその理由をご存じの方がいましたら、ご教授ください。


だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

エクセルを最大化して起動する(Visual Studio2008)

2011-05-12 09:07:06 | Visual Basic
今日は、Visual Basicを取り上げます。

ExcelVBAを使った電卓の続編は、いましばらくお待ちくださいね。


さて、VBからエクセルを起動するプログラムを書いてみましょう。
ついでにエクセルを最大化して起動するようにしましょう。


任意の名前で新規プロジェクトを作成してください。

フォームにボタンを配置しました。ボタンの名前は、初期設定のままです。(Button1です)

このボタンをクリックしたら、エクセルが起動するようにします。






それでは、さっそくコードを記述します。

ボタンをダブルクリックすると、クリック時イベントに関連付けられたSubプロシージャが現れます。

その中に、以下のようにコードを記述してください。

  Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) _
               Handles Button1.Click

    Const xlMaximized As Long = -4137

    Dim ex As Object = CreateObject("Excel.Application")
    ex.workbooks.add()
    xlMaximized xlMaximized
    ex.visible = True

  End Sub


画像も載せておきます。





9行目で、Excelのオブジェクトを生成します。
10行目で、新規ブックを作成します。
11行目で、エクセルアプリケーションを最大化します。
なお、7行目は、重要です。xlMaximized というのは、エクセルでは定数として使えますが、
このVBでは、CreateObject関数でエクセルを生成しているので、xlMaximizedは使えません。
実は、xlMaximized は、-4137 につけられた別名のようなものです。
ですから、
xlMaximized=-4137
と記述してももちろん正しいのですが、可読性を重視して、7行目で xlMaximized を使えるようにしています。

12行目のコードがないとエクセルは、表示されません。


今回のように、CreateObject関数を使う手法を、実行時バインディングと言います。
それに対して、参照設定をして、エクセルを使えるようにする方法を、事前バインディングといいます。

後者の方が、コーディングしやすいのですが、エクセルのバージョンが固定されます。
不特定多数がこのプログラムを使用するのなら、どのバージョンでも動作するようにCreateObject関数を使った方がいいでしょう。


だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

複数のテキストボックスにカレンダーの値を挿入する(VisualBasic)

2011-03-24 09:00:06 | Visual Basic
みなさんおはようございます。

今日はVisualBasicネタをご紹介します。

ここのところだい先生に習って私もVBにはまっているのです(*^_^*)

お題は「複数のテキストボックスにカレンダーの値を挿入してみよう」です。

フォームにテキストボックスを3つ配置します。

MonthCalendarコントロールを1つ配置します。AccessやExcelのフォームの「カレンダー

コントロール」と同じようなものですよ。



さて

textbox1にカーソルを置いた状態でMonthCalendarコントロールのある日付をクリック

したらtextbox1に日付を挿入します。

textbox3にカーソルを置いた状態でMonthCalendarコントロールのある日付をクリック

したらtextbox3に日付を挿入します。

・・・といったことをします(*^_^*)

これって考えてみるとちょっと悩んでしまうのですが、今回は変数を使うことによって

うまくいきました(エヘヘ)



テキストボックス型のモジュール変数 txを宣言してます。

そしてtextbox1~3ののクリック時イベントに

自分自身(textbox1~3)をtxに代入します。

これでtxをそのtextboxとして扱うことができるようになります。
(代入した時にそれそのものとして扱うことを「参照渡し」と言いますね)

monthcalendarの日付選択時イベントでtxに対して日付を代入します。





そうすると、先ほどtxに代入したtextboxにも日付が挿入されるのです。



おもしろいですね。


さてここで勉強したことをAccess・ExcelのVBAではどのようにコーディングすればよいか

さっそく考えてみたくなります。

うまくできたら次回の記事でご紹介しますね。

mihoりん
コメント (3)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Visual BasicとSQLServerの連携-その1

2011-03-15 09:00:10 | Visual Basic
東北地方太平洋沖地震におきまして、被災された皆様方に心よりお見舞い申し上げます。一日も早い復興をお祈り申し上げます。

今日は、データベースアプリケーションを取り上げます。
Visual Basicを使って、SQLServerのデータをコントロールに表示する方法をご紹介します。

SQLServerは、Microsoft社が提供しているリレーショナルデータベース管理システム(Relational DataBase Management System : RDBMS)です。
高価な製品ですが、無償で入手できるExpress Edition もあります。
荒っぽく言えば、Accessの高レベル版という感じでしょうか。

なお、SQLServerには、既に「MainSub」という名前のデータベースが作成されているものとします。
そして、そのデータベースには、以下の3つのテーブルが用意されているものとします。

T受注サブ
T商品マスタ
T担当者マスタ



それぞれのテーブルには、サンプルデータが既に格納されています。

T受注サブ

ちなみに全てのフィールドは、int型です。

T商品マスタ

左から順番に、int型、nchar型(10文字)、money型です。

T担当者マスタ

左から順番に、int型、nchar型(10文字)です。


今回は、この3つのテーブルを関連付けたビュー(クエリ)を取得して、フォームに表示してみます。

以下のようなビュー(クエリ)とします。




このようなビュー(クエリ)をサーバーサイドに作ることもできますが、今回は、あえてその作業もVisual Basicでやってみます。


VisualStudioを起動します。(今回は、Visual studio2008を使用しています)
「ファイル」→「新しいプロジェクト」とクリックし、任意の名前でプロジェクトを作ります。

フォームが表示されたら、ボタンとデータグリッドビューを図のように配置します。

名前は、それぞれ初期値のままで使用しています。(Form1 と Button1 と DataGridView1)
ボタンのTextプロパティは、「取得」としました。




ボタンをダブルクリックして、コード画面に切り替えます。

以下のようにコードを記述します。

冒頭のImports 文を忘れないようにしてください。
この宣言がないと、以下の用に記述してもエラーが出てきます。


Imports System.Data.SqlClient

Public Class Form1

  Private ds As New DataSet

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Cn As New SqlConnection
    Dim Cmd As New SqlCommand
    Dim strSQL As String = "SELECT T受注サブ.サブID, T受注サブ.商品ID, T商品マスタ.商品名, T商品マスタ.単価, T受注サブ.数量,
T商品マスタ.単価 * T受注サブ.数量 AS 金額, T受注サブ.担当者ID, T担当者マスタ.担当者名 FROM T受注サブ INNER JOIN T商品マスタ ON
T受注サブ.商品ID = T商品マスタ.商品ID INNER JOIN T担当者マスタ ON T受注サブ.担当者ID = T担当者マスタ.担当者ID"

    Cn.ConnectionString = "Data Source=DAI;Initial Catalog=MainSub;User ID=rm;Password=xxxx"
    Dim da As New SqlDataAdapter(strSQL, Cn)
    Try
      da.Fill(ds, "Q受注サブ")
      With DataGridView1
        .DataSource = ds.Tables("Q受注サブ")
        .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        .Columns("単価").DefaultCellStyle.Format = "#,##0"
        .Columns("単価").DefaultCellStyle.Alignment = _
                  DataGridViewContentAlignment.MiddleRight
        .Columns("金額").DefaultCellStyle.Format = "#,##0"
        .Columns("金額").DefaultCellStyle.Alignment = _
                  DataGridViewContentAlignment.MiddleRight
      End With
      Button1.Enabled = False
    Catch ex As Exception
      MessageBox.Show(ex.ToString)
    Finally
      If Not Cmd Is Nothing Then Cmd = Nothing
      If Not Cn Is Nothing Then Cn = Nothing
    End Try
  End Sub

なお、画面の都合で自動的に改行されている個所がありますが、実際は改行されていません。




SQLServerのデータベースに接続するためには、SqlConnection と SqlCommand が必要です。
この2つのインスタンス(実体)をまず作ります。
そして、先程ご覧いただいたクエリを生成するSQL文を変数strSQLに代入します。
SqlConnectionのインスタンスであるCnのConnectionStringプロパティには、SQLServerへの接続文字列を代入します。

そして、SqlDataAdapterのインスタンスdaを生成します。
その際、SQL文とCn を引数に設定するのを忘れないでください。

あとは、daのFillメソッドで、DataSet の中に"Q受注サブ" というデータテーブルを作成します。
DataSet とは、ざっくばらんに言うと、メモリに展開されたデータベース領域です。

そして、DataGridView1の DataSource プロパティに、"Q受注サブ"データテーブルを指定します。

これで、DataGridView1にクエリの結果が表示されます。
あとは、書式設定が続いているだけです。

Try~Catch構文でエラーをトラップし、Finallyブロックで、インスタンスの後始末をします。


それでは、実行してみましょう。





すると、ちゃんとデータが表示されました。





今回は、表示するだけでしたが、今後は、データの更新についても取り上げます。



だい
コメント (10)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CSVファイルの内容をテキストボックスに取り込む-その2(Visual Basic2005以降)

2010-12-14 09:26:48 | Visual Basic
今回は、CSVファイルの内容をテキストボックスに取り込む(Visual Basic2005以降) の続きですよ。

さて、前回は、CSVファイルの内容をテキストボックスに表示するというものでした。

こんな感じです。




ファイルの内容をそのまま丸ごと取得するのは、結構簡単でしたよね。

それでは、今度は、一ひねりしてみます。
1行の中に、コンマで区切られた数字が7つあります。
この7つの数字の合計を各行の末尾に付け加えてみましょう。

以下が、完成イメージです。




今度は、ファイルの中身を一気に取得というわけには行きません。

STEP1:1行ずつ読み込んでは、
STEP2:合計を求めて、
STEP3:その行の末尾に追加
STEP4:その情報を変数の中に蓄積していく

という処理を最終行まで繰り返す必要があります。

前回のボタンクリック時のイベントプロシージャを変更しましょう。

以下のように修正してください。

Imports System.IO
Imports System.Text

Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Button1.Click
    With OpenFileDialog1
      .Filter = "CSVファイル(*.csv)|*.csv"
      If .ShowDialog = Windows.Forms.DialogResult.OK Then
        TextBox1.Text = .FileName
        Using sr As New StreamReader(.FileName, Encoding.Default)
          'ファイルの内容を一気に取得して、テキストボックスに表示
          '前回の課題
          'Dim contents As String = sr.ReadToEnd()
          'TextBox2.Text = contents

          '1行の中の数字の合計を付加して出力(今回の課題)

          '出力する内容を格納する変数
          Dim Data As String = ""

          Do
            '最終行ならこのループを抜ける
            If sr.EndOfStream Then Exit Do

            '1行読み込み
            Dim LineData As String = sr.ReadLine()
            'コンマごとに文字列を分割し、配列変数に格納
            Dim values() As String = Split(LineData, ",")
            Dim ans As Integer = 0
            '配列変数valuesのすべての数字を数値に変換して足し算する
            For i As Integer = 0 To values.Length - 1
              ans += Integer.Parse(values(i))
            Next
            '1行データに、合計値を付加して変数に格納
            Data &= LineData & " → total: " & ans & vbNewLine
          Loop
          '出力する(変数Dataの内容をテキストボックスに表示)
          TextBox2.Text = Data
        End Using
      End If
    End With
  End Sub
End Class


画像も載せておきます。
赤枠の中を入力してください。その前の2行は、コメントアウトしてください。





ファイルの内容を1行ずつ読み込むには、ReadLineメソッドを使います。
このメソッドは、自動的に次の行を読み込んでいきます。

Splitメソッドを使うと、カンマごとに区切って配列変数の中に値を格納します。
この配列の中の値を足し算すれば、その行の合計が出るわけです。

ans += Integer.Parse(values(i))
は、
ans = ans + Integer.Parse(values(i))
と同じ意味です。

Data &= LineData & " → total: " & ans & vbNewLine
は、
Data = Data & LineData & " → total: " & ans & vbNewLine
と同じ意味です。

実行すると、以下のようになりますよ。




それでは、今日も楽しい一日を。



だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CSVファイルの内容をテキストボックスに取り込む(Visual Basic2005以降)

2010-12-02 09:00:32 | Visual Basic
今日は、久しぶりにVisual Basicを取り上げます。

CSVファイルがあるとします。
中身のデータは、何でもかまいません。今回は、以下のような内容とします。
数字がコンマで区切られて並んでいますね。何の数字かはご想像にお任せします。




さて、このCSVファイルをテキストボックスにインポート(取り込み)するのが今回のテーマです。

つまり、テキストファイルの中身(データ)を取得するということですね。

それでは、任意のプロジェクト名で、新規プロジェクトを作成してください。

フォームに、テキストボックスを2つ、ボタンを1つ配置してください。

下の画像を参考にしてください。

TextBox2は、MultiLineプロパティをTrueにすると、高さを変更することができます。




今回は、CSVファイルがどこにあってもいいように、ファイルを開くダイアログボックスを表示させます。

OpenFileDialogをフォーム上にドラッグしてください。

フォームの下に移動しますが、そのままにしておいてください。





それでは、いよいよコーディングです。

ボタンのClickイベントが発生したときに、ファイルを開くダイアログボックスを表示し、選択されたCSVファイルの中身を取得し、
TextBox2に表示させます。

Button1をダブルクリックしてください。コードウィンドウに変わります。

以下のように、コードを記述してください。
冒頭の2行をお忘れなく。


Imports System.IO
Imports System.Text

Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    With OpenFileDialog1
      .Filter = "CSVファイル(*.csv)|*.csv"
      If .ShowDialog = Windows.Forms.DialogResult.OK Then
        TextBox1.Text = .FileName
        Using sr As New StreamReader(.FileName, Encoding.Default)
          Dim contents As String = sr.ReadToEnd()
          TextBox2.Text = contents
        End Using
      End If
    End With
  End Sub
End Class

画像も載せておきます。




ダイアログボックスのファイルの種類を指定するときは、Filterプロパティを使います。

また、ファイルの読み込みは、StreamReaderを使うと簡単です。

ReadToEndメソッドで、一気にファイルの中身全部を読み込んでしまいます。
すごく簡単ですよね。

VB6のころは、Openステートメントを使っていましたが、.NET以降、コードが簡単になりました。

たったこれだけのコードでおしまいです。

さっそく、実行してみましょう。




表示ボタンをクリックすると、ファイルを開くダイアログボックスが表示されますよね。

CSVファイルを選択して、開くボタンをクリックしてください。



すると、以下のように、ファイルの中身が読み込まれます。





せっかくですから、次回は、読み込んだ内容を一ひねりしてテキストボックスに表示させてみましょう。お楽しみに。



だい
コメント (2)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

文字列を効率的に抽出する方法-正規表現(Visual Basic2005以降)

2010-08-31 09:00:06 | Visual Basic
今日は、Visual Basic(VB)を取り上げますよ。

例えば、テキストファイルがあります。そこには、好きな食べ物とその理由が書いてあるとしましょう。
こんな感じです。




お気づきの通り、htmlファイルですね。
つまり、タグを除外し、その食べ物と理由だけを取り出したいとします。

こんなとき、どうしたら簡単にできるでしょうか?

文字列を操作する関数は、たくさんあります。
indexOfを駆使して、できないことはありませんが、大変です。

実は、強い味方がいるのです。それは、正規表現です。
VBも、正規表現ができるようになったのです。ありがたい。

それでは、一緒に、チャレンジしてみましょう。

まずは、任意の名前で、新規プロジェクトを作成してください。




上の絵のように、コントロールを配置してください。
テキストボックスが2つ(左がTextBox1 右がTextBox2です)
ボタンが2つ(左がButton1 右がButton2です)
テキストプロパティは、それぞれ、「読み込み」「抽出」としました。


なお、テキストボックスは、MultilineプロパティをTrueにしてください。
そうすると、複数行を表示することができます。
また、ScrollBarsプロパティをVertical もしくは、Bothにしてください


そうそう、htmlファイルの内容を読み込まなくてはなりません。
今回は、このプロジェクトにhtmlファイルを取り込んでみます。
そうすれば、パスなしでファイル名だけで、指定できるので楽ができます。


プロジェクト→既存項目の追加 をクリックします。





今回は、デスクトップに保存してあるtabemono.htmlというファイルを追加します。

(オブジェクトの種類を「すべて」にすると、htmlファイルが表示されます)





追加すると、プロジェクトエクスプローラにtabemono.htmlが表示されます。


忘れないうちに、プロパティの「出力ディレクトリにコピー」を「常にコピーする」にしておきます。
こうすると実行ファイルと同じフォルダにファイルがコピーされるので、パスなしのファイル名のみの指定が可能になります。





それでは、左の「読み込み」ボタンをダブルクリックしてください。
以下のようにコードを記述します。

忘れないでほしいのは、モジュールの冒頭にある名前空間のインポートです。
冒頭の2行で、ファイルの読み書きと、正規表現に関するコードを簡単に記述することができます。





シンプルなコードですね。

StreamReaderクラスを使って、ファイルの中身を一気に取得して、テキストボックスに表示しています。
Openステートメントを使っていた昔より、楽なコードですよね。




それでは、「抽出」ボタンをクリックしたときのコードを記述します。
ここで正規表現を使いますよ。




ずいぶんと短いコードだと思いませんか?
これが、正規表現を使うメリットです。

split関数は、指定したパターン文字列で、元のテキストを分離分割していきます。
今回は、div開始タグで分割しました。

あとは、分割された各データの中から、食べ物と理由を抜き出せばいいのです。


h2タグやpタグの内容を取得する際に、正規表現を使っています。
([^

で始まり、

で終わる文字列を探し出すことができるのです。

そして、その探し出した文字列の中の任意の文字列部分をgroup(1).value で取得できるのです。


さあ、完成したところで、デバッグしてみましょう。
F5を押します。

「読み込み」ボタンをクリックすると、htmlファイルのデータを取得できます。





「抽出」ボタンをクリックすると、左の文字列から、ちゃんと食べ物と理由を抜き出して表示されているのが分かりますね。





慣れないうちは、正規表現の書き方で苦労するかもしれませんが、
使いこなせると、格段にコーディングの効率が上がります。

ありがたい機能の一つです。

ブログゲットくんでも、大活躍の機能です。

ブログゲットくんのサイトはこちらですよ。




だい
コメント (4)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

フルパスからファイル名を取得する(Visual Basic2008)

2009-10-14 09:01:18 | Visual Basic
今日は、Visual Basicを取り上げますよ。

さて、フルパスから、ファイル名を取得する方法を紹介します。
ついでに、フォルダ名や拡張子を取得する方法も確認しましょう。

VBAでは、InstrRev関数を使いますが、VBでは、専用のメソッドが用意されています。ありがたいですね。



任意の名前でプロジェクトを作成し、表示されたフォームにテキストボックスを3つと、ボタンを1つ配置します。

以下の画像を参考にしてください。

テキストボックスの左にラベルも配置しました。





それでは、コードを記述します。
ボタンをダブルクリックしてコード画面を表示します。

以下のようにコードを記述します。
行頭の Imports System.IO を忘れないでください。

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

Imports System.IO

Public Class Form1
    Private Const FULLPATH As String = _
        "C:Documents and SettingspasoMy DocumentsVBA応用.xls"

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click

        TextBox1.Text = Path.GetFileName(FULLPATH)
        TextBox2.Text = Path.GetDirectoryName(FULLPATH)
        TextBox3.Text = Path.GetExtension(FULLPATH)
    End Sub
End Class


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

以下の画像を参考に。こんな感じです。






今回は、分かりやすいように、パスを定数(FULLPATH)で指定しました。
この値は自由に変えていただいて結構です。

Pathクラスには、ファイル名を取得するメソッドが用意されています。
その他フォルダ名を取得するメソッドや、拡張子を取得するメソッドもあるのです。
パラメータ(引数)には、フルパスを指定します。

取得した値をテキストボックスに表示します。


それでは、F5キーを押して、デバッグしましょう。

フォームが表示されたら、ボタンをクリックしてみてください。






ちゃんと取得できましたね。


OpenFileDialog を使って選択したフルパスからファイル名を取得してみるのもいいですね。挑戦してみてください。


だい
コメント (7)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

フォルダのサイズを取得する(Visual Basic2008)

2009-08-29 15:31:18 | Visual Basic
今日は、Visual Basicで、任意のフォルダのファイルサイズを取得します。

なお、Visual Studio2008を使用します。


まず、任意の名前で新規プロジェクトを作成してください。

次に、フォームに4つのコントロールを配置します。
テキストボックス2つとボタンが1つ、それにFolderBrowserDialogを使います。

FolderBrowserDialogは、フォーム上にドラッグすると、自然に下のコンポーネントトレイに移動しますよ。

コントロール名は、初期設定のまま今回は使用します。





それでは、Button1をダブルクリックしてください。
コードウィンドウが表示されます。

下のコードを入力してください。


---------------------------------------
Imports System.IO

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click
        With FolderBrowserDialog1
            .Description = "フォルダを選択してください"
            .RootFolder = Environment.SpecialFolder.MyComputer
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                'テキストボックスに選択したフォルダのパスを表示
                TextBox1.Text = .SelectedPath
                Dim di As DirectoryInfo = New DirectoryInfo(.SelectedPath)
                'DirSizeを使って、ファイルサイズを取得して
                'テキストボックスに表示(書式もついでに設定)
                TextBox2.Text = Format(DirSize(di), "#,##0バイト")
            End If
        End With
    End Sub

    Private Function DirSize(ByVal d As DirectoryInfo) As Long
        Dim Size As Long = 0
        'ファイルのサイズを取得
        Dim fis As FileInfo() = d.GetFiles()
        Dim fi As FileInfo
        For Each fi In fis
            Size += fi.Length
        Next fi
        'サブフォルダのサイズを取得
        Dim dis As DirectoryInfo() = d.GetDirectories()
        For Each di As DirectoryInfo In dis
            Size += DirSize(di)
        Next di
        Return Size
    End Function
End Class
---------------------------------------



一応画像を載せておきます。





コードの解説は、上の画像をご覧ください。

フォルダのサイズを取得する関数は、Visual Basicでは提供されていないので、
自分で作るしかありません。
再帰呼び出しという手法を使うと、達成できます。

それでは、F5キーを押して、デバッグしてください。

フォームが表示されます。

選択ボタンをクリックしてください。





フォルダ選択画面が開きます。

任意のフォルダを選択してください。
ただし、ファイルサイズの大きなフォルダを指定すると、このあと表示されるまで結構時間がかかります。

ですから、最初は、サイズの小さそうなフォルダを指定するようにしてください。


今回は、マイドキュメントの中の Blog というフォルダを指定しました。





OKボタンを押すと、ほら・・・





下のテキストボックスにフォルダ内のファイルの合計サイズが表示されますね。


僕としては、エクスプローラの詳細表示では、フォルダのサイズも表示してくれるとありがたいのになあ、と思います。

いちいち、プロパティ画面を表示しないとファイルサイズが分からないのが面倒くさいです。

フォルダのポップアップを待っているのも、いまいち・・・



だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

電話番号データからハイフンを取りたい!Visual Basic編

2009-08-22 13:56:06 | Visual Basic
今回は、前回の記事のVisual Basic編ですよ。


前回の記事:電話番号データからハイフンを取りたい!


それでは、Visual Basicを起動して、任意の名前でプロジェクトを新規作成してください。

表示されたフォームに以下のコントロールを配置してください。
テキストボックスを2つ
ボタンを1つ

こんな感じですよ。





コントロールの名前は、初期設定のまま使用しますよ。
ただ、ボタンの表示文字列は、「ハイフンなしにする」にしておきましょう。

TextBox1に、TELを入力し、Button1をクリックすると、ハイフンなしのTELがTextBox2に表示されるというわけです。



それでは、コードを記述していきましょう。

Button1をダブルクリックしてください。

Button1_Clickイベントプロシージャが自動的に生成されますので、
その中に、以下のコードを記述してください。




    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click
        If TextBox1.Text = "" Then
            Exit Sub
        End If

        Dim s As String = TextBox1.Text.Replace("-", "")
        TextBox2.Text = s
    End Sub



実際には、下の図の色のついた部分だけ入力すれば結構ですよ。





コードのポイントは、
TELが入力されたTextBox1の文字列に対して、Replaceメソッドを使うと簡単に出来るという点です。
このメソッドは、名前の通り、置き換えをしてくれるものです。
ハイフンを空文字列に置き換えるので、結果的にハイフンの削除となります。

あとは、ハイフンなしの文字列をTextBox2に表示するだけですよね。


それでは、確認しましょう。F5キーを押してデバッグを開始します。


TextBox1にTELを入力してください。







そして、ボタンをクリックします。

すると・・・





ハイフンなしのTELが表示されましたね。



だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Enterキーでコントロールを移動する方法(Visual Basic 2008)

2009-07-15 10:36:09 | Visual Basic
さて、今日は、生徒さんからの質問を取り上げますよ。

Visual Basicです。

フォームに配置したコントロールは、Tabキーで、移動できるようになっています。(Windowsは、この方法を推奨しています)

しかし、Enterキーでコントロール間を移動したいというのが、生徒さんの要望なのです。

確かに、その気持ちも分かりますよね。



それでは、方法を説明します。


Visual Studio 2008を起動して、任意の名前で新規作成してください。

フォームが表示されたら、テキストボックスを配置します。

今回は、5つ配置しました。

初期設定では、配置順に、Tabキーでコントロール移動が出来ますよ。






さて、それでは、コードを書きます。

各コントロール(今回は、テキストボックス)の KeyPressイベントに記述します。

「押されたキーがEnterキーなら、タブキーが押されたときと同様の処理を行う」
といった内容のコードとなります。


ただ、同じ内容のコードを、今回は、5つのテキストボックスについて記述するのは、面倒なので、少し楽をする方法をご紹介します。



それでは、フォームのタイトルバーをダブルクリックして、コード画面に切り替えます。

表示されたら、以下のようにコードを記述します。


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load
        For Each ctl As Control In Me.Controls
            AddHandler ctl.KeyPress, AddressOf Ctl_KeyPress
        Next
    End Sub

    Private Sub Ctl_KeyPress(ByVal sender As System.Object, _
                        ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If e.KeyChar = Chr(Keys.Enter) Then
            SendKeys.SendWait("{Tab}")
            e.Handled = True
        End If
    End Sub

End Class



こんな感じですよ。




簡単に説明すると、フォームのロードイベントに対して、
すべてのコントロールのKeyPressイベントにCtl_KeyPressというサブルーチンを結び付けますよ、という内容です。

そして、Ctl_KeyPressプロシージャの中が、今回のメイン処理となります。


各コントロールのKeyPressイベントに毎回メイン処理の内容を記述するのではなく、
今回のようにすると、記述するコードのボリュームも格段に減りますし、コントロールを追加しても、追加するコードは不要となります。



それでは、F5キーを押して、デバッグしましょう。





入力した後で、Enterキーを押すと、次のコントロールに移動しますね。



それでは、デバッグを終了し、フォームにコントロールを追加してみましょう。

今度は、コンボボックスを追加しました。





F5キーを押して、デバッグします。


すると、コードの追加なしに、ちゃんと、コンボボックスも含めて移動できますね。


もし、特定のコントロールだけ、Enterキーで移動したい場合は、
対象のコントロールのTagプロパティに、任意の文字を設定してください。


そして、ロードイベントのコードに、条件分岐のコードを追加してくださいね。



今日の信州は、暑くなりそうですよ。

だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

10進数の数値をn進数に変換するプログラム(Visual Basic)

2009-06-13 11:30:33 | Visual Basic
今日は、10進数の数値をn進数に変換するプログラムをVisual Basicでつくってみましょう。

まず、フォームに以下のようにコントロールを配置してください。

コントロールの名前は、横に赤い文字で記しておきました。







フォームのコード入力画面を表示してください。

以下のコードを入力します。







n進数に変換した答えを計算しているのが、

getDigit というサププロシージャです。

プロシージャ名は、いかがなものかという点は容赦いただき、
このプロシージャのおかげで、答えが出ます。

今回は、再帰呼び出しという手法を使ってコードの簡潔化を図っています。



それでは、F5キーを押して、デバッグを開始してください。

任意の数値を入力して、ボタンを押してください。
答えが出ます。

ただし、9進数以下にしが対応しておりません。。。
お許しを。。。






だい
コメント (6)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Visual Basicで、たくさんのボタンを自動生成する(Visual Studio2005以降)

2009-05-25 13:36:42 | Visual Basic
さて、新しい一週間の始まりです。今週も楽しい毎日にしましょう。

今日は、久しぶりにVisual Basicを取り上げます。
Visual Studio 2008 Expressは、無料でMicrosoftのサイトからダウンロードできますので、
興味のある方は、チャレンジしてみてください。

今回のテーマは、「ボタンをコードで自動生成する」です。


ボタンは、フォームのデザイン画面で、予め手動で配置できます。
大体は、それで結構ですが、
大量のボタンを規則正しく配置したいときには、面倒くさかったりします。
そんなときは、コードで自動生成してしまいましょう。

今回は、お題として、電卓を取り上げて説明します。

それでは、適当な名前で、プロジェクトを新規作成してください。

フォームが表示されたら、
テキストボックスを図のように配置します。

これは、手動でお願いします。





テキストボックスの幅は、適当でかまいません。コードで自動調整します。


次に、フォームのタイトルバーをダブルクリックして、コード画面を表示します。

以下のようにコードを記述してください。


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, 
                           ByVal e As System.EventArgs) Handles MyBase.Load
        Const BUTTON_TEXT As String = "789/456*123-0c=+"
        Const BUTTON_WIDTH As Integer = 30
        Const BUTTON_INTERVAL As Integer = 36
        Const START_X As Integer = 10
        Const START_Y As Integer = 40

        Me.Text = "電卓"
        With TextBox1
            .Width = BUTTON_INTERVAL * 4 - (BUTTON_INTERVAL - BUTTON_WIDTH)
            .Left = START_X
            .Top = START_X
            .TextAlign = HorizontalAlignment.Right
            .ReadOnly = True
        End With

        Dim btn As Button
        For i As Integer = 0 To 3
            For j As Integer = 0 To 3
                btn = New Button
                btn.Size = New Size(BUTTON_WIDTH, BUTTON_WIDTH)
                btn.Location = New Point(START_X + BUTTON_INTERVAL * j, _
                START_Y + BUTTON_INTERVAL * i)
                btn.Text = Mid(BUTTON_TEXT, i * 4 + j + 1, 1)

                Controls.Add(btn)
            Next
        Next

        Me.Width = START_X * 2 + BUTTON_INTERVAL * 4
        Me.Height = START_Y * 2 + BUTTON_INTERVAL * 4
    End Sub





入力できたら、早速確認してみましょう。

「デバッグ」メニューの「デバッグ開始」をクリックします。




すると、電卓が表示されます。




コードの詳しい説明は、省略させていただきますが、
ボタンの大きさを変更する方法をご紹介しておきましょう。

下の画像の赤線の数字を変更するだけで、けっこうです。
ただし、下の赤線の数字は、上の赤線の数字よりも、大きな数字にしてください。
でないと、ボタンがうまく表示されません。





なお、ボタンを押しても、何も反応しません。(そのためのコードは記述していないからです)
今回は、見た目だけです・・・

でも、折角ですから、せめて押したボタンの数字記号が、テキストボックスに表示されるように
コードを追加してみます。

画像を参考に、以下の1行と、イベントプロシージャを追加してください。


AddHandler btn.Click, AddressOf button_click


Private Sub button_click(ByVal sender As Object, ByVal e As System.EventArgs)
TextBox1.Text = CType(sender, Button).Text
End Sub


 


 

記述する場所を間違えないように注意してください。





それでは、改めてデバッグします。
今度は、ボタンをクリックすると、テキストボックスに数字や記号が表示されます。




電卓の実際の機能は、またの機会に取り上げます。

本日は、ここまで。。。

だい
コメント (4)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

テキストファイルの内容を読み込む(VB/Visual Studio2008)

2009-03-31 08:48:16 | Visual Basic
「それじゃあ、今日は、Visual Basic(VB)をやるぞ!
任意のテキストファイルを読み込んで、
テキストボックスに表示してみようか!」

「先生、今日はいきなり、力入ってますね。
何か、いいことあったんですか?」

「鋭いね、君は。そうなんだよ。
テキストファイルの内容を、目的に応じて変更できる
プログラムを現在開発中なんだけど、
まもなく完了しそうなんだよ。
それが、嬉しくてね。」

「そうなんですか。そんなことをやっていたとは、知りませんでした。
どうせ、DVDの映画を見てひとり喜んでいると思ってました。」

「し、失礼な・・・
まあ、いいや。それでは、始めよう。
フォームに、ボタンとテキストボックスを2つ配置しよう。
下のテキストボックスは、MultiLineプロパティをTrueにしてね。
そうしないと、テキストボックスは、高さを変更できないよ。
それから、ScrollBarsプロパティをVirticalにしてね。
というのも、2つ目のテキストボックスに、
ファイルの内容をまるごと表示するからだよ。
ちなみに、一つ目のテキストボックスには、
ファイルのパスを表示しますよ。」



「はい、できました。」

「おっと、今回は、もうひとつ大事なものを仕込まなきゃ。
ツールボックスから、OpenFileDialogをフォーム上に
ドラッグしてね。
下のコンポーネントトレイという場所に、
OpenFileDialog1と表示されるよ。」

「これは、なんですか?」

「任意のファイルを選択するための部品だよ。
これがあるから、好きなテキストファイルを選択できるのだよ。」

「ほう。それは、ありがたい。。。」




「それでは、いよいよ、コードを書こうね。
ちなみに、ボタンとテキストボックスの名前は、初期設定のままだからね。
ボタンをダブルクリックして、コード画面に切り替えたら、
以下のように入力してね。
        With OpenFileDialog1
            .Filter = "すべてのファイル(*.*)|*.*|テキストファイル(*.txt)|*.txt"
            .FilterIndex = 2
            .FileName = ""
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                TextBox1.Text = .FileName
                Dim sr As New System.IO.StreamReader( _
                                .FileName, System.Text.Encoding.Default)
                TextBox2.Text = sr.ReadToEnd
                sr.Close()
            End If
        End With




「ちなみに、画像も載せておくからね。」




「それでは、F5を押して実行してみましょう。
フォームが表示されたら、ボタンをクリックしますよ。」



「ほ~ら、ファイルを開くダイアログボックスが出てきたでしょ。」



「任意のテキストファイルを選んで、開くボタンをクリックすると・・・」



「ほら、テキストボックスに、ファイルの内容が表示されるでしょ。
たった、10数行のコードで、簡単にファイルの中身を表示できるなんて、
何だかうれしいよね。」

「そう言われれば・・・
僕は、どちらかといえば、もうすぐ桜が咲くことが嬉しいなあ。
先生、今年も花見に行きましょうね。」

「君と行くと、あとが大変で・・・」

「それは、こっちのセリフでしょ!!」

「あちゃ」

おまけ:
VBAでやると、ちょっと大変。ループ処理が必要になります。
VBは、その点、楽になりました。

だい
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【おすすめ】

パソコン買ったらまず入れる10のアプリ