無料ブログ作成サービス JUGEM
C#言語(6)−TCP通信(リスナー編)
0

    JUGEMテーマ:プログラミング

     

    今回は、リスナー側のTCP通信アプリケーションの作成です。

    作成するダイアログは下記のようになります。

    あまり、クライアント側のTCP通信アプリケーションと違いはありませんね・・・。

     

    ソースコードは以下の通りです。

    ※クライアントからの接続待ち、接続、データの送受信の部分を抜粋です。

    private void Btn_Start_Click(object sender, EventArgs e)
    {
    
        if (listener == null)
        {
            bStopFlg = false;
    
            clientList = new List();
    
            //----------------------------------------------
            // スレッド処理
            //----------------------------------------------
            ListenThread = new System.Threading.Thread(new System.Threading.ThreadStart(ListenStart));
            ListenThread.IsBackground = true;
            ListenThread.Start();
        }
        else
        {
            MessageBox.Show("接続待ちです。");
        }
    
    }
    
    private void ListenStart()
    {
        //IPアドレスの設定、ポート番号の設定、TcpListener作成
        System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(GettxBoxIP());
        listener = new System.Net.Sockets.TcpListener(ipAdd, int.Parse(GettxBoxPort()));
    
        //Listenを開始する
        listener.Start();
        SettxBoxReceive(GettxBoxReceive() + "Listenを開始しました(" + ((System.Net.IPEndPoint)listener.LocalEndpoint).Address + ":" + ((System.Net.IPEndPoint)listener.LocalEndpoint).Port + ")。¥r¥n");
        SettxBoxReceiveScrollEnd();
    
        //接続要求があったら受け入れる
        do
        {
            System.Net.Sockets.TcpClient client = null;
            try
            {
                client = listener.AcceptTcpClient();
            }
            catch (SocketException e)
            {
                SettxBoxReceive(GettxBoxReceive() + "Listenerを閉じました。¥r¥n");
                SettxBoxReceiveScrollEnd();
                return;
            }
    
            SettxBoxReceive(GettxBoxReceive() + "クライアント(" + ((System.Net.IPEndPoint)listener.LocalEndpoint).Address + ")" + ((System.Net.IPEndPoint)listener.LocalEndpoint).Port + "と接続しました。¥r¥n");
            SettxBoxReceiveScrollEnd();
    
            clientList.Add(client);
    
            //----------------------------------------------
            // スレッド処理
            //----------------------------------------------
            ReceiveThread = new System.Threading.Thread(ReceiveStart);
            ReceiveThread.IsBackground = true;
            ReceiveThread.Start(client);
        } while (bStopFlg == false);
    
        //リスナを閉じる
        listener.Stop();
        listener = null;
        Console.WriteLine("Listenerを閉じました。");
        SettxBoxReceive(GettxBoxReceive() + "Listenerを閉じました。¥r¥n");
        SettxBoxReceiveScrollEnd();
    }
    
    private void ReceiveStart(object iclient)
    {
        //クライアントから送られたデータを受信する
        System.Text.Encoding enc = System.Text.Encoding.UTF8;
    
        NetworkStream ns = null;
    
        TcpClient client = (TcpClient)iclient;
    
        //NetworkStreamを取得
        ns = client.GetStream();
    
        //タイムアウト設定
        ns.ReadTimeout = 10000;
        ns.WriteTimeout = 10000;
    
        do
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            byte[] resBytes = new byte[256];
            int resSize = 0;
    
            do
            {
                try
                {
                    //データの一部を受信する
                    resSize = ns.Read(resBytes, 0, resBytes.Length);
                }
                catch (IOException e) { }
    
                //受信したデータを蓄積する
                ms.Write(resBytes, 0, resSize);
    
            } while (ns.DataAvailable);
    
            //受信したデータを文字列に変換
            string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length);
            ms.Close();
            //末尾の¥nを削除
            resMsg = resMsg.TrimEnd('¥n');
            if (resMsg != "")
            {
                Console.WriteLine(resMsg);
                SettxBoxReceive(GettxBoxReceive() + resMsg + "¥r¥n");
    
                SettxBoxReceiveScrollEnd();
    
            }
        } while (bStopFlg == false);
    
        //閉じる
        ns.Close();
        client.Close();
        SettxBoxReceive(GettxBoxReceive() + "クライアントとの接続を閉じました。¥r¥n");
        SettxBoxReceiveScrollEnd();
    }
    
    
    private void Btn_Stop_Click(object sender, EventArgs e)
    {
        bStopFlg = true;
    }
    
    private void Btn_Send_Click(object sender, EventArgs e)
    {
    
        if (clientList.Count != 0)
        {
            //----------------------------------------------
            // スレッド処理
            //----------------------------------------------
            SendThread = new System.Threading.Thread(new System.Threading.ThreadStart(SendStart));
            SendThread.IsBackground = true;
            SendThread.Start();
        }
                
    }
    
    private void SendStart()
    {
        //データを送信する
        System.Text.Encoding enc = System.Text.Encoding.UTF8;
    
        //Console.WriteLine();
        foreach (TcpClient client in clientList)
        {
            NetworkStream ns = null;
    
            //NetworkStreamを取得
            ns = client.GetStream();
    
            //タイムアウト設定
            ns.ReadTimeout = 10000;
            ns.WriteTimeout = 10000;
                    
            //クライアントに送信する文字列を作成
            string sendMsg = txtBox_Send.Text;
            //文字列をByte型配列に変換
            byte[] sendBytes = enc.GetBytes(sendMsg + '¥r');
            //データを送信する
            ns.Write(sendBytes, 0, sendBytes.Length);
        }
    }
    

    リスナー側は、クライアント側の接続を待ちます。

     

    まずは、IPアドレスとポートを指定して、TcpListenerクラスをインスタンス化します。

    listener = new System.Net.Sockets.TcpListener(ipAdd, int.Parse(GettxBoxPort()));

     

    次に、TcpListenerのStartメソッドで接続待ちを開始します。

    client = listener.AcceptTcpClient();

     

    接続待ちをしている間、他の処理を受け付けなくなってしまうので、スレッド処理をしておいた方がよいです。

     

    クライアント側から接続があると、リスナーはクライアント情報を取得します。

    client = listener.AcceptTcpClient();

     

    このクライアント情報を使用して、データの送受信をします。

    データの送受信処理は、クライアント側の処理とほぼほぼ同じです。

     

    実際に文字を送受信してる画面は、下記のようになります。

     

    クライアント側

     

    サーバー側

    | prog | C#言語 | comments(0) | - |
    C#言語(5)−TCP通信(クライアント編)
    0

      JUGEMテーマ:プログラミング

       

      C#言語を使用して、TCP通信のアプリケーションを作成します。

      今回は、クライアント側のアプリケーションになります。

      TCP通信アプリケーションのダイアログは下記のようになります。

       

      IPには、接続先アドレスを入力して、ポートには、使用するポート番号を入力します。

      IP、ポートは自分のPCの環境に合わせてください。

      私の場合は、IP「192.168.25.1」、ポート「8888」を入力しました。

      また、セキュリティソフトがインストールされている場合は、ネットワークに接続できるように、設定をして下さい。

      入力したら、開始ボタンをクリックする事で、接続を試みます。

      接続が完了したら、下記のようなメッセージが表示されます。

       

      ソースコードは下記のようになります。

      ※リスナー側との接続、データの送受信部分を抜粋

      private void Btn_Start_Click(object sender, EventArgs e)
      {
          bStopFlg = false;
                  
          //接続先IPアドレス
          string strAdd = GettxBoxIP();
      
          //接続先ポート番号
          //TcpListenerオブジェクトを作成する
          int port = int.Parse(GettxBoxPort());
      
          //TcpClientを作成し、サーバーと接続する
          tcp = new System.Net.Sockets.TcpClient(strAdd, port);
          SettxBoxReceive("サーバー(" + 
              ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Address + 
              ":" + ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Port + 
              ")と接続しました。");
          SettxBoxReceiveScrollEnd();
      
          ReceiveThread = new System.Threading.Thread(ReceiveStart);
          ReceiveThread.IsBackground = true;
          ReceiveThread.Start();
      }
      
      private void ReceiveStart()
      {
          //クライアントから送られたデータを受信する
          System.Text.Encoding enc = System.Text.Encoding.UTF8;
      
          NetworkStream ns = null;
      
          //NetworkStreamを取得
          ns = tcp.GetStream();
      
          //タイムアウト設定
          ns.ReadTimeout = 10000;
          ns.WriteTimeout = 10000;
      
          do
          {
              System.IO.MemoryStream ms = new System.IO.MemoryStream();
              byte[] resBytes = new byte[256];
              int resSize = 0;
      
              do
              {
                  try
                  {
                      //データの一部を受信する
                      resSize = ns.Read(resBytes, 0, resBytes.Length);
                  }
                  catch (IOException e) { }
      
                  //受信したデータを蓄積する
                  ms.Write(resBytes, 0, resSize);
      
              } while (ns.DataAvailable);
      
              //受信したデータを文字列に変換
              string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length);
              ms.Close();
              //末尾の¥nを削除
              resMsg = resMsg.TrimEnd('¥n');
              if (resMsg != "")
              {
                  Console.WriteLine(resMsg);
                  SettxBoxReceive(GettxBoxReceive() + resMsg + "¥r¥n");
      
                  SettxBoxReceiveScrollEnd();
      
              }
          } while (bStopFlg == false);
      
          //閉じる
          ns.Close();
          tcp.Close();
          SettxBoxReceive(GettxBoxReceive() + "クライアントとの接続を閉じました。¥r¥n");
          SettxBoxReceiveScrollEnd();
      }
      
      private void Btn_Send_Click(object sender, EventArgs e)
      {
          if (tcp != null)
          {
              SendThread = new System.Threading.Thread(SendStart);
              SendThread.IsBackground = true;
              SendThread.Start();
          }
      
      }
      
      private void SendStart()
      {
          //データを送信する
          System.Text.Encoding enc = System.Text.Encoding.UTF8;
      
          NetworkStream ns = null;
      
          //NetworkStreamを取得
          ns = tcp.GetStream();
      
          //タイムアウト設定
          ns.ReadTimeout = 10000;
          ns.WriteTimeout = 10000;
                  
          //クライアントに送信する文字列を作成
          string sendMsg = txtBox_Send.Text;
          //文字列をByte型配列に変換
          byte[] sendBytes = enc.GetBytes(sendMsg + '¥r');
          //データを送信する
          ns.Write(sendBytes, 0, sendBytes.Length);
      
      }
      

      クライアント側の接続はシンプルです。

      tcp = new System.Net.Sockets.TcpClient(strAdd, port);

      System.Net.Sockets.TcpClientクラスにIPアドレスとポート番号を渡して、クラスをインスタンス化すれば良いです。

      相手側に接続できれば、受信テキストボックスに接続できたことを表示します。

      その後、スレッド処理をします。

      スレッド処理の中では、リスナー側から送られてくる文字列の処理をします。

      ここで、スレッド処理をしておかないと、他の動作ができないので、スレッド処理が必要です。

      スレッド処理については、また後程、記事を作成しようと思います。

      bStopFlgがfalseの間は、受信を続けます。

      接続を終了したい場合は、bStopFlgをfalseにする必要があるわけです。

      停止ボタンの動作に、bStopFlg=true;を追加すればよいですね。

       

      また、スレッド処理をする際に注意する必要があることは、ダイアログの中のテキストボックスに文字を表示させてい時の処理です。

      ダイアログの画面は、受信スレッドとは、別のスレッドで動作しているので、そのまま、受信スレッドの中で、ダイアログのテキストボックスにはアクセスできません。

      そこで、SettxBoxReceive関数を作成しています。

      SettxBoxReceive関数では、コールバック関数を使用して、ダイアログにアクセスできるように関数を作成しております。

      こちらも後程、記事を作成しようと思います。

       

      文字列の送信は、送信テキストボックスに文字を入力して、送信を押すと、リスナー側に文字列が送信されます。

      こちらも、スレッド処理で送信は行っています。

      タイムアウト設定をしているので、送信の場合は、スレッド処理をしなくてもよいです。

       

      実際に文字を送受信してる画面は、リスナー側のTCP通信アプリケーションを作成した時に、画像を貼り付けたいと思います。

       

      次回は、リスナー側のTCP通信アプリケーションを作成します。

      | prog | C#言語 | comments(0) | - |
      C#言語(4)−RS232C通信(シリアル通信)(2)
      0

        JUGEMテーマ:プログラミング

         

        前回RS232通信のアプリケーションのダイアログを作成しました。

         

         

        本日は、各種ボタンやテキストボックスの動作を定義していきます。

         

        まずは、ダイアログをロードしたときの動作です。

        private void SerialForm_Load(object sender, EventArgs e)
        {
            string[] PortList = SerialPort.GetPortNames();
        
            cmbBox_Port.Items.Clear();
        
            foreach (string PortName in PortList)
            {
                cmbBox_Port.Items.Add(PortName);
            }
        }
        

        SerialPortクラスのメソッド、GetPortNamesで利用可能なシリアルポート名を取得します。

        取得したシリアルポート名をcmbBox_Portコンボボックスの値に追加します。

        これで、アプリケーション実行時にシリアルポートを選択できます。

         

        次は接続ボタンの動作です。

        private void Btn_Connect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == false)
            {
                if (cmbBox_Port.Items.Count <= 0)
                {
                    return;
                }
        
                serialPort1.PortName = cmbBox_Port.SelectedItem.ToString();
                serialPort1.BaudRate = 9600;
                serialPort1.DataBits = 8;
                serialPort1.Parity = Parity.None;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Handshake = Handshake.None;
                serialPort1.Encoding = Encoding.GetEncoding(932);
                serialPort1.ReadTimeout = 3000;
        
                try
                {
                    serialPort1.Open();
                    MessageBox.Show("接続しました。");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
            }
        
            return;
        
        }
        

        ダイアログ作成時に追加しましたserialPort1のプロパティに各種パラメータを設定しています。

        OpenメソッドでRS232通信(シリアル通信)を開始します。

         

        解除ボタンの動作です。

        private void Btn_Disconnect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                MessageBox.Show("切断しました。");
            }
        
            return;
        }
        

        CloseメソッドでRS232通信(シリアル通信)を終了します。

         

        次は、送信ボタンの動作の定義です。

        private void Btn_Send_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == false)
            {
                MessageBox.Show("ポートが開かれていません。");
                return;
            }
        
            if (string.IsNullOrEmpty(txtBox_Send.Text) == true)
            {
                MessageBox.Show("テキストボックスが空欄です");
                return;
            }
        
            try
            {
                serialPort1.Write(txtBox_Send.Text + "¥r");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        
            return;
        }
        

        WriteメソッドでPC側から相手側に文字列を1文字ずつ送信します。

        私の作成する組み込みソフトウェアは区切り文字に"¥r"を使用する使用であるので、Writeメソッドの引数文字列の最後の"¥r"を追加しています。

         

        受信ボタンの動作の定義です。

        private void Btn_Receive_Click(object sender, EventArgs e)
        {
            string sReceive = "";
        
            if (serialPort1.IsOpen == false)
            {
                MessageBox.Show("ポートが開かれていません。");
                return;
            }
        
            try
            {
                sReceive = serialPort1.ReadTo("¥r");
                sReceive = sReceive + "¥r¥n";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        
            txtBox_Receive.Text = txtBox_Receive.Text + sReceive;
        }
        

        ReadToメソッドで指定した文字までの文字列を受信します。

        タイムアウト時間は、接続ボタンを押した際に、3000msecと指定してあるので、3秒以上たっても指定した文字を受信しない場合は、タイムアウトします。

         

        これにてC#言語によるRS232通信の完成です。

         

        相手側はArduinoで作成しようと思います。

        相手側については下記のサイトに記載してあります。

        Arduino(1)−シリアル通信

         

        PC側からSendを送信すると、ArduinoのLED(L)が点灯します。

        PC側の受信ボタンを押すとOKを受信します。

         

        | prog | C#言語 | comments(0) | - |
        C#言語(3)−RS232C通信(シリアル通信)(1)
        0

          JUGEMテーマ:プログラミング

           

          組み込みソフトウェアの開発の際には、大概、シリアル通信機能を搭載します。

          シリアル通信を外部機器とのやり取るをする上で大切な機能です。

          デバック作業をする際にもとても役立ちます。

           

          PC側はOSI参照モデルの物理層に位置づけられるRS232C通信を使用します。

          それでは、早速、アプリケーションを作成しましょう。

          ボタンやテキストボックスの作成方法は、C#言語(2)−アプリケーションを作成してみるを参考にして下さい。

          下記のようなアプリケーションを作成します。

           

           

          プロパティのテキスト欄を編集して、ボタンやグループボックスの表示を編集できます。

           

           

          プロパティのNameを編集して、ボタンやテキストボックスに識別子を定義します。

           

           

          下記にボタンやテキストボックスの識別子を記載しておきますので、参考にして下さい。

          Name Text
          groupBox1 ポート
          cmbBox_Port 空欄
          Btn_Connect 接続
          Btn_Disconnect 解除
             
          groupBox2 送信
          txtBox_Send 空欄
          Btn_Send 送信
             
          groupBox3 受信
          Btn_Receive 受信
          txtBox_Receive 空欄

           

          今回、ポイントとなってくるのが下記の作業になります。
          ツールボックスよりSerialPortをダブルクリックして追加します。

          ダイアログの下の方にserialPort1が追加されています。

          このserialPort1を使用して、RS232通信を行います。

           

           

          まずは、ダイアログの作成までできました。

          次回から各種ボタンやテキストボックスのなどの動作を定義していこうと思います。

          | prog | C#言語 | comments(0) | - |
          C#言語(2)−アプリケーションを作成してみる
          0

            JUGEMテーマ:プログラミング

             

            前回、C#言語を使用する為の開発環境(Visual Studio)の準備をしました。

            今回は、早速、アプリケーションを作成してみましょう。

             

            作成するアプリケーションは下記のようなダイアログになります。

             

            表示ボタンを押すと、テキストボックスにHelloと表示して、クリアボタンを押すと、テキストボックスを空欄にするアプリケーションです。

             

            まずは、新規プロジェクトの作成を行います。

            メニューより、ファイル、新規プロジェクト作成を選択します。

             

            すると、下記のような画面が表示されるので、windowsアプリケーションを選択、プロジェクト名(任意名)を入力して、完了を選択します。

            私は、Application_001というプロジェクト名にしました。

             

            すると、C#言語でwindowsアプリケーションを作成するためのベースが用意されます。

             

            この状態で、ビルドしてみましょう。

             

            ビルドが成功したら、デバックを実行します。

             

            すると、下記のような何も設置していないダイアログが表示されます。

             

            要するに、新規にプロジェクトを作成するだけで、ここまで作成してくれるのです。

            すばらしーい!!

             

            それでは、テキストボックスを配置します。

            ツールボックスからTextBoxを選択し、ドラック&ドロップで配置できます。

            プロパティのデザインのNameにtextBox1と記載されてますが、これがテキストボックスの識別子となります。

             

            同じように、ボタンも配置します。

            ツールボックスからButtonを選択し、ドラック&ドロップで配置します。

            ボタンの識別子はそれぞれbutton1とbutton2になっています。

             

            次に、ボタンの名称を変更してみましょう。

            プロパティの表示にTextという欄があるので、button1には表示、button2にはクリアを入力します。

            するとダイアログ上のボタンの表記が変わります。

             

            それでは、ボタンの動作を定義します。

            button1(表示)をダブルクリックします。

            すると、button1_Clickという関数が作成されます。

            この中にbutton1をクリックした際の動作を記述します。

             

            butto1_Click関数に下記のコードを記述します。

            textBox1.Text = "Hello";

             

            button2(クリア)も同じようにbutto2_Click関数を作成し、に下記のコードを記述します。

            textBox2.Text = "";

             

            これで完成です。

             

            それでは先程と同じようにビルドして、デバックを実行してみましょう。

            下記のようなダイアログが表示されます。

             

            ダイアログ上の表示をクリックすると、テキストボックスにHelloという文字が表示されます。

             

            クリアをクリックすると、空欄になります。

             

            このようにアプリケーションが作成できます!

             

            | prog | C#言語 | comments(0) | - |
            C#言語(1)−開発言語(VisualStudio)の準備
            0

              JUGEMテーマ:プログラミング

               

              今回は、C#言語についてのお話です。

               

              C#言語は、自分のイメージでは、Visual Basicと C++の良いところどりというイメージです。

              とても使いやすい言語であると思います。

              もともとは、C++言語を使うことが多かったのですが、最近はほとんど、C#言語でアプリケーションの作成を行っています。

               

              それでは、まずは、開発環境のVisual Studioをインストールします。

              下記のサイトにアクセスして、無償版であるVisual Studio Communityをクリックすると、インストーラのダンロードが開始されます。

              https://www.visualstudio.com/ja/downloads/?rr=http%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fdev%2Fdefault.aspx

               

              vs_community__○○○.○○○.exeというファイルがダウンロードされると思います。

              これをダブルクリックで実行すると、インストールが開始されます。

              インストールを開始すると下記のような画面が表示されます。

              今回、C#言語での開発を行おうと考えているので、とりあえず下記の3点にチェックを入れて、インストールボタンをクリックすればいいかなと思います。

              後は、自動でインストールしてくれますが、インターネットを使用して、ファイルをダウンロードをしながらインストールをしますので、インターネットには接続した状態で行ってください。

               

              インストールが完了すると、Visual Studio 2017というアイコンがあると思いますので、ダブルクリックで実行して下さい。

              無い場合は、スタートメニューよりVisual Studio 2017を選択して下さい。

              選択するとVisual Studio 2017が実行されるので、画面の支持に従って、進めて下さい。

              確かMicrosoftのアカウントを登録するように求められるので、登録して下さい。

              登録しないと、最初のころはよいのですが、後々Visual Studioが使用できなかったような気がします。

               

              最終的には、下記のような画面が表示されれば準備OKです。

               

               

               

               

              | prog | C#言語 | comments(0) | - |
              VBA(4)−アプリケーションの実行
              0

                JUGEMテーマ:プログラミング

                 

                今回は、vbaからアプリケーションの実行をします。

                 

                アプリケーション内で処理を完結したかったのですが、なかなか融通がきかなかったので、vbaと組み合わせることにしました。

                その為、vbaからアプリケーションを実行する方法を模索したところ、下記の2つの方法がありました。

                 

                Shellを使用して実行する

                Sub Sample()
                    Shell "C:¥Windows¥Notepad.exe", 1
                    SendKeys "1"
                End Sub
                
                

                Shellを使用して、ノートパッドを開いて、1を記入してみました。

                ※PCによっては、処理速度の問題で1が入力されていない場合もあります。

                 その場合は、Sendkeysの前にSleep処理を入れるなどして処理を遅らせてください。

                Shellを使用した場合ですが、アプリケーションを開いた後、vbaへ処理がもどってしまいます。

                また、ファイルからの実行ができないので少々今回の目的を達成するには機能が不十分です。

                 

                CreateObject("Wscript.Shell").Runを使用して実行します。

                Sub Sample()
                    With CreateObject("Wscript.Shell")
                        .Run "C:¥sample.xlsx", , True
                    End With
                End Sub
                
                

                CreateObject("Wscript.Shell").Runを使用した場合、ファイルからの実行もできるので、便利です。

                また、引数をTrueにする事で、アプリケーションを実行して、終了するまで、vbaへ処理が戻らないので、今回の目的に合致しています。

                ※引数にFalseに設定すると、アプリケーションを実行した後に、vbaへコントロール戻すような処理にもできます。

                 

                今回は、△僚萢を使用する事で、vbaのプログラミングを行いました。

                 

                | prog | VBA | comments(0) | - |
                VBA(3)−VBAの使い方 コードを書いてみる
                0

                  JUGEMテーマ:プログラミング

                   

                  前回、VBAの開発環境の準備を行いました。

                   

                  今回は、この開発環境を使用して、VBAプログラミングを実施してみます。

                   

                  VBAで行ってみることは、下記の通りになります。

                  Excelのセルの値を読み取る。

                  ▲札襪涼佑+1する。

                  +1した値をメッセージボックスに表示する。

                  +1した値を別のセルに書き込む。

                   

                  まずは、モジュールを作成します。

                  VBAProject(Book1)を右クリックして、メニューを表示します。

                  メニューから、[挿入]→[標準モジュール]を選択します。

                   

                  標準モジュールが作成されました。

                   

                  この標準モジュールの中に、VBAでプログラミングしていきます。

                  実際にプログラミングした結果は以下のようになりま。

                  Sub Main()
                      
                      Dim iInput As Integer
                      Dim iOutPut As Integer
                      
                      iInput = ActiveSheet.Range("A1")
                      iOutPut = iInput + 1
                      MsgBox iOutPut
                      ActiveSheet.Range("B1") = iOutPut
                      
                  End Sub
                  
                  

                  Excelは下記の状態にしておきます。

                   

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

                  メニュバーの[実行]→[Sub/ユーザーフォーム]の実行を選択します。

                  (上記選択の他にもソースコード上で「F5キー」を押しても実行できます。)

                   

                  実行結果は下記のようになります。

                   

                  実際に動くとやっぱりおもしろいですね!

                  | prog | VBA | comments(0) | - |
                  VBA(2)−VBAの使い方 開発環境の準備
                  0

                    JUGEMテーマ:プログラミング

                     

                    前回、VBAによるExcelのPDF化のお話をしました。

                    まだVBAの使い方のお話をしていなかったので、まとめていこうと思います。

                     

                    最近のバージョンのExcelは、開発機能がデフォルトでは表示されていません

                     

                     

                    まずは、開発機能を表示しましょう。

                    [ファイル]→[オプション]→[リボンのユーザ設定]を選択します。

                    「開発」にチェックします。

                     

                    すると、開発機能が表示されました。

                     

                    「Visual Basic」を選択します。

                     

                    この画面を使って、VBAプログラミングを行います。

                    | prog | VBA | comments(0) | - |
                    VBA(1)−ExcelシートのPDF化
                    0

                      JUGEMテーマ:プログラミング

                       

                      こんにちは。progです。

                      これから宜しくお願いします。

                       

                      今回は、VBAを使用したExcelシートのPDF化についてのお話です。

                      VBAは、Visual Basic for Applicationsの略で、主にMicrosoftのOffice機能にて使用します。

                      Officeを使用した作業の効率化の為、VBAにてプログラミングを実施して機能を作成したりします。

                      また、VBAの使い方などもご紹介していこうと思いますが、今回はExcelシートのPDF化に的を絞って、考えていこうと思います。

                       

                      サンプルコードは以下の通りです。

                      
                      '------------------------------------------------------------
                      '印刷(PDF作成)の為の設定
                      '------------------------------------------------------------
                      ActiveSheet.PageSetup.Orientation = xlPortrait ' 縦向き印刷設定
                      ActiveSheet.PageSetup.FitToPagesWide = 1 '全ての列を1ページに印刷
                      ActiveSheet.PageSetup.FitToPagesTall = 1 '全ての行を1ページに印刷
                      ActiveSheet.PageSetup.Zoom = False ' 拡大しない
                      End With
                      '------------------------------------------------------------
                      'PDF作成
                      'ExportAsFixedFormatの引数
                      'Type:=Type:=xlTypePDF→フォーマットの指定
                      'Filename:=Filename→保存名
                      'Quality:=xlQualityStandard→PDFの品質
                      'IncludeDocProperties:=True→ファイルの文書プロパティの有無
                      'IgnorePrintAreas:=False→印刷範囲の有無
                      'OpenAfterPublish:=True→PDF作成後に、データを開くかどうか
                      '------------------------------------------------------------
                      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Filename, _
                      Quality:=xlQualityStandard, _
                      IncludeDocProperties:=True, _
                      IgnorePrintAreas:=False, _
                      OpenAfterPublish:=True
                      
                      

                      横向き印刷したい場合は、

                      ActiveSheet.PageSetup.Orientation = xlPortrait

                      ActiveSheet.PageSetup.Orientation = xlLandscape

                      というようにします。
                       

                      印刷範囲の指定をしたい場合は、

                      'ActiveSheet.PageSetup.PrintArea = "A$1:$D$69"

                      を追加します。

                       

                      印刷用紙サイズの指定をしたい場合は、

                      'ActiveSheet.PageSetup.PageSize = xlPaperA4

                      を追加します。

                       

                      このようにVBAで記述するとExcelシートのPDF化ができます。
                       

                      | prog | VBA | comments(0) | - |