てみブログ

てみブログ

個人的な覚書用です

Node.js

前提条件

OSにNode.jsがインストールされていること。

Linuxでインストールパッケージがある場合、

$sudo yum install nodejs

・バージョン確認

>node -v

にてバージョンが表示されればインストールされている。




インストールパッケージが無い場合、Webからダウンロードする。

wget https://nodejs.org/dist/v16.16.0/node-v16.16.0-linux-x64.tar.xz

取得元URLは、以下のサイトから、OSに合わせてリンクをコピーしてくる。
https://nodejs.org/ja/download/
今回は、Linuxのx64のものを選択した。

パッケージがダウンロードできたら、解凍する。

tar -xvf node-v16.16.0-linux-x64.tar.xz

回答したフォルダの、/bin/nodeを、ルート配下の/bin/nodeにコピーする。
これで、node -vが通るはず。 この状態で、

$sudo yum install nodejs

これで、npmが通るようになる。

プロジェクトの作成

npm(Node Package Manager)を使って準備する。

プロジェクトフォルダを作成し、そこに移動する。
以下コマンドでプロジェクトを作成する。

$ npm init --yes

アプリフォルダに「package.json」が生成されたことを確認する。



必要なパッケージをインストールする。
複数同時にインストールする場合は、スペース区切りで記載する。

・必須:expressとejs

$ npm install express ejs

・ファイル更新時に自動でアプリを再起動する:Nodemon

$ npm install -g nodemon

・パスワードを暗号化する:bcrypt

$ npm install bcrypt

・セッションを管理する:express-session

$ npm install express-session

MySQLと接続する

$ npm install mysql

・サービスをデーモン化し永続起動する:forever

$npm install forever
TOPICS:EJSについて

EJS(Embedded Java Script)
JavaScriptとHTMLを両方記述できるNode.jsのパッケージ

基本的にHTMLを記載するものだが、ejs形式のファイルではHTML内に以下記法でJSを埋め込むことができる

<% item.id %>   //表示されない処理
<%= item.id %>    //表示される処理

アプリケーションの作成

プロジェクトフォルダ直下に、JavaScriptアプリケーションを配置する。
\app.js

const express = require('express');
const app = express();

app.get('/',(req, res) => {
   res.render('index.ejs');
});

app.listen(3000)
#3000はポート番号

viewsフォルダ下にページを配置。
\views\index.ejs

<!DOCTYPE html>  
<html>
  <head>
    <meta charset="utf-8">
    <title>Test Page</title>
  </head>

  <body>
    <h1>Hello World</h1>
  </body>
</html>


サーバーを起動
$ node app.js

http://localhost:3000にアクセスし、HelloWorldが表示されることを確認する。
※外部からのアクセスが通らない場合は、指定したポートがFWでブロックされていないかを確認。

起動中はコンソール操作不可。Ctrl+Cで終了。


foreverモジュールを使って永続起動する場合は、

$forever start app.js

停止は、

$forever stop app.js

状態確認は、

$forever list



ルーティングの追加

\app.js

app.get('/top',(req, res) => {
    res.render('top.ejs');
});

\views\top.ejs

CSSの適用/Imageの保存

アプリ内で、publicフォルダをUseする。
\app.js

app.use(express.static('public');

publicフォルダを作成し、スタイルシートや画像を配置する。
\public\css\style.css
\public\images\top.png

ページのHTMLにて、publicフォルダ下のCSSや画像を読み込む。
\views\index.ejs

<link rel="stylesheet"
      href="/css/style.css">
<img src="/images/top.png">

クエリパラメータを受け取る

req.queryで受け取れる。 \app.js

app.get('/query',(req, res) => {
    console.log(req.query);
    console.log(req.query.id);
    console.log(req.query.name);

});

以下をリクエストする:
http://localhost:3000/query?id=001&name=hogehoge

コンソールログの出力:

>{ id: '001', name: 'hogehoge' }
>001
>hogehoge

JSONを返す

・決め打ちで返す。
\app.js

app.get('/json',(req, res) => {
    res.json({'message': 'HelloWorld'});
});

http://localhost:3000/json

{"message":"HelloWorld"}

変数格納でもOK。
app.js

app.get('/json',(req, res) => {
    var my_res ={'message': 'HelloWorld'};
    res.json(my_res);
});

JSONを作って返す。
javascriptの文法だが、以下の通り処理できる) app.js

app.get('/json',(req, res) => {
    var data = {};
    data["id"] = "001";
    data["name"] = "Taro";
    my_res = JSON.stringify(data);
    res.json(my_res);
});

データベース連携

MySQLのインストール [ターミナル]

$ npm install mysql

MySQLへの接続 [JavaScript]

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test_db'
});

//失敗時のエラー処理
connection.connect((err) => {
  if (err) {
    console.log('error connecting: ' + err.stack);
    return;
  }
  console.log('success');
});



・クエリの実行
該当ページを開く際のルーティングに処理を記載する。
[app.js]

connection.query(
  'SELECT * FROM test_table',
  (error, results) => {
    console.log(results);  //実行結果の配列がコンソール出力される。
    res.render('index.ejs', {items: results});  //index.ejsに取得オブジェクトを返す
  }
);

[index.ejs]

<% items.forEach( (item) => { %>

・フォームの送信
[news.ejs]

<form action="/create" method="post">
  <input type="text" name="itemName>
  <input type="submit" value="作成する">
</form>

post用のルーティングを記載する
[app.js]

//フォームから送信された値を受け取る
app.use(express.urlencoded({extended: false}));

//postのルーティングを記載
app.post('/create', (req,res) => {
  //フォームから受け取った内容をコンソール出力。
  console.log(req.body.itemName);

  //クエリを記載(※上記の「クエリを実行」の内容と同様。)
  connection.query(
    'SELECT * FROM test_table',
    (error, results) => {
      res.render('index.ejs', {items: results});
    }
  );
}



取得した値をデータベースに書き込む(INSERT)
前項でconsole.log出力していた部分を、INSERT文に変更している。
[app.js]

app.post('/create', (req,res) =>{
  connection.query(
    'INSERT INTO test_table (name) VALUES(?)',
    [ req.body.itemName ],    //クエリ中の"?"に変数の値を代入
    (error, results) => {
      //結果取得処理として前項のSELECT処理を行う。
      connection.query(
        'SELECT * FROM test_table',
        (error, results) => {
          res.render('index.ejs', {items: results});
        }
      );
    }
  );
}



・リロードによりINSERTクエリを再送信してしまうため、 リダイレクトを用いる。
(直近のリクエストは/createのため、リロード時に再度/createをリクエストしてしまう。/createの後/indexにリダイレクトすることで、直近リクエストが/indexになり、リロードによる再Insertを防ぐことができる。)

  (error, results) => {
    res.redirect('/index');
  }

・削除クエリ DELETE

[index.ejs]

<!--post内容にidを含めるようフォーム(リンク)を作成しておく-->
<form action="/delete/<%=item.id%>" method="post">
  <input type="submit" value="削除">
</form>

[app.js]

app.post('/delete/:id', (req,res) => {
  //受け取ったidをコンソール表示
  console.log(req.params.id);

  //削除クエリを実行する。
  connection.query(
    'DELETE FROM items WHERE id = ?',
    [req.params.id],
    (error, results) => {
      //インデックスページにリダイレクトする
      res.redirect('/index');
    }
  );
});

・更新クエリ UPDATE

[index.ejs]

<!--idを含めた形で編集画面を開くリンクを作成する-->
<a href="/edit/<%=item.id%>">編集</a>

[app.js]

//編集画面を開く処理
app.get('/edit/:id', (req,res) => {
  //受け取ったidをコンソール表示
  console.log(req.params.id);

  //受け取ったidに基づき、DBをSelectする。
  connection.query(
    'SELECT * FROM items WHERE id = ?',
    [req.params.id],
    (error, results) => {
      //編集ページを開く。この時、取得結果を引き渡す。
      res.render('edit.ejs', {item: results[0]});
    }
  );
});

//更新ボタンを押したときの処理
app.post('/update/:id' (req, res) => {
  //編集画面で入力されたテキスト
  console.log(req.body.itemName);

  //Update処理
  connection.query(
    'UPDATE items SET name = ? WHERE id = ?',
    [req.body.itemName, req.params.id],.
    (error, results) => {
      res.redirect('/index');
    }
  );
});

編集画面 [edit.ejs]

<form action="/update/<%=item.id%>" method="post">
  <!--入力テキストボックス。取得した値を初期値セットする。-->
  <input name="itemName" value="<%=item.name%>" type="text">
  <input type="submit" value="更新する">
  <!--更新時の戻り値に、req.body.itemNameを渡す-->
</form>

デバッグ

//エラーがあれば出力するようにしておく。
(error, results){
  if(error){
    console.log(error);
  }
}

VC# Windows Formアプリケーション基礎

・共通
 プロパティ>デザイン>(Name)で識別名をつける  プロパティ>表示>Textで、表記内容 f:id:temi0412:20200816153528p:plain
f:id:temi0412:20200816153610p:plain

・メイン窓
 画面サイズを小さくした時に自動ですくろーるばーを出すには、
 配置>AutoScrollをTrue

・入力窓
 Textboxコントロールを使う

/

 プロパティ>動作>TabIndexで、タブを押したときにカーソルが移動する順序を規定する。
  デフォルトでは、フォームを配置した順にいどうする。

・テキスト
 Labelコントロールを使う

・ボタン
 Buttonコントロール

・フォーム自体のプロパティ
 表示>Text にウインドウタイトル
 配置>Size でウインドウサイズを数値指定

・コード
 フォームを ダブルクリックして、コード入力に移る  画面から値を読み取るには、
  例えば、TextBox1というNameの入力値(Textプロパティの値)を読み取る場合は、
  input1 = TextBox1.Text

・入力値の型変換
例えば以下コードは、Int型に変換し、変換に失敗した場合は0を返す。
if(!int.TryParse(textValue.Text, out value))
value=0;

・メッセージボックスを表示
 MessageBox.Show("メッセージを表示");

Java Script 基本文法

コンソール出力

console.log("Hello World");

// で1行コメントアウト  
/* 範囲コメントアウト */

文字列はシングルクオート、ダブルクオートどちらで囲んでもOK

変数定義

・変数定義

let name = "hogehoge";
console.log(name + "です");

> hogehogeです

・定数定義

const name = "fugafuga";
//上書き不能(上書きしようとするとエラーになる)

テンプレートリテラル

文字列の中に変数を埋め込む記法

const name="hogehoge"
let age = 20
console.log(`${name}は${age}です`);

Point
・全体をバッククオートで囲む。
・変数、定数を${}で参照する。

条件分岐(IF)

if (number === 10){
    console.log("10です");
} else if (number > 10) {
    console.log("10より大きい");
} else {
    console.log("10より小さい");
}

演算子

//比較演算子
== あいまい一致 ※
=== 厳密一致 ※
!== 不一致
>、<、>=、<= 比較
※厳密一致では型の違いを許容しない。
例)
 5=='5' //true
 5==='5' //false

&& And条件
|| OR条件

//演算

number = number + 1;
number += 1;
number++;

Switch文

switch (rand){
 case 0:
    console.log("グー");
    break;
 case 1:
    console.log("チョキ");
    break;
 case 2:
    console.log("パー");
    break;
 default:
    console.log("エラー");
    break;
}

While文

let number  = 1;

while (number <=10){
  console.log(number);
  number += 1;
}

For文

for (let number =1; number <=10; number +=1){
  console.log(number);
}

配列

let animals = ["dog","cat","mouse"];

for (let i=0; i<animals.length; i++){
    console.log(animals[i]);
}
//forEachによる再起呼び出し
animals.forEach(( (animal) => {
  console.log(animal);
};

オブジェクト

let profile={name:"hoge", age:20};
console.log(profile.name);

関数定義

const myFunc = function(引数){
    console.log("処理”);
    return 戻り値;
}
//呼び出し
myFunc(引数);

//関数定義は以下記述も可能(アローファンクション)
const myFunc = (引数) =>{
}

//引数を複数指定する場合はカンマで区切る

クラス

class Animal{    //クラスの作成
  //コンストラクタ(インスタンス作成時に実行したい処理を記述)
  constructor(name,age){    
      this.name = name;
      this.age = age;
  }
  greet(){    //メソッドの記述(名前は任意)
      console.log("こんにちは");
  }
  info() {    //メソッドの記述(名前は任意)
    this.greet();
    console.log(`名前は${this.name}です`);
    console.log(`${this.age}歳です`);
  }
}

const animal = new Animal("ポチ",3);
animal.info();

>こんにちは
>名前はポチです
>3歳です

・クラスの継承

//Animalクラスを継承したDogクラスを作成する
class Dog extends Animal{
  //コンストラクタをオーバーライド
  constructor(name,age,breed)}
    //親クラスのコンストラクタを継承(スーパークラス)
    super(name,age);
    this.breed = breed;
  }
  //Dogクラスのみで定義するメソッド(人間換算年齢を返す)
  getHumanAge{
    return this.age * 7;
  }
  //親クラスにもあるメソッドをオーバーライド
  info(){
    this.greet();
    console.log(`名前は${this.name}です`);
    console.log(`犬種は${this.breed}です`);
    console.log(`${this.age}歳です`);
    const humanAge = this.getHumanAge();
    console.log(`人間年齢で${humanAge}歳です`);
  }
}

const dog = new Dog("ポチ",4, "柴犬");
dog.info();


>こんにちは
>名前はポチです
>犬種は柴犬です
>4歳です
>人間年齢で28歳です




モジュール分割(クラス)

別ファイルに分けた場合の関連付け 「script.js」「dog.js」「animal.js」
[animal.js]

class Animal{
}
//デフォルトエクスポート(1ファイルに1つだけ)
export defalut Animal;

[dog.js]

import Animal from "./animal";
//デフォルトエクスポートされたクラス、値、関数などを、
//任意の名前でインポート(名前はAnimalでなくても良い)
名前付きエクスポート

[dog.js]

const dog1 = new Dog("ポチ", 4, "柴犬")
//名前付きエクスポート(複数可)
export {dog1, dog2, ...};

[script.js]

import {dog1, dog2} from "./dog".

ファイル参照について
"./dog" 同じディレクトリ内のdog.jsを参照
"./data/dog" dataフォルダ内のdog.jsを参照
"../dog" 一つ上の階層のdog.jsを参照

パッケージのインポート
import chalk form "chalk";

なお、chalkは文字色を変えることができる

console.log(chalk.yellow("test"));  //黄色文字
console.log(chalk.byCyan("test"));  //シアン背景

入力値を読み取る場合はreadline-syncパッケージを使う

import readlineSync from "readline-sync";
const name = readlineSync.question("名前を入力してください: ");
console.log(`名前は${this.name}です`);




モジュール分割(関数)

子モジュール側でexportsを指定し、親側でimportする。

子:module.js

exports.test_func = function() {
  console.log("Test Print");
}

親:app.js

var test_module = import('./module.js');

app.get('/', (req, res) => {
  test_module.test_func();
}






コールバック関数

//関数定義
const PRINTTEXT = () =>{
  console.log("テキスト出力");
}
//コールバック関数定義
const CALL = (CALLBACK) => {
  console.log("コールバック関数を呼び出します。")
  CALLBACK();
}
//呼び出し
CALL(PRINTTEXT);

※大文字部は任意に命名した関数名

引数で関数を定義する

//コールバック関数定義
const CALL = (CALLBACK) => {
  console.log("コールバック関数を呼び出します。")
  CALLBACK();
}
//呼び出し
CALL(
  () =>{
    console.log("テキスト出力");
  }
);

コールバック関数に引数を渡す

//コールバック関数定義
const CALL = (CALLBACK) => {
  CALLBACK("トム","勝ち");
}
//呼び出し
CALL(
  (name,result) =>{
    console.log(`${name}の${result}です。`);
  }
);

>トムの勝ちです。

Java 基本文法

Hello World

class Main {
  public static void main(String[] args) {
    System.out.println("Hello Java");
  }
}

コメントアウト

//コメント
/*範囲コメント*/

変数定義

int number = 10;
double pi = 3.14;
String Name = "hogehoge";
boolean flag = true;

//型キャスト
int a=10
int b=4
System.out.println((double)a/b);
//2.5

if文

if (x==10){
    System.out.println("xは10");
}else if (x>10){
    System.out.println("xは10より大きい");
}else{
    System.out.println("xは10より小さい");
}

//一致 x==10
//大小 x>10
//非一致 x!=10   !(x>10)
//アンド x==10 && y==10
//オア x==10 || y==10

switch文

    switch(number%3){
      case 0:
        System.out.println("3で割り切れます");
        break;
      case 1:
        System.out.println("3で割ると1余ります");
        break;
      case 2:
        System.out.println("3で割ると2余ります");
        break;
      default:
        break;
    }

while文

//カウントダウン
    while (number > 0){
      System.out.println(number);
      number --;

for文

    for (int i=1; i<=10; i++){
      System.out.println(i+"回目のループです");
    }

//途中で抜ける場合、break
//その周回をスキップして次の周回に移るにはcontinue

配列

   String[] names = 
    {"hogeA", "hogeB", "hobeC"};
    
    System.out.println(names[0]);
    //hogeA

SQL基本文法

※基本的にMySQLにて確認しています。

コメントアウト

文頭に「--」(ハイフン2個)を付ける

--コメント

範囲コメントアウトは /* */

/* ここからコメント

ここまでコメント*/

Select(読み出し)

--Selectする
select * from テーブル名;

--※SQLは文末にセミコロンが必要。
--セミコロンがあるまでは何回改行しても一文。

--カラムを選択してSelectする
select カラム名1, カラム名2 from テーブル名;


--where(絞り込み) 
select * from テーブル名 where カラム名 = '' and カラム名 = '';

--あいまい検索
select * from テーブル名 where カラム名 like '_値%';
--%はワイルドカード。0文字以上の任意の文字。
--_は1文字の任意の文字。


--order by (並び替え)
select * from テーブル名 order by カラム名 asc;
-- asc : 昇順 (ascending)
-- desc : 降順 (descending)

--上位n件のみ表示
--①limit (SQL標準記法)
select * from テーブル名
order by カラム名 asc
limit 5;
--②top (DBによって使えたり使えなかったり。MSSQLはこれ使ってる)
select top 5 * from テーブル名
order by カラム名 asc;
--③副問い合わせしてrownumで絞る(Oracleではこれ使ってる)
select * from
  (select * from テーブル名 order by カラム名 asc)
where rownum >= 5;



--distinct (重複削除)
select distinct カラム名 from テーブル名;

集計

-- 合計(sum)
select sum(カラム名) from テーブル名;

--他の集計関数も使い方は同じ
--計上(count)、平均(avg)、最大(max)、最小(min)
--単純指定だと、結果は1行のみ返される。

--Group by
select sum(値のカラム名)
from テーブル名
group by 名称のカラム名;
--グループ化した名称ごとに集計した値が返される。
--(テストの集計などで、「教科」「点数」のカラムがあるイメージ)
--※Group byは、必ず集計関数と合わせて使う

--Having(Gruop byした結果の絞り込み)
--Whereの代わりにHavingを使う。使い方はWhereとほぼ同じ。

Join(結合)

--2つ以上のテーブルを結合して表示する。
select *
from テーブル1
join テーブル2
on テーブル1.id = テーブル2.id;
--テーブル1.idが外部キー、テーブル2.idがテーブル2の主キー

--joinだと、外部キーがNullだった行は表示されない。
--Null行も表示するには、「left join」を使う。文法は同じ。

--結合後のテーブルで、同じカラム名の行がある場合はドットで使い分けする。
--また、Asで命名しておけばその名前で表示される。
--例)
select テーブル1.name as '氏名'、テーブル2.name as '所属'


--(後で書く) 外結合、内結合、自然結合などの使い分けを書きたい。

Insert(作成)、Update(更新)、Delete(削除)

--Insert  
insert into テーブル名 (カラム1, カラム2) values ('値1', '値2');  
例)
insert into user_table (id, name, age) values ('1', 'ポチ', '5');  
id name age
1 ポチ 5
--Update
update テーブル名 set 上書きするカラム名 = '' where 検索するカラム名 = '' ;
例)
update user_table set name = 'タマ', age = '3' where id = '1';  
id name age
1 タマ 3
--Delete
delete from テーブル名 where  検索するカラム名 = '' ;
例)
delete from user_table where id = '1';

※updateとdeleteでは、必ずwhere句で行を指定すること(id指定など)  指定がない場合は全行更新or削除される。



COMMIT, ROLLBACK

トランザクションを反映するにはCommit、取り消すにはRollbackする。

commit;
rollback;



特定の作業まで戻りたい場合は、セーブポイントを設ける。

--処理1
SAVEPOINT save1;
--処理2
ROLLBACK TO save1;

save1のポイントまで戻る。処理1は適用(コミット前)、処理2は取り消しとなる。


MySQLではデフォルトでAutoCommitが有効。UpdateやInsertは即時コミットされる。

--AutoCommit状態の確認(1: 有効、0: 無効)
select @@autocommit;

--AutoCommit の有効化
set autocommit = 1;

--AutoCommitの無効化
set autocommit = 0;



クエリ内で変数を定義する

--定義
DECLARE @table_name = 'hogehoge'

--確認
PRINT @table_name

--参照
Select * from @table_name

--コマンドごと埋め込んで実行することも可能
DECLARE @command = 'select * from hogehoge'
EXECUTE @command

データベースの操作

CREATE DATABASE test_db;  --データベースの作成
SHOW DATABASE;  --データベースの確認
USE test_db;  --データベースの選択
DROP DATABASE test_db;  --データベースの削除

テーブルの操作

--テーブルの作成(例:自動生成ID、名前、年齢)  
※MySQLにて確認
CREATE TABLE test_table(
  id INT AUTO_INCREMENT,
  name TEXT,
  age INT,
  PRIMARY KEY (id)
)DEFAULT CHARSET = utf8;
 
--テーブル一覧の確認  
SHOW TABLES; 

--テーブルのカラム定義の確認  
SHOW COLUMNS FROM test_table;  
SHOW FULL COLUMNS FROM test_table;

--Create Table文の確認
SHOW CREATE TABLE test_table;

--テーブルのリネーム  
ALTER TABLE test_table RENAME TO test_table_renamed;  

--テーブルの削除  
DROP TABLE test_table;  

--データの投入
INSERT INTO test_table (name, age) VALUES ('太郎', 12);

--カラムの追加
ALTER TABLE items ADD COLUMN level INT;
※型指定が必要なので注意

--カラムを削除する
ALTER TABLE items DROP COLUMN level;

--追加したカラムに値を追加(Update)
UPDATE test_table SET level = 20 WHERE id = 1;
UPDATE test_table SET level = 18 WHERE id = 2;

--カラムのデータ型を確認する
DESCRIBE test_table;

--カラム名を変更する(例:levelをlevelsに変更する)
ALTER TABLE test_table CHANGE COLUMN level levels INT;

日付を扱う

現在日付の取得

SYSDATE() もしくは NOW() で取得可能。
システムの日時なので、タイムゾーンはシステムに依存する。

SELECT SYSDATE();
>2021-10-20 09:20:35

SELECT NOW();
>2021-10-20 09:20:35

※SYSDATEとNOWの違い
 ・SYSDATE⇒コマンドが実行された瞬間の時刻を返す。
 ・NOW⇒クエリが実行された時間を返す。
 短時間のクエリではほぼ同一の時間が返るが、処理に時間がかかるクエリを投げると差が出る。
 特に、単一のクエリの中で複数回現在時刻を呼び出す場合は、NOWの方が負荷を下げられ、また常に同じ値が得られるため使い勝手がいい。

フォーマットを調整する。

・日時の書く要素を取り出す

DATE( NOW() );  --日付を取り出す  >2021-10-20
TIME( NOW() );  --時刻を取り出す  >09:20:25

YEAR( NOW() );  --年を取り出す  >2021
MONTH( NOW() );  --月を取り出す  >10
DAY( NOW());  --日を取り出す  >20
HOUR( NOW() );  --時間(hour)を取り出す  >9
MINUTE( NOW() );  --分を取り出す  >20
SECOND( NOW() );  --秒を取り出す  >35
--※頭の0は外れる。(MySQLの場合)

DATE_FORMATを使う。
例えば、SYSDATEをYYYYMMDDの形式で取得する場合

SELECT DATE_FORMAT(SYSDATE(), '%Y%d%m');
>20211020

Excel VBA シート操作

行、列の操作

'''vb Columns(1).Insert 'A列に挿入 Columns("A").Insert 'A列に挿入 Rows(1).Insert '1行目に挿入

Columns(1).Delete   'A列を削除
Rows(1).Delete      '1行目を削除

Dim myrange As Range
Set myrange = "A2"

myrange.EntireColumn.Insert    'Rangeの列全体に挿入
myrange.EntireRow.Insert       'Rangeの行全体に挿入

’’’

文字色、塗り色を変える

VBA Excelマクロ 基本文法

概要

Excelを起動し、Alt+F11でVBAを開く

コメントアウト

' シングルクオート(')でコメントアウト

範囲コメントアウトする場合は、VBAツールバーの「編集」を表示し、コメントブロックを使用する。

コンソールデバッグ

VBAで、Ctrl+G、もしくは「表示」>「イミディエイトウインドウ」でウィンドウを出す。
内容がこちらに出力されるので、動作確認、デバッグに使用する。 基本的に、使用しているユーザーには見せないメッセージがこちら。

Debug.Print("テストメッセージ")

F9キーでブレークポイントの設定、削除の切り替え

ブレーク時に、イミディエイトに?{変数名}と入力しリターンすれば、その時点での変数値を表示
例:変数xの値を確認 (x=10)

?x
10

メッセージボックス出力

ユーザーに見せるメッセージなどはこちら。
(はい、いいえや、OK、キャンセルの入力を求める場合については後述)

MsgBox("テストメッセージ")

変数定義

Dim str As String

セル操作

  • セルの値の読み込み ‘‘‘vb Dim str As String str = Range("A1").Value 'A1セルの内容を読み込み(現在のシート) Debug.Print (str)
- セルの書き込み

Range("A1").Value = "テスト"


###IF文


###For文


###While文



###サブルーチン
・サブルーチンは返り値を持たない。



###ファンクション
・ファンクションは返り値を持つ。


###引数のbyRefとbyValについて
・byRef 参照渡し 関数内で値が変更された場合、元の関数でも値が変わる。
・byVal 値渡し 関数内で値が変更されても、元の関数には影響しない。