2020年11月26日木曜日

[VBA]複数のセルオブジェクトを1つのセルオブジェクトに統合する。

[はじめに]
・あまり知られていないかもしれませんが、
 複数のセルオブジェクトを、1つのセルオブジェクトに統合することができます。
 ※Union関数を使用。

 統合後のセルに対して、
 プロパティやメソッドにアクセスすると、
 統合前のセルすべてに対して、アクセスすることと同じ意味になります。
 複数のセルオブジェクトをまとめて処理したい場合に、便利です。
 ※[注意]セルの結合ではありません。

 以下は、
 「A1」、「B2:D5」、「D3,D5」の複数のセル領域を統合して、
 「Hello」の文字列を設定する例です。
  備忘録としてサンプルソースを掲載します。

[ソース]
Private Sub UnionSample()

    Dim cellArray() As Variant
    Dim cellUnion As Range
    Dim cell As Variant
    
    '① 統合前のセルを定義
    cellArray = Array(Range("A1"), Range("B2:C5"), Range("D3:F5"))
    
    '② ①で定義したセルを
    '  1つのセルオブジェクトに統合する。
    For Each cell In cellArray
        If cellUnion Is Nothing Then
            '初回のみセルを設定
            Set cellUnion = cell
        Else
            '2回目以降は、セルを統合する。
            Set cellUnion = Union(cellUnion, cell)
        End If
    
    Next
    
    '③ 統合後のセルに値を設定。
    cellUnion.Value = "Hello"

End Sub
[VBA]複数のセルオブジェクトを1つのセルオブジェクトに統合する。

2020年11月25日水曜日

[VBA]カラーの定数一覧

[はじめに]
・VBAで、
 色の定数を知りたいことがよくあるので、
 備忘録として掲載します。

カラーの定数一覧
ColorConstants定数
カラー例ColorConstants定数RGBカラー値
(R+G×256+B×2562)
黒■vbBlack0000
青■vbBlue0025516711680
シアン■vbCyan025525516776960
緑■vbGreen0255065280
マゼンタ■vbMagenta255025516711935
赤■vbRed25500255
白■vbWhite25525525516777215
黄■vbYellow255255065535


XlRgbColor定数
カラー例XlRgbColor定数RGBカラー値
(R+G×256+B×2562)
黒■rgbBlack0000
ディムグレー■rgbDimGray、rgbDimGrey1051051056908265
灰色■rgbGray、rgbGrey1281281288421504
濃い灰色■rgbDarkGray、rgbDarkGrey16916916911119017
銀色■rgbSilver19219219212632256
薄い灰色■rgbLightGray、rgbLightGrey21121121113882323
ゲーンズボロ■rgbGainsboro22022022014474460
ホワイトスモーク■rgbWhiteSmoke24524524516119285
白■rgbWhite25525525516777215
スノー■rgbSnow25525025016448255
ローズブラウン■rgbRosyBrown1881431439408444
薄いさんご■rgbLightCoral2401281288421616
インディアンレッド■rgbIndianRed20592926053069
茶■rgbBrown16542422763429
れんが色■rgbFireBrick17834342237106
栗色■rgbMaroon12800128
濃い赤■rgbDarkRed13900139
赤■rgbRed25500255
ミスティローズ■rgbMistyRose25522822514804223
サーモンピンク■rgbSalmon2501281147504122
トマト■rgbTomato25599714678655
濃いサーモンピンク■rgbDarkSalmon2331501228034025
さんご■rgbCoral255127805275647
オレンジレッド■rgbOrangeRed25569017919
薄いサーモンピンク■rgbLightSalmon2551601228036607
シェンナ■rgbSienna16082452970272
シーシェル■rgbSeashell25524523815660543
ピーチパフ■rgbPeachPuff25521818512180223
サンディブラウン■rgbSandyBrown244164966333684
リネン■rgbLinen25024023015134970
ペルー■rgbPeru205133634163021
ビスク■rgbBisque25522819612903679
濃いオレンジ■rgbDarkOrange255140036095
アンティークホワイト■rgbAntiqueWhite25023521514150650
タン■rgbTan2101801409221330
バーリーウッド■rgbBurlyWood2221841358894686
ブランシュアーモンド■rgbBlanchedAlmond25523520513495295
ナバホホワイト■rgbNavajoWhite25522217311394815
パパイヤホイップ■rgbPapayaWhip25523921314020607
モカシン■rgbMoccasin25522818111920639
オレンジ■rgbOrange255165042495
フローラルホワイト■rgbFloralWhite25525024015792895
オールドレース■rgbOldLace25324523015136253
小麦■rgbWheat24522217911788021
ゴールデンロッド■rgbGoldenrod218165322139610
濃いゴールデンロッド■rgbDarkGoldenrod18413411755384
コーンシルク■rgbCornsilk25524822014481663
ゴールド■rgbGold255215055295
レモンシフォン■rgbLemonChiffon25525020513499135
カーキ■rgbKhaki2402301409234160
濃いカーキ■rgbDarkKhaki1891831077059389
ペールゴールデンロッド■rgbPaleGoldenrod2382321077071982
アイボリー■rgbIvory25525524015794175
ベージュ■rgbBeige24524522014480885
明るい黄■rgbLightYellow25525522414745599
薄いゴールデンロッドイエロー■rgbLightGoldenrodYellow25025021013826810
オリーブ■rgbOlive128128032896
黄■rgbYellow255255065535
オリーブドラブ■rgbOliveDrab107142352330219
イエローグリーン■rgbYellowGreen154205503329434
濃いオリーブグリーン■rgbDarkOliveGreen85107473107669
グリーンイエロー■rgbGreenYellow173255473145645
若草色■rgbLawnGreen124252064636
シャルトルーズ■rgbChartreuse127255065407
ハニーデュー■rgbHoneydew24025524015794160
濃いシーグリーン■rgbDarkSeaGreen1431881439419919
明るい緑■rgbLightGreen1442381449498256
ペールグリーン■rgbPaleGreen15225115210025880
フォレストグリーン■rgbForestGreen34139342263842
ライムグリーン■rgbLimeGreen50205503329330
濃い緑■rgbDarkGreen0100025600
緑■rgbGreen0128032768
黄緑■rgbLime0255065280
淡いアクアマリン■rgbMediumAquamarine10225517011206502
淡いシーグリーン■rgbMediumSeaGreen601791137451452
シーグリーン■rgbSeaGreen46139875737262
ミントクリーム■rgbMintCream24525525016449525
スプリンググリーン■rgbSpringGreen02551278388352
淡いスプリンググリーン■rgbMediumSpringGreen025015410156544
アクアマリン■rgbAquamarine12725521213959039
ターコイズ■rgbTurquoise6422420813688896
薄いシーグリーン■rgbLightSeaGreen3217817011186720
淡いターコイズ■rgbMediumTurquoise7220920413422920
空色■rgbAzure24025525516777200
ペールターコイズ■rgbPaleTurquoise17523823815658671
濃いスレートグレー■rgbDarkSlateGray4779795197615
濃いスレートグレー■rgbDarkSlateGrey4779795197615
青緑■rgbTeal01281288421376
濃いシアン■rgbDarkCyan01391399145088
明るい水色■rgbLightCyan01391399145088
濃いターコイズ■rgbDarkTurquoise020620913749760
水色■rgbAqua025525516776960
カデットブルー■rgbCadetBlue9515816010526303
パウダーブルー■rgbPowderBlue17622423015130800
明るい青■rgbLightBlue17321623015128749
深いスカイブルー■rgbDeepSkyBlue019125516760576
スカイブルー■rgbSkyBlue13520623515453831
薄いスカイブルー■rgbLightSkyBlue13520625016436871
アリスブルー■rgbAliceBlue24024825516775408
スチールブルー■rgbSteelBlue7013018011829830
スレートグレー■rgbSlateGray1121281449470064
薄いスレートグレー■rgbLightSlateGray11913615310061943
ドジャーブルー■rgbDodgerBlue3014425516748574
薄いスチールブルー■rgbLightSteelBlue17619622214599344
コーンフラワーブルー■rgbCornflowerBlue10014923715570276
ロイヤルブルー■rgbRoyalBlue6510522514772545
ゴーストホワイト■rgbGhostWhite24824825516775416
ラベンダー■rgbLavender23023025016443110
ミッドナイトブルー■rgbMidnightBlue25251127346457
ネイビー■rgbNavy、rgbNavyBlue001288388608
濃い青■rgbDarkBlue001399109504
淡い青■rgbMediumBlue0020513434880
青■rgbBlue0025516711680
濃いスレートブルー■rgbDarkSlateBlue72611399125192
スレートブルー■rgbSlateBlue1069020513458026
淡いスレートブルー■rgbMediumSlateBlue12310423815624315
淡い紫■rgbMediumPurple14711221914381203
青紫■rgbBlueViolet1384322614822282
インディゴ■rgbIndigo7501308519755
濃いオーキッド■rgbDarkOrchid1535020413382297
濃い紫■rgbDarkViolet148021113828244
淡いオーキッド■rgbMediumOrchid1868521113850042
あざみ色■rgbThistle21619121614204888
プラム■rgbPlum22116022114524637
紫色■rgbViolet23813023815631086
紫■rgbPurple12801288388736
濃いマゼンタ■rgbDarkMagenta13901399109643
明るい紫■rgbFuchsia255025516711935
オーキッド■rgbOrchid21811221414053594
淡いバイオレットレッド■rgbMediumVioletRed199211338721863
深いピンク■rgbDeepPink255201479639167
ホットピンク■rgbHotPink25510518011823615
ラベンダーブラッシュ■rgbLavenderBlush25524024516118015
ペールバイオレットレッド■rgbPaleVioletRed2191121479662683
深紅■rgbCrimson22020603937500
ピンク■rgbPink25519220313353215
薄いピンク■rgbLightPink25518219312695295

2020年11月23日月曜日

[VBA]RGBカラー値からRGBの各々の値を取得

[はじめに]
・RGBの各要素からRGBカラー値を取得する為に、
 VBAではRGB関数が用意されていますが、
 その逆(RGBカラー値から元のRGB各要素を取得)の関数は
 用意されていません。

 たまに必要になることがあるので、
 ユーザ定義関数を作成しましたので、備忘録として掲載します。

[ソース]
'[機能]
' RGB カラー値から、
' 赤(R)、緑(G)、青(B)の各々の値を取得する。
'[引数]
' rgbColor:RGB カラー値
'[戻り値]
' RGBの各値(配列)
'  0番目:赤(R)
'  1番目:緑(G)
'  2番目:青(B)
Public Function GetRgbValues(ByVal rgbColor As Long) As Integer()

    Dim rtnColors(2) As Integer

    '赤(R)
    rtnColors(0) = rgbColor Mod 256
    '緑(G)
    rtnColors(1) = rgbColor \ 256 Mod 256
    '青(B)
    rtnColors(2) = rgbColor \ 65536

    GetRgbValues = rtnColors

End Function
[VBA]RGBカラー値から赤(R)、緑(G)、青(B)の各々の値を取得

2020年11月22日日曜日

[VBA]セルの取得、値の書き込み

[はじめに]
・Excel VBAでよくセルの情報を取得することがありますが、
 様々な書き方があるので、備忘録に記載します。

 セル座標をA1形式や行列番号で指定したり、
 複数セルの範囲指定、その他のブックやシート上のセルの取得 など
 用途に応じたパターンを適用頂ければと思います。

[ソース]
Private Sub WriteToCellValue()

    '■■■1.「A1形式」でセルを指定する。
    ' ①単一セルを扱う。
    ' ※例:セルA1に値を出力
    Range("A1").Value = "あ"
    
    ' ②複数セルを扱う(その1)
    ' ※例:セルA3~A5に値を出力
    Range("A3:A5").Value = "い"

    ' ③複数セルを扱う(その2)
    ' ※例:セルC1~D10に値を出力
    Range(Range("C1"), Range("D10")).Value = "う"

    '■■■2.行番号、列番号でセルを指定する。
    ' 行番号、列番号をカウントアップ等をさせたい場合、有効。
    ' ※例:セル(1行目、6列目)に値を出力
    Cells(1, 6).Value = "え"

    '■■■3.特定のセル範囲内から、相対的にセルを取得
    ' ※例:セルD4(B3~E5内で2行目、3列目)に値を出力
    Range("B3:E5").Cells(2, 3).Value = "お"

    '■■■4.特定のセル範囲内から、相対的な行を取得
    ' ※例:B3~E5内の1行目に値を出力
    Range("B3:E5").Rows(1).Value = "か"

    '■■■5.特定のセル範囲内から、相対的な列を取得
    ' ※B3~E5内の3列目に値を出力
    Range("B3:E5").Columns(3).Value = "き"

    '■■■6.他のシートのセルを扱う。
    ' 指定セルが、他のシートにある場合は、
    ' 以下のように記載します。
    ' シート省略時は、アクティブシートが対象になります。
    ' ※例:シートSheet1のセルA2に値を出力
    '   以下例のRangeは上記の1~5の表記でも可能。
    Sheets("Sheet1").Range("A2").Value = "く"

    '■■■7.他のブックのセルを扱う。
    ' 指定セルが、他のブック、シートにある場合は、
    ' 以下のように記載します。
    ' ブック省略時は、アクティブブックが対象になります。
    ' ※例:当ブックのシートSheet1のセルA3に値を出力
    '   以下例のRangeは上記の1~5の表記でも可能。
    ThisWorkbook.Sheets("Sheet1").Range("A3").Value = "け"

End Sub
[VBA]セルの選択

2020年6月9日火曜日

[.NET][Visual Studio]CodeLensを非表示にする。(○○個の参照)

[はじめに]
 Visual Studioはバージョンアップのたびに様々な便利機能が追加されますが、
 便利な反面、稀に不便なものもあります。
 そのうちの1つがCodeLensです。(あくまでも筆者の感想です)

 CodeLensとは、
 Visual Studio 2015で追加された機能で、
 コードエディタ上で、メソッドやクラスの定義の上の行に、
 そのメソッドやクラスを参照している個数を表示する機能です。
 (図1で「4個の参照」と表示されている箇所です。)

 一見、便利な機能ですが、
 コード編集時に「○○個の参照」の行にカーソルが入らない為、
 編集時に思い通りの動作にならず、不便に感じることがあります。

 CodeLensを無効にする設定が一見わかりづらいので、
 無効にする手順を、備忘録として掲載します。


【図1】
vs_01b.jpg

[CodeLensを無効にする手順]
(1)Visual Studio の「ツール」→「オプション」を選択し、
   オプションダイアログを表示させる。
  vs_02_01.jpg

(2)オプションダイアログの左側のツリービューで、
   「テキストエディタ」→「すべての言語]」→「CodeLens」をクリックし、
   右側のエリアの「CodeLens を有効にする」の
   チェックボックスのチェックを外す。
  vs_02_02.jpg

(3)(2)まで実施すると、CodeLensの表記が表示されなくなります。
  vs_03b.jpg

2020年6月7日日曜日

[.NET]yield returnの使用例(C#)

[はじめに]
 C#には「yield」キーワードがありますが、
 他の言語と比べて特殊でわかりにくいので、使い方の備忘録を掲載します。
 ※「yield」は、
  他の言語(JavaScript、Perl、Python等)でも採用されつつありますが。。。

 「yield」は、
 オブジェクト指向のデザインパターンのIteratorパターンの実装で利用されます。
 Iteratorパターンとは、多数の集合に対してその内部の実装を意識することなく、
 逐次処理するためのデザインパターンです。

 C#では、.NET Framework 2.0(Visual Studio 2005)から
 「yield」が導入されました。
 .NET Framework 1.1(Visual Studio .NET 2003)以前の版で、
 Iteratorパターンを実装するには、
 IEnumerableインタフェース、IEnumeratorインタフェースを実装したクラスを
 記述する必要がありましたが、
 .NET Framework 2.0(Visual Studio 2005)以降では、
 それらのクラスは「yield return」で代用され、
 Iteratorパターンの実装がより簡潔になりました。

[サンプルコード]
以下、2つのサンプルコードを掲載します。
2つのサンプルコードは、各々独立して動作します。
 /// <summary>
 /// yield returnの実装サンプル
 /// </summary>
 public class YieldSample1 : IEnumerable<string>
 {
     /// <summary>
     /// 月の異名の列挙を取得する。
     /// </summary>
     /// <returns>月の異名の列挙</returns>
     public IEnumerator<string> GetEnumerator()
     {
         yield return "睦月";
         yield return "如月";
         yield return "弥生";
         yield return "卯月";
         yield return "皐月";
         yield return "水無月";
         yield return "葉月";
         yield return "長月";
         yield return "神無月";
         yield return "霜月";
         yield return "師走";
     }

     /// <summary>
     /// 月の異名の列挙を取得する。
     /// </summary>
     /// <returns>月の異名</returns>
     IEnumerator IEnumerable.GetEnumerator()
     {
         return this.GetEnumerator();
     }
 }

 public class Program1
 {
     /// <summary>
     /// 列挙を取得し、各々の要素を出力する。
     /// </summary>
     /// <param name="args"></param>
     static void Main(string[] args)
     {
         System.Console.WriteLine("■月の異名を出力する。");

         IEnumerable<string> ie1 = new YieldSample1();
         foreach (var it1 in ie1)
         {
             System.Console.WriteLine(it1);
         }
         System.Console.WriteLine("");

         //[出力]
         // ■月の異名を出力する。
         // 睦月
         // 如月
         // 弥生
         // 卯月
         // 皐月
         // 水無月
         // 葉月
         // 長月
         // 神無月
         // 霜月
         // 師走

         //[補足]
         // 上記コードは、
         // 下記のように書き換えることも可能です。
         // 逆に言うと、foreachで実装すると、
         // 以下のコードに読み替えて実行されます。

         //System.Console.WriteLine("■月の異名を出力する。(while文で処理)");

         //IEnumerable<string> ie1 = new YieldSample1();
         //IEnumerator<string> it1 = ie1.GetEnumerator();
         //while (it1.MoveNext())
         //{
         //    System.Console.WriteLine(it1.Current);
         //}
         //System.Console.WriteLine("");

         System.Console.ReadLine();

     }
 }
[C#]yield returnの使用例(その2)


/// <summary>
/// yield returnの実装サンプル
/// </summary>
public class YieldSample2
{
    /// <summary>
    /// 干支の列挙を取得する。
    /// </summary>
    /// <returns>干支の列挙</returns>
    public IEnumerable<String> GetEto()
    {
        yield return "子年";
        yield return "丑年";
        yield return "寅年";
        yield return "卯年";
        yield return "辰年";
        yield return "巳年";
        yield return "午年";
        yield return "未年";
        yield return "申年";
        yield return "酉年";
        yield return "戌年";
        yield return "亥年";
    }
}

public class Program2
{
    /// <summary>
    /// 列挙を取得し、各々の要素を出力する。
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        System.Console.WriteLine("■干支を出力する。");

        YieldSample2 ie1 = new YieldSample2();
        foreach (var it1 in ie1.GetEto())
        {
            System.Console.WriteLine(it1);
        }
        System.Console.WriteLine("");

        //[出力]
        // ■干支を出力する。
        // 子年
        // 丑年
        // 寅年
        // 卯年
        // 辰年
        // 巳年
        // 午年
        // 未年
        // 申年
        // 酉年
        // 戌年
        // 亥年

        //[補足]
        // 上記コードは、
        // 下記のように書き換えることも可能です。
        // 逆に言うと、foreachで実装すると、
        // 以下のコードに読み替えて実行されます。

        //System.Console.WriteLine("■干支を出力する。(while文で処理)");

        //YieldSample2 ie1 = new YieldSample2();
        //IEnumerator<string> it1 = ie1.GetEto().GetEnumerator();
        //while (it1.MoveNext())
        //{
        //    System.Console.WriteLine(it1.Current);
        //}
        //System.Console.WriteLine("");

        System.Console.ReadLine();
    }
}
[C#]yield returnの使用例(その2)
[ご参考]
Iteratorパターンについて
 デザインパターン「Iterator」-Qiita

2019年8月11日日曜日

[Book's Review (Develop)]オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

(1)レビュー
 以下2冊の紹介です。

 (1)『オラクル認定資格教科書 Javaプログラマ Gold SE 8』(通称『紫本』)
 (2)『徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応』(通称『黒本』)

 今までMicrosoft系をメインに資格取得に励んできましたが、
 Java系の資格にもチャレンジすることになり、
 参考書として『紫本』を、
 問題集として『黒本』を購入しました。

 JavaSE8といえば、
 新機能のラムダ式やストリームAPI、
 日付/時刻API が注目されていますが、
 JavaSE7で追加された
 try-with-resources、switch文の拡張(String型のサポート)、
 ダイヤモンド演算子、例外のマルチキャッチ、
 Executor Service、Fork/Join Framework、
 数値リテラルのアンダースコアの区切り文字や2進数表記 等など
 普段の開発でも使いこなされていなさそうな機能についても、
 分かりやすい解説が充実しています。

 書店のIT系資格コーナーには
 必ずと言っていいほど並んでいる書籍ですが、
 有名なだけあり、内容も充実しています。
   『JavaSE8 Gold』資格取得を目指している方にぜひオススメの2冊です。

 また『Javaプログラマ Gold SE 8』は
 『Javaプログラマ Silver SE 8』が前提資格となります。
 Goldと併せて、Slver対策として、以下2冊もオススメです。
 (3)『オラクル認定資格教科書 Javaプログラマ Silver SE 8』(通称『紫本』)
 (4)『徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応』(通称『黒本』)

 [2019.8.10 合格]
 本試験は、Javaプログラマ歴、7、8年のベテランでも、
 1回の受験で通るのは難しいと言われています。
 Java開発経験は3年程度の私ですが、
 .NET(C#、VB.NET)の10年の開発経験で、
 オブジェクト指向やラムダ式の基本を理解していた為、
 『紫本』による学習、『黒本』による問題演習を、
 各々2周することで、1回の受験で合格できました。

(2)リンク
オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

  • 作者: 山本 道子
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/07/21
  • メディア: 単行本(ソフトカバー)
徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応

徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応

  • 作者: 米山 学
  • 出版社/メーカー: インプレス
  • 発売日: 2016/10/14
  • メディア: 単行本(ソフトカバー)
オラクル認定資格教科書 Javaプログラマ Silver SE 8

オラクル認定資格教科書 Javaプログラマ Silver SE 8

  • 作者: 有限会社ナレッジデザイン 山本道子
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/02/11
  • メディア: 単行本(ソフトカバー)
徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

  • 作者: 志賀 澄人
  • 出版社/メーカー: インプレス
  • 発売日: 2016/01/18
  • メディア: 単行本(ソフトカバー)

2019年3月10日日曜日

[JavaSctipt]文字列をクリップボードにコピーする

[はじめに]
ブログで記事の内容をクリップボードにコピーする機能を導入する機会があったので、
JavaScriptでクリップボードにコピーするコードを作りました。
動作確認は、『Microsoft Internet Explorer11』、『Microsoft Edge』で実施済です。

備忘録として、以下、2つのサンプルソースを掲載します。
2つのサンプルソースは、各々独立して動作します。
<html>
<head>
</head>
<body>

<table border='1'>
<tr><td>
<button
 type="button"
 onClick="
var ta=document.createElement('textarea');
ta.value=this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText;
this.appendChild(ta);ta.select();
document.execCommand('Copy');
alert('コピーしました。');
this.removeChild(ta);
"
>
コードのコピー
</button>
</td></tr>
<tr><td><font size="2" color="red">Hello,World!!</font></td></tr>
</table>

</body>
</html>
[JavaScript]文字列をクリップボードにコピーする(その1)


<html>
<head>
<script language="JavaScript">

/// <summary>
/// クリップボードに文字列をコピーする
/// </summary>
/// <param name="targetText">コピー対象の文字列</param>
/// <param name="docWork">ワーク用TextAreaの作成場所。省略時はdocument.body</param>
/// <remarks></remarks>
function copyText(targetText, docWork){

  //[説明]
  // クリップボードにコピーできる文字列は、
  // 入力可能なテキストコントロール(TextArea等)上で
  // 選択状態になっていることが前提となります。
  // この前提により、
  // テキストコントロール以外に記載された文字列を
  // クリップボードにコピーする為には、
  // 一時的にテキストコントロールを経由する必要があります。
  // 本関数では、
  // テキストコントロールを使用しない、かつ、
  // 改行コードを含む文字列の場合を考慮して、
  // 一時的にTextAreaを追加し
  // クリップボードにコピーした後、
  // TextAreaを削除しています。

  if(docWork==null || docWork==undefined){
    //引数docWorkを省略した場合は、
    //document.bodyとする。
    docWork=document.body;
  }

  //ワーク用のTextAreaを作成する。
  var ta=document.createElement("textarea");
  //コピー対象の文字列をTextAreaに書き込む。。
  ta.value=targetText;
  //ワーク用のTextAreaを追加する。
  docWork.appendChild(ta);
  //TextAreaの文字列を全選択する。
  ta.select();
  //選択状態の文字列をクリップボードにコピーする。
  document.execCommand("Copy");
  //コピー完了後のメッセージを表示する。
  alert("コピーしました。");
  //ワーク用のTextAreaを削除する。
  docWork.removeChild(ta);
}

</script>
</head>
<body>

<table border='1'>
<tr><td>
<button 
  type="button"
  onClick="copyText(this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText, this);">
  テキストをコピー
</button>
</td></tr>
<tr><td><font size="2" color="red">Hello,World!!</font></td></tr>
</table>

</body>
</html>   
[JavaScript]文字列をクリップボードにコピーする(その2)

2019年3月9日土曜日

[.NET][Edge対応版]プログラムコードの変換(C#、VB.NET→HTML)

[はじめに]
 ・プログラムソース(C#、VB.NET)を
  ブログ公開用のHTMLに変換するツールです。
  (コード量が膨大の為、変換処理のみ掲載しています。)
[機能]
  プログラムソースの文字列を、HTMLに変換する。
  変換後のHTMLは、<table>タグで整形した形になります。
[変換後HTML]
 ・インデントのスペースが「 」に変換され、ブラウザ上でも表示される。
 ・予約語、コメント、文字列(ダブルコーテーションで囲んだ部分)に色がつく。
 ・ソースコードをクリップボードにコピーする機能を提供。(「コードのコピー」ボタンを付加)
  IE、Edgeで動作確認済。
[制限事項]
 ・言語は、C#とVB.NETのみです。
  但し、VB6やVBA等はVB.NETと言語仕様が似ている為、
  制限事項を考慮の上、利用することもできます。
 ・C#のコメントは、行の先頭の「//」のみサポート。
  行の途中の「//」や「/*」~「*/」はサポートしません。
 ・VB.NETのコメントは、行の先頭の「'」のみサポート。
  行の途中の「'」はサポートしません。
[使い方]
 (1)ビルド前に、「System.Web」を参照設定に追加する。
   追加しないとコンパイルエラーになります。
 (2)CodeConverterToHtml クラスのGetInstanceメソッドで、
   変換オブジェクトを取得します。
   言語の種類(C#かVB.NET)は、GetInstanceメソッドの第1引数で指定します。 
 (3)CodeConverterToHtml クラスのConvertCodeToHtmlメソッドで、
   ソースをHTMLに変換します。
   ConvertCodeToHtmlメソッドの仕様
   ・第1引数:プログラムソースの文字列
   ・第2引数:整形後HTMLのタイトル。(省略可能)
   ・戻り値:変換後のHTMLの文字列
        変換後の文字列(HTML)は、
        <table>タグで整形した形となります。
        (<html>タグでは囲みません。)
'変換クラスを取得する。
Dim conv As CodeConverterToHtml = _
        CodeConverterToHtml.GetInstance( _
            CodeConverterToHtml.ProgLangType.VBNet _
        )

'プログラムソース
Dim strPgSource As String = "・…(プログラムソース)…"

'変換処理(変換結果はブログ等に貼り付けて、利用できます。)
Dim strConv As String = _
    conv.ConvertCodeToHtml(strPgSource, "[VB.NET]変換機能の使用例")
[VB.NET]変換機能の使用例

[改造ポイント]
 ・拡張性
  言語(C#、VB.NET)の固有ロジックを、
  CodeConverterToHtml の派生クラスに定義しています。
  (VBCodeConverterToHtml、CSharpCodeConverterToHtml)
  予約語一覧、キーワードの前景色、背景色、検索条件(正規表現)、変換仕様は、
  派生クラスの修正で変更できます。
  また、言語を追加する場合も、既存の派生クラスの流用が簡単です。
 ・予約語一覧
  予約語一覧は各派生クラスに定義しています。
  予約語の追加、変更、削除が簡単です。
 ・キーワードの検索条件
  正規表現を各派生クラスに定義しています。
  正規表現を修正することで、キーワードの検索条件を変更できます。
 ・キーワードの変換仕様
  正規表現の検索結果毎に、
  MatchEvaluator()メソッドが呼ばれます。
  MatchEvaluator()メソッドの修正で変換仕様を変更できます。
 ・マルチスレッド対応
  スレッドセーフではありません。
  派生クラスのGetRegEx() とGetReservedWords()に、
  複数スレッドが同時アクセスした場合、
  m_RegEx変数、m_ReservedWords変数の値に
  矛盾が生じる可能性があります。
  ASP.NET等のマルチスレッド環境で安全に使用する為には、
  SyncLockで排他をかける必要があります。

[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(ソースコード→HTML)
''' </summary>
''' <remarks></remarks>
Public MustInherit Class CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' HTMLレイアウト
    ''' </summary>
    ''' <remarks></remarks>
    Private Const TABLE_STRING As String =
        "<table width=""100%"" border=""0"" " &
        " bgcolor=""@@@TITLEBGCOLOR@@@"" " &
        " cellspacing=""0"">" &
        " <tr><td>" &
        "  <button type=""button"" value="""" " &
        "   onClick=""" &
        "   var ta=document.createElement('textarea');" &
        "   ta.value=this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText;" &
        "   this.appendChild(ta);ta.select();" &
        "   document.execCommand('Copy');" &
        "   alert('コピーしました。');" &
        "   this.removeChild(ta);"">" &
        "   コードのコピー</button>" &
        " </td></tr>" &
        " <tr><td>" &
        " <table width=""100%"" border=""0"" " &
        "  cellpadding=""10"" " &
        "  bgcolor=""@@@BGCOLOR@@@"" " &
        "  cellspacing=""0"">" &
        "  <tr><td>" &
        "   <font color=""@@@FORECOLOR@@@"" " &
        "    style=""font-size: 9pt"">" &
        "    <code>@@@CODE@@@</code>" &
        "   </font>" &
        "  </td></tr>" &
        " </table>" &
        " </td></tr>" &
        " <tr><td>" &
        " <b><font size=""2"">@@@TITLE@@@</font></b>" &
        " </td></tr>" &
        "</table>"
#End Region

#Region "列挙定義"
    ''' <summary>
    ''' 言語の種類
    ''' </summary>
    ''' <remarks></remarks>
    Public Enum ProgLangType
        ''' <summary>
        ''' VB.NET
        ''' </summary>
        ''' <remarks></remarks>
        VBNet = 0
        ''' <summary>
        ''' C#.NET
        ''' </summary>
        ''' <remarks></remarks>
        CSharp = 1
    End Enum

#End Region

#Region "変数定義"
    ''' <summary>
    ''' インスタンス
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared instanceList() As CodeConverterToHtml = _
        New CodeConverterToHtml() { _
            New VbCodeConverterToHtml(), _
            New CSharpCodeConverterToHtml() _
        }

#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

    End Sub

#End Region

#Region "インスタンスを取得"
    ''' <summary>
    ''' インスタンスを取得
    ''' </summary>
    ''' <param name="type">言語の種類</param>
    ''' <returns>インスタンス</returns>
    ''' <remarks></remarks>
    Public Shared Function GetInstance( _
        ByVal type As ProgLangType) As CodeConverterToHtml

        Return instanceList(type)
    End Function
#End Region

#Region "ソースコードをHTMLに変換する。"
    ''' <summary>
    ''' ソースコードをHTMLに変換する。
    ''' </summary>
    ''' <param name="src">ソースコード</param>
    ''' <returns>HTML</returns>
    ''' <remarks></remarks>
    Public Function ConvertCodeToHtml(ByVal src As String) As String
        Return Me.ConvertCodeToHtml(src, Me.GetDefaultTitle())
    End Function

    ''' <summary>
    ''' ソースコードをHTMLに変換する。
    ''' </summary>
    ''' <param name="src">ソースコード</param>
    ''' <param name="title">タイトル</param>
    ''' <returns>HTML</returns>
    ''' <remarks></remarks>
    Public Function ConvertCodeToHtml( _
        ByVal src As String, ByVal title As String) As String

        Dim wkSrcList() As String = Nothing

        'ソースコードを行単位に分割する。
        '(vbCrLf, vbLf, vbCr毎)
        wkSrcList = src.Split( _
            New String() {vbCrLf, vbLf, vbCr}, _
            StringSplitOptions.None)

        '先頭の空白文字数を取得
        Dim cntIndent As Integer = _
            Me.GetHeadSpaceCount(wkSrcList)

        '先頭の空白文字を削除
        Me.RemoveStringList(wkSrcList, cntIndent)

        'HTMLエンコード
        Me.HtmlEncode(wkSrcList)

        Dim regEx As Regex = Me.GetRegEx()
        Dim regMatchEvaluator As _
            New MatchEvaluator(AddressOf Me.MatchEvaluator)

        'キーワードにタグを付加
        For i As Integer = 0 To wkSrcList.Length - 1
            wkSrcList(i) = wkSrcList(i).Replace( _
                    " ", "&nbsp;")
            wkSrcList(i) = regEx.Replace( _
                    wkSrcList(i), regMatchEvaluator)
        Next

        Dim wkStr As String

        wkStr = String.Join(vbCrLf, wkSrcList)
        wkStr = wkStr.Replace(vbCrLf, "<br/>" & vbCrLf)

        Dim wkStrTable As String = Nothing

        wkStrTable = TABLE_STRING.Replace( _
            "@@@TITLE@@@", title)
        wkStrTable = wkStrTable.Replace( _
            "@@@BGCOLOR@@@", Me.GetBackColor())
        wkStrTable = wkStrTable.Replace( _
            "@@@FORECOLOR@@@", Me.GetForeColor())
        wkStrTable = wkStrTable.Replace( _
            "@@@TITLEBGCOLOR@@@", Me.GetTitleBackColor())
        wkStr = wkStrTable.Replace("@@@CODE@@@", wkStr)


        Return wkStr
    End Function

#Region "ヘルパーメソッド"
    ''' <summary>
    ''' HTMLにエンコードする
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <returns>ソース(HTMLエンコード済)</returns>
    ''' <remarks></remarks>
    Private Function HtmlEncode(ByVal srcLineList() As String) As String()

        For i As Integer = 0 To srcLineList.Length - 1
            srcLineList(i) = System.Web.HttpUtility.HtmlEncode(srcLineList(i))
        Next

        Return srcLineList

    End Function

    ''' <summary>
    ''' インデントの桁数を取得。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <returns>インデントの桁数</returns>
    ''' <remarks></remarks>
    Private Function GetHeadSpaceCount( _
        ByVal srcLineList() As String) As Integer

        Const CHR_BLANK As Char = " "c
        Return Me.GetHeadSpaceCount(srcLineList, CHR_BLANK)
    End Function

    ''' <summary>
    ''' インデントの桁数を取得。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <param name="indentChar">インデントの文字</param>
    ''' <returns>インデントの桁数</returns>
    ''' <remarks></remarks>
    Private Function GetHeadSpaceCount( _
        ByVal srcLineList() As String, _
        ByVal indentChar As Char) As Integer

        Dim cntIndent As Integer = Int32.MaxValue

        If srcLineList.Length = 0 Then
            Return 0
        End If

        For Each wkSrc As String In srcLineList

            For i As Integer = 0 To wkSrc.Length - 1

                If wkSrc.Trim() = "" Then
                    Exit For
                End If

                If i >= cntIndent Then
                    Exit For
                End If

                If wkSrc(i) = indentChar.ToString() Then

                Else
                    cntIndent = Math.Min(i, cntIndent)
                    Exit For
                End If
            Next
        Next

        If cntIndent = Int32.MaxValue Then
            Return 0
        End If

        Return cntIndent

    End Function

    ''' <summary>
    ''' 各行からインデントを除去する。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <param name="cnt">インデントの桁数</param>
    ''' <returns>処理結果</returns>
    ''' <remarks></remarks>
    Private Function RemoveStringList( _
        ByVal srcLineList() As String, _
        ByVal cnt As Integer) As Boolean

        If cnt = 0 Then
            Return True
        End If

        For i As Integer = 0 To srcLineList.Length - 1
            If srcLineList(i).Trim() = "" Then
                Continue For
            End If
            srcLineList(i) = srcLineList(i).Substring(cnt)
        Next

        Return True

    End Function
#End Region

#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected MustOverride Function GetRegEx() As Regex
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected MustOverride Function MatchEvaluator( _
        ByVal match As Match) As String
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetReservedWords() As String()
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetDefaultTitle() As String
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' 前景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetTitleBackColor() As String
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns>背景色</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetBackColor() As String
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetForeColor() As String
#End Region


End Class

[VB.NET]CodeConverterToHtml


[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(C#ソースコード→HTML)
''' </summary>
''' <remarks></remarks>
Public Class CSharpCodeConverterToHtml
    Inherits CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' 背景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR As String = "#FFFFE0"

    ''' <summary>
    ''' 背景色(タイトル)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR_TITLE As String = "#66CCCC"

    ''' <summary>
    ''' 前景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR As String = "#000000"

    ''' <summary>
    ''' 前景色(コメント)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_COMMENT As String = "#008040"

    ''' <summary>
    ''' 前景色(文字列)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_STRING As String = "#FF0000"

    ''' <summary>
    ''' 前景色(予約語)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_RESERVED_WORD As String = "#0000FF"
#End Region

#Region "変数定義"
    ''' <summary>
    ''' 正規表現
    ''' </summary>
    ''' <remarks></remarks>
    Private m_RegEx As Regex = Nothing

    ''' <summary>
    ''' 予約語一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private m_ReservedWords As New List(Of String)
#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub
#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected Overrides Function GetRegEx() As Regex
        If Not (Me.m_RegEx Is Nothing) Then
            Return Me.m_RegEx
        End If

        Dim strPatternAll As String = Nothing
        '正規表現パターン
        '※コメント判別
        '(先頭開始、0個以上の「&nbsp;」、1個以上の「//」、0個以上の任意文字)
        Dim strPattern1 As String = "^(&nbsp;)*(//)+.*"
        '※コメント判別
        '(先頭開始、0個以上の空白、1個以上の「//」、0個以上の任意文字)
        Dim strPattern2 As String = "^\s*(//)+.*"
        '※文字列判別
        '(「"」開始、0個以上の任意文字、最も手前の「"」終了)
        Dim strPattern3 As String = """.*?"""
        '※文字列判別
        '(「&quot;」開始、0個以上の任意文字、最も手前の「&quot;」終了)
        Dim strPattern4 As String = "&quot;.*?&quot;"
        '※予約語判別
        '(単語単位で予約語の何れかと同じ)
        Dim wkStr As String = String.Join("|", Me.GetReservedWords())
        Dim strPattern5 As String = "\b(" & wkStr & ")\b"

        strPatternAll = _
                    strPattern1 & "|" & strPattern2 & "|" & _
                    strPattern3 & "|" & strPattern4 & "|" & _
                    strPattern5

        Me.m_RegEx = New Regex(strPatternAll)

        Return Me.m_RegEx
    End Function
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected Overrides Function MatchEvaluator(ByVal match As Match) As String
        If match.Value.Replace("&nbsp;", "").StartsWith("//") OrElse _
            match.Value.Trim().StartsWith("//") Then
            'コメントの場合            
            Dim wk1 As Integer = match.Value.IndexOf("//")
            If wk1 = 0 Then
                Return String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
            End If
            Return match.Value.Substring(0, wk1) & _
                    String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
        End If

        If (match.Value.StartsWith("&quot;") AndAlso _
            match.Value.EndsWith("&quot;")) OrElse _
           (match.Value.StartsWith("""") AndAlso _
            match.Value.EndsWith("""")) Then
            '文字列の場合            
            Return String.Format( _
                "<font color='{0}'>{1}</font>", _
                FORE_COLOR_STRING, _
                match.Value)
        End If

        '予約語の場合
        Return String.Format( _
            "<font color='{0}'>{1}</font>", _
            FORE_COLOR_RESERVED_WORD, _
            match.Value)
    End Function
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetReservedWords() As String()
        If Me.m_ReservedWords.Count > 0 Then
            Return Me.m_ReservedWords.ToArray()
        End If

        With Me.m_ReservedWords

            .AddRange(New String() {"abstract", "as", "base", "bool", "break"})
            .AddRange(New String() {"byte", "case", "catch", "char", "checked"})
            .AddRange(New String() {"class", "const", "continue", "decimal", "decimal"})
            .AddRange(New String() {"default", "delegate", "do", "double", "else"})
            .AddRange(New String() {"enum", "event", "explicit", "extern", "false"})
            .AddRange(New String() {"finally", "fixed", "float", "for", "foreach"})
            .AddRange(New String() {"from", "get", "goto", "group", "if"})
            .AddRange(New String() {"implicit", "in", "int", "interface", "internal"})
            .AddRange(New String() {"into", "is", "join", "let", "lock"})
            .AddRange(New String() {"long", "namespace", "new", "null", "object"})
            .AddRange(New String() {"operator", "orderby", "out", "override", "params"})
            .AddRange(New String() {"partial", "private", "protected", "public", "readonly"})
            .AddRange(New String() {"ref", "return", "sbyte", "sealed", "select"})
            .AddRange(New String() {"set", "short", "sizeof", "stackalloc", "static"})
            .AddRange(New String() {"string", "struct", "switch", "this", "throw"})
            .AddRange(New String() {"true", "try", "typeof", "uint", "ulong"})
            .AddRange(New String() {"unchecked", "unsafe", "ushort", "using", "value"})
            .AddRange(New String() {"virtual", "void", "volatile", "where", "while"})
            .AddRange(New String() {"yield"})

        End With

        Return Me.m_ReservedWords.ToArray()

    End Function
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetDefaultTitle() As String
        Return "C#"
    End Function
#End Region

#Region "背景色(タイトル)を取得"
    ''' <summary>
    ''' 背景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetTitleBackColor() As String
        Return BACK_COLOR_TITLE
    End Function
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetBackColor() As String
        Return BACK_COLOR
    End Function
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetForeColor() As String
        Return FORE_COLOR
    End Function
#End Region

End Class
[VB.NET]CSharpCodeConverterToHtml.vb


[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(SQLServerコード→HTML)
''' </summary>
''' <remarks></remarks>
Public Class SqlServerCodeConverterToHtml
    Inherits CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' 背景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR As String = "#FFFFE0"

    ''' <summary>
    ''' 背景色(タイトル)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR_TITLE As String = "#66CCCC"

    ''' <summary>
    ''' 前景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR As String = "#000000"

    ''' <summary>
    ''' 前景色(コメント)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_COMMENT As String = "#008040"

    ''' <summary>
    ''' 前景色(文字列)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_STRING As String = "#FF0000"

    ''' <summary>
    ''' 前景色(予約語)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_RESERVED_WORD As String = "#0000FF"
#End Region

#Region "変数定義"
    ''' <summary>
    ''' 正規表現
    ''' </summary>
    ''' <remarks></remarks>
    Private m_RegEx As Regex = Nothing

    ''' <summary>
    ''' 予約語一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private m_ReservedWords As New List(Of String)
#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub
#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected Overrides Function GetRegEx() As Regex
        If Not (Me.m_RegEx Is Nothing) Then
            Return Me.m_RegEx
        End If

        Dim strPatternAll As String = Nothing
        '正規表現パターン
        '※コメント判別
        '(先頭開始、0個以上の「&nbsp;」、1個以上の「--」、0個以上の任意文字)
        Dim strPattern1 As String = "^(&nbsp;)*(--)+.*"
        '※コメント判別
        '(先頭開始、0個以上の空白、1個以上の「--」、0個以上の任意文字)
        Dim strPattern2 As String = "^\s*(--)+.*"
        '※文字列判別
        '(「'」開始、0個以上の任意文字、最も手前の「'」終了)
        Dim strPattern3 As String = "'.*?'"
        '※予約語判別
        '(単語単位で予約語の何れかと同じ)
        Dim wkStr As String = String.Join("|", Me.GetReservedWords())
        Dim strPattern4 As String = "\b(" & wkStr & ")\b"

        strPatternAll = _
                    strPattern1 & "|" & strPattern2 & "|" & _
                    strPattern3 & "|" & strPattern4 

        Me.m_RegEx = New Regex(strPatternAll, RegexOptions.IgnoreCase)

        Return Me.m_RegEx
    End Function
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected Overrides Function MatchEvaluator(ByVal match As Match) As String
        If match.Value.Replace("&nbsp;", "").StartsWith("--") OrElse _
            match.Value.Trim().StartsWith("--") Then
            'コメントの場合            
            Dim wk1 As Integer = match.Value.IndexOf("--")
            If wk1 = 0 Then
                Return String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
            End If
            Return match.Value.Substring(0, wk1) & _
                    String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
        End If

        If match.Value.StartsWith("'") AndAlso _
            match.Value.EndsWith("'") Then
            '文字列の場合            
            Return String.Format( _
                "<font color='{0}'>{1}</font>", _
                FORE_COLOR_STRING, _
                match.Value)
        End If

        '予約語の場合
        Return String.Format( _
            "<font color='{0}'>{1}</font>", _
            FORE_COLOR_RESERVED_WORD, _
            match.Value)
    End Function
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetReservedWords() As String()
        If Me.m_ReservedWords.Count > 0 Then
            Return Me.m_ReservedWords.ToArray()
        End If

        With Me.m_ReservedWords

            .AddRange(New String() {"ADD", "ALL", "ALTER", "AND", "ANY"})
            .AddRange(New String() {"AS", "ASC", "AUTHORIZATION", "BACKUP", "BEGIN"})
            .AddRange(New String() {"BETWEEN", "BREAK", "BROWSE", "BULK", "BY"})
            .AddRange(New String() {"CASCADE", "CASE", "CHECK", "CHECKPOINT", "CLOSE"})
            .AddRange(New String() {"CLUSTERED", "COALESCE", "COLLATE", "COLUMN", "COMMIT"})
            .AddRange(New String() {"COMPUTE", "CONSTRAINT", "CONTAINS", "CONTAINSTABLE", "CONTINUE"})
            .AddRange(New String() {"CONVERT", "CREATE", "CROSS", "CURRENT", "CURRENT_DATE"})
            .AddRange(New String() {"CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DATABASE"})
            .AddRange(New String() {"DBCC", "DEALLOCATE", "DECLARE", "DEFAULT", "DELETE"})
            .AddRange(New String() {"DENY", "DESC", "DISK", "DISTINCT", "DISTRIBUTED"})
            .AddRange(New String() {"DOUBLE", "DROP", "DUMP", "ELSE", "END"})
            .AddRange(New String() {"ERRLVL", "ESCAPE", "EXCEPT", "EXEC", "EXECUTE"})
            .AddRange(New String() {"EXISTS", "EXIT", "EXTERNAL", "FETCH", "FILE"})
            .AddRange(New String() {"FILLFACTOR", "FOR", "FOREIGN", "FREETEXT", "FREETEXTTABLE"})
            .AddRange(New String() {"FROM", "FULL", "FUNCTION", "GOTO", "GRANT"})
            .AddRange(New String() {"GROUP", "HAVING", "HOLDLOCK", "IDENTITY", "IDENTITY_INSERT"})
            .AddRange(New String() {"IDENTITYCOL", "IF", "IN", "INDEX", "INNER"})
            .AddRange(New String() {"INSERT", "INTERSECT", "INTO", "IS", "JOIN"})
            .AddRange(New String() {"KEY", "KILL", "LEFT", "LIKE", "LINENO"})
            .AddRange(New String() {"LOAD", "MERGE", "NATIONAL", "NOCHECK", "NONCLUSTERED"})
            .AddRange(New String() {"NOT", "NULL", "NULLIF", "OF", "OFF"})
            .AddRange(New String() {"OFFSETS", "ON", "OPEN", "OPENDATASOURCE", "OPENQUERY"})
            .AddRange(New String() {"OPENROWSET", "OPENXML", "OPTION", "OR", "ORDER"})
            .AddRange(New String() {"OUTER", "OVER", "PERCENT", "PIVOT", "PLAN"})
            .AddRange(New String() {"PRECISION", "PRIMARY", "PRINT", "PROC", "PROCEDURE"})
            .AddRange(New String() {"PUBLIC", "RAISERROR", "READ", "READTEXT", "RECONFIGURE"})
            .AddRange(New String() {"REFERENCES", "REPLICATION", "RESTORE", "RESTRICT", "RETURN"})
            .AddRange(New String() {"REVERT", "REVOKE", "RIGHT", "ROLLBACK", "ROWCOUNT"})
            .AddRange(New String() {"ROWGUIDCOL", "RULE", "SAVE", "SCHEMA", "SECURITYAUDIT"})
            .AddRange(New String() {"SELECT", "SEMANTICKEYPHRASETABLE", "SEMANTICSIMILARITYDETAILSTABLE"})
            .AddRange(New String() {"SEMANTICSIMILARITYTABLE", "SESSION_USER"})
            .AddRange(New String() {"SET", "SETUSER", "SHUTDOWN", "SOME"})
            .AddRange(New String() {"STATISTICS", "SYSTEM_USER", "TABLE"})
            .AddRange(New String() {"TABLESAMPLE", "TEXTSIZE", "THEN"})
            .AddRange(New String() {"TO", "TOP", "TRAN"})
            .AddRange(New String() {"TRANSACTION", "TRIGGER", "TRUNCATE"})
            .AddRange(New String() {"TRY_CONVERT", "TSEQUAL", "UNION"})
            .AddRange(New String() {"UNIQUE", "UNPIVOT", "UPDATE"})
            .AddRange(New String() {"UPDATETEXT", "USE", "USER"})
            .AddRange(New String() {"VALUES", "VARYING", "VIEW"})
            .AddRange(New String() {"WAITFOR", "WHEN", "WHERE"})
            .AddRange(New String() {"WHILE", "WITH", "WITHINGROUP", "WRITETEXT"})

        End With

        Return Me.m_ReservedWords.ToArray()

    End Function
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetDefaultTitle() As String
        Return "SQLServer"
    End Function
#End Region

#Region "背景色(タイトル)を取得"
    ''' <summary>
    ''' 背景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetTitleBackColor() As String
        Return BACK_COLOR_TITLE
    End Function
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetBackColor() As String
        Return BACK_COLOR
    End Function
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetForeColor() As String
        Return FORE_COLOR
    End Function
#End Region

End Class
[VB.NET]SqlServerCodeConverterToHtml

[雑記]ドローン(DJI Mini 3)

(1)雑記 もともと多趣味の友人 masakazu Drone 氏が、 最近、 ドローン にハマり始めて、 更に、新たな趣味が増えたとのこと。 ドローン を始めてから、 まだ1年も経っていないとのことですが、 旅行先で山や川の景色を 空撮 して、 Youtube ...