カウントアップマクロ
個人的に今欲しいマクロを作成してみた。
'変数宣言 Dim szGetText As String Dim szSetText As String Dim iCnt As String '************************************* 'コピーした文字列の末尾を取得して 'カウントアップする '************************************* Sub GetText() On Error GoTo GetTextError Selection.Copy With New DataObject .GetFromClipboard '変数のデータをDataObjectに格納する szGetText = .GetText 'クリップボードから取得 iCnt = Val(Right(szGetText, 3)) iCnt = iCnt + 1 '改行コード(vbLf)を考慮 szSetText = Left(szGetText, Len(szGetText) - 3) End With Exit Sub GetTextError: MsgBox ("エラー") End Sub '************************************* 'GetText()でカウントアップした '文字列を貼り付ける '************************************* Sub SetText() With New DataObject .SetText szSetText & Format(iCnt, "0") '数値から文字へ 'DataObjectのデータをクリップボードに格納する .PutInClipboard End With ActiveSheet.Paste End Sub
例えば次のデータがあるとする
そのデータをコピーして
別のセルに貼り付ければ、末尾の数字がカウントアップする
やっぱエビデンスの番号紐づけぐらいしか用途ないな……。
■参考サイト
クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
Office TANAKA - Excel VBA Tips[クリップボードを操作する(1)]
Microsoft Forms 2.0 Object Libraryへの参照設定を行うには? :VBE(Visual Basic Editor)
Javaでちょっと気になったこと
新人3ヵ月目の時、よく理解していなかったが故にやってしまったこと。
例えばユーザ情報をListに入れるときに
package test.java; import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<UserBean> list = new ArrayList<UserBean>(); UserBean uBean = new UserBean(); /* 1人目 */ uBean.setNo("1"); uBean.setName("YoneSan"); uBean.setMsg("MSG1"); /* リストに追加 */ list.add(uBean); /* 2人目 */ uBean.setNo("2"); uBean.setName("OzekiStyle"); uBean.setMsg("MSG2"); /* リストに追加 */ list.add(uBean); /* 3人目 */ uBean.setNo("3"); uBean.setName("NagasawaKun"); uBean.setMsg("MSG3"); /* リストに追加 */ list.add(uBean); for(UserBean ub : list){ System.out.println(ub.getNo()); System.out.println(ub.getName()); System.out.println(ub.getMsg()); } } }
想定していた出力は
1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3
こんな感じだけど、実際に実行すると。
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
一番最後に設定した値が出力される。
そりゃあインスタンスが1つ(newが1回)しか生成
されていないのにそのインスタンスに対して値を変更したら
すでにリストに格納されているものも変わるよなって話。
試しにハッシュコードを調べてみる。
package test.java; import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<UserBean> list = new ArrayList<UserBean>(); UserBean uBean = new UserBean(); System.out.println(uBean); /* 1人目 */ uBean.setNo("1"); uBean.setName("YoneSan"); uBean.setMsg("MSG1"); /* リストに追加 */ list.add(uBean); System.out.println(uBean); /* 2人目 */ uBean.setNo("2"); uBean.setName("OzekiStyle"); uBean.setMsg("MSG2"); /* リストに追加 */ list.add(uBean); System.out.println(uBean); /* 3人目 */ uBean.setNo("3"); uBean.setName("NagasawaKun"); uBean.setMsg("MSG3"); /* リストに追加 */ list.add(uBean); for(UserBean ub : list){ System.out.println(ub.getNo()); System.out.println(ub.getName()); System.out.println(ub.getMsg()); } } }
出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
@以降がハッシュコードを指してる。
ハッシュコードはオブジェクトの内部アドレスを整数値にしたもの
みたいなので、すべて同じところを指していることが分かる。
参考↓
Object (Java Platform SE 7)
なので値を設定する前にインスタンスを生成すればOK。
package test.java; import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<UserBean> list = new ArrayList<UserBean>(); UserBean uBean = new UserBean(); System.out.println(uBean); /* 1人目 */ uBean.setNo("1"); uBean.setName("YoneSan"); uBean.setMsg("MSG1"); /* リストに追加 */ list.add(uBean); uBean = new UserBean(); System.out.println(uBean); /* 2人目 */ uBean.setNo("2"); uBean.setName("OzekiStyle"); uBean.setMsg("MSG2"); /* リストに追加 */ list.add(uBean); uBean = new UserBean(); System.out.println(uBean); /* 3人目 */ uBean.setNo("3"); uBean.setName("NagasawaKun"); uBean.setMsg("MSG3"); /* リストに追加 */ list.add(uBean); for(UserBean ub : list){ System.out.println(ub.getNo()); System.out.println(ub.getName()); System.out.println(ub.getMsg()); } } }
出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@2a139a55
test.java.UserBean@15db9742
1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3
ハッシュコードも別々で想定した出力になっている。
これでインスタンスの理解が少し深まったかも。
シート集約マクロを作成してみた
同じフォルダ内にある複数のExcelブックの1シート目を
1つのブックに集約するマクロを作成してみた。
Sub CommandButton1_Click() Const AGG_FILE_NAME As String = "集約ファイル.xlsx" Const EXTENSION As String = "xls*" Dim szFileName As String Dim copySheet As Workbook Dim szAggFileName As String Application.ScreenUpdating = False Application.DisplayAlerts = False '集約ファイル名を取得 szAggFileName = Range("A2").Value If szAggFileName = "" Then 'ファイル名が記入されていない場合デフォルトの値を入れる szAggFileName = AGG_FILE_NAME End If 'ファイル存在チェック szFileName = Dir(ThisWorkbook.Path & "\" & szAggFileName) '存在した場合は削除する If szFileName <> "" Then Kill (ThisWorkbook.Path & "\" & szAggFileName) End If Set aggFile = Workbooks.Add '拡張子「.xls」「.xlsx」「.xlsm」を対象 szFileName = Dir(ThisWorkbook.Path & "\*." & EXTENSION) 'ファイルが存在しない場合は終了 If szFileName = "" Then Exit Sub End If '各ブックの1枚目のシートを集約用ブックにコピーする Do 'マクロ自身は無視する If ThisWorkbook.Name <> szFileName Then Set copySheet = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & szFileName) copySheet.Worksheets(1).Copy After:=aggFile.Worksheets(aggFile.Worksheets.Count) ActiveSheet.Name = szFileName copySheet.Close End If szFileName = Dir() Loop While szFileName <> "" '空のシートを削除する処理 Dim i As Integer i = 0 Dim iSheetCount As Integer iSheetCount = 1 Do While iSheetCount <= aggFile.Worksheets.Count - i If IsEmpty(aggFile.Worksheets(iSheetCount).UsedRange) = True Then aggFile.Worksheets(iSheetCount).Delete i = i + 1 Else iSheetCount = iSheetCount + 1 End If Loop Application.DisplayAlerts = True aggFile.SaveAs Filename:=ThisWorkbook.Path & "\" & szAggFileName aggFile.Close End Sub
集約したシートを保存するブックの名前を入力して、
ボタンを押す
このフォルダ内の.xls .xlsx .xlsm の1シート目を
コピーして1つのブックに集約する
hoge.xlsxが作成される
hoge.xlsxを開くと各ファイルからシートがコピーされている。
JavaDayTokyo2016に参加してきた
かなり遅くなったが、
セッションについてまとめてみようと思う。
【基調講演】
Innovate, Collaborate, with Java
今後のJavaについて説明。
スライドに書かれていた『あなたはJavaを愛していますか?』に
少し笑ってしまった。
あとはJava9の目玉として「Project Jigsaw」という
モジュール化について説明していた。
「Project Jigsaw」によってクラスパスの問題などが
解決されるみたい。
[速報]JavaOne開幕。Java 9は「Project Jigsaw」でクラスパスの問題とJDK肥大化の問題を解決する。JaveOne 2015 - Publickey
【JavaEE】
Introduction to MVC 1.0 (JSR 371)
JavaEE8から追加されるアクションベースのMVCについての説明。
JavaEE7まではコンポーネントベースのMVCしかなかったため、
開発方法の選択肢を増やすために追加した。
コンポーネントベースとは
JSF Wicket Tapestryとかが有名
コントローラーが大体の処理をする
MVが開発の範囲
アクションベースとは
Struts SpringMVCが有名。
MVCが開発の範囲
リクエストが単位
開発者の負担が大きい
リファレンス実装としてOzarkがある。
→実装が可能だということを証明している
JavaEEの中にあるものでMVCを作りたかった
モデル
→CDI BeanValidation JPA
ビュー
→Faceless JSP 他
コントローラー
→JAX-RSを
【JavaSE】
JavaFX 8 and the future
SwingやAWTではなく、JavaFX使おう。
モバイルも対応している。
GUIのツールキット
デスクトップ、モバイル、組み込みもできる。
JavaFX8でいいところ
Swingと相互利用ができるところ
JavaFX8の新しい部分
DatePicker
→カレンダーの定義 CSSもサポートしてる
TreeTableView
ModenaUITheme
→全体的に丸み、フラットな感じになっている
シンプルデザイン
アクセシビリティ
→音声案内
ダイアログが追加
→アラートも出せる
OSに合わせたボタン
JavaFX9(JDK9)
jigsawModularity
→実行に必要最低限な依存関係のみのモジュールを
選択するようにする
モジュールを必要最低限にすることでランタイムの
実行が短くなる
【JavaEE】
What HTTP/2 means to Java Developers?
HTTP/2になった時、Javaではどうするべきかの説明。
HTTP/1.1での問題点
陳腐化したプロトコル
Webページの使われ方が違うのに
プロトコルが変わっていない
Webページのサイズが増えてきている
1.1は遅延性の問題がある
→速やかにページをレンダリングする必要がある
Head-of-Line booking
リクエストの順番にレスポンスを
返す仕様なので途中で遅延すると
後続も遅延する
HTTP/2は遅延性を抑える
RFC7540 7541
モダンなブラウザはすべてHTTP/2
バイナリベースのプロトコルであること
→1.1はテキストベース
1つのストリームで2つのデータを送る
バイナリフレームになるが開発者は意識することはない
ServerPush
→クライアントから要求がなくてもリソースを送る
WebSocketみたいな感じ?
HPack
→httpヘッダの変更した箇所だけを送信するようにする
HTTP/2 Java
Jetty
JavaSE9で取り込む予定
JEP110
JEPのゴールは古いものを新しくする
http://www.oracle.co.jp/jdt2016/pdf/4-B.pdf
特に気になったのは「Project Jigsaw」と「HTTP/2」かな...。
ちゃんと理解ができていないのでもっと調べる必要があるな。
JavaDayTokyo2016に向けて予習
1.MVC1.0(JSR371)
JavaEE8.0の新機能。
JSFというJavaEE標準でWebアプリケーションフレームワークが
存在するが、コンポーネントベースのフレームワークである。
コンポーネントベース
→表示する画面とそれに対応する画面処理クラスがあるイメージ。
(1つの画面に対して、その画面専用の処理クラスがある)
リクエスト時はViewに直接アクセスする。
Viewに直接アクセスするため、開発とデザインを分業できる。
(JSPのように処理クラスを介さなくても、画面イメージを表示できる)
アクションベース
→全てのリクエストがアクションクラスを経由し、アクションクラス内で
表示するViewを決定する。
JavaEE標準でアクションベースのフレームワークが求められている。
SpringMVCのような機能がJava標準の機能になるみたいな感じ。
【参考サイト】
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
【JavaEE】今からでも間にあうJSF入門
JSR 371(MVC 1.0) Early Draft version 1.0 の日本語訳(前編) - Java EE 事始め!
2.Oracle Cloud Platform
Oracle Cloud Platformはオラクルが提供するPaaS。
クラウドサービスの種類について
IaaS
→ネットワーク・ハードウェア・OSとOSレイヤから
下を提供する
PaaS
→ネットワーク・ハードウェア・OS・ミドルウェアと
ミドルウェア層までを提供する
SaaS
→ネットワーク・ハードウェア・OS・ミドルウェア・アプリケーション
までを完全にサービス化しているもの
Oracle Cloud Platformは
「Oracle Database Cloud Service」と「Oracle Java Cloud Service」の
サービスがあり前者がDB関係、後者がJavaEEアプリの開発/実行基盤関係
また、「Oracle Java Cloud Service」以外にもJavaSEやNode.jsに対応した
ものもある。
【参考サイト】
開発/検証環境にクラウドを活用する3つのポイントとは?:Oracle Cloud Platformを使うべき理由──他と何がどう違うのか (3/3) - @IT
IaaS PaaS SaaSの違い|クラウドエース(Cloud Ace)
3.JavaFX
リッチインターネットアプリケーションのGUIライブラリ。
AWTやSwingとは異なるもの。
JavaFX1ではJavaFXScriptという言語で開発する仕組みだったが、
JavaFX2からJavaAPIに置き換わった。
4.HTTP/2
GoogleがSPDYというプロトコルを作成していて、
その進化版がHTTP/2。
HTTP/1.1ではHTTPパイプラインという前回のリクエストを
待たずに次のリクエストを送信できる仕組みがあった。
しかし、サーバーはリクエストの順番にレスポンスを返すという
制限があるため、最初のほうのリクエスト処理が遅くなると
後続のリクエスト処理が遅くなるということがある。
HTTP/2では1つの接続にストリームの多重化を行うことで
HTTPパイプラインの問題を解消している。
JavaSE9でHTTP/2のサポートが実現される。
【参考サイト】
HTTP/2の特徴 HTTP/1.1との違いについて | REDBOX Labo
初夏のJavaScript祭りで発表されたスライドを集めてみた
5月14日(土)に開催されていたが所用で
参加できなかった。
初夏のJavaScript祭2016 inテコラス – JavaScript祭
なので、発表で使われた(であろう)スライドを
探して集めてきた。
14:55 – 15:10
フロントエンドのNPM活用法
hello npm // Speaker Deck
16:25 – 16:40
ES2015の今とこれから
ES2015の今とこれから
16:45 – 17:00
JAVASCRIPTでデバイス連携してみて出会える技術!広がる知識!
2016初夏のJavaScript祭り20160514
LT
Ramdaで手軽に関数型プログラムを始めよう
Ramdaで手軽に関数型言語を始めよう // Speaker Deck
今回はJavaScript祭りに参加できなかったけど、
21日にはJJUG CCC 2016 Spring、24日にはJavaDayTokyoに参加予定なので楽しみ。
Java8のOptionalを試してみた1
Java8のOptionalでは値が無い場合は
nullではなく、emptyというオブジェクトが返ってくるらしい。
以下、ソースコード
JavaTrial/OptionalTest.java at master · sndstudy/JavaTrial · GitHub
package test.java; import java.util.Optional; /** * Optionalのテスト * */ public class OptionalTest { public static void main(String[] args) { /********************************/ /* */ /*nullの判定(Optional未使用) */ /* */ /********************************/ String hoge = "hoge"; if(null != hoge){ System.out.println(hoge); } /********************************/ /* */ /*nullの判定(Optional使用) */ /* */ /********************************/ //値をラッパーする Optional<String> hogeOpt = Optional.ofNullable(hoge); //isPresent()は値がある場合はtrue //nullの場合はfalseを返す if(hogeOpt.isPresent()){ //get()で値を取得する System.out.println(hogeOpt.orElse(hogeOpt.get())); } /********************************/ /* */ /*nullの判定(ラムダ式使用) */ /* */ /********************************/ //ifPresent()はnull以外の場合に処理を実行する hogeOpt.ifPresent(str -> System.out.println(str)); } }
今までの値のnull判定はこうだった。
/********************************/ /* */ /*nullの判定(Optional未使用) */ /* */ /********************************/ String hoge = "hoge"; if(null != hoge){ System.out.println(hoge); }
Optionalではこうなる
/********************************/ /* */ /*nullの判定(Optional使用) */ /* */ /********************************/ //値をラッパーする Optional<String> hogeOpt = Optional.ofNullable(hoge); //isPresent()は値がある場合はtrue //nullの場合はfalseを返す if(hogeOpt.isPresent()){ //get()で値を取得する System.out.println(hogeOpt.orElse(hogeOpt.get())); }
ソースコード量はあまり変わらないが、Optionalを使用することで
"この値は空の可能性がある"ということを明示的にすることができるみたい。
ラムダ式で書くとこうスッキリする。
/********************************/ /* */ /*nullの判定(ラムダ式使用) */ /* */ /********************************/ //ifPresent()はnull以外の場合に処理を実行する hogeOpt.ifPresent(str -> System.out.println(str));
Java8で追加されたOptionalを使いこなせば、
NullPointerExceptionが起きにくいコードが書けるようになるかも。