ExcelVBAを使い、電子カルテの情報をExcelシートに転記
久しぶりのVBAネタです。業務効率化を図る一環として、電子カルテの情報をExcelシートに効率よく貼り付けられないか模索中です。ただペーストするだけでなく、氏名は氏名のセルへ、年齢は年齢のセルへ、勝手に判断して貼り付けてくれたら理想です。できるかなって思ってやってみると、意外とあっさりできました。
できたコードが以下の通り。
Sub SelectPaste() 'Microsoft Forms 2.0 Object Libraryを参照設定 Dim myDobj As New DataObject Dim myVar As Variant Dim myRange As Range Dim iVar As Variant Dim jRange As Range Dim myStr As String 'ペーストする対象セル範囲を設定 Set myRange = Range("A1:H20") 'クリップボード内容を、改行で分けて配列に格納 With myDobj .GetFromClipboard myVar = Split(.GetText, vbLf) End With '文字列の配列をループ For Each iVar In myVar If InStr(iVar, ":") > 0 Then '検索対象のrangeをループ myStr = Left(iVar, InStr(iVar, ":")) For Each jRange In myRange If InStr(jRange.Value, myStr) > 0 Then jRange.Value = iVar End If Next End If Next End Sub
コピー元の情報は、こんな感じに項目、コロン、内容、と並んでいる
入院日:平成30年5月7日
名前:〇〇 ××
年齢:68歳
性別:男性
DataObjectを使うので、Microsoft Forms 2.0 Object Libraryの参照設定が必要。
Set myRange = Range("A1:H20")
ここで探す対象セル範囲を設定。
With myDobj .GetFromClipboard myVar = Split(.GetText, vbLf) End With
これでコピーしたテキストデータをいったんDataObjectに取り込み、改行で分割して、配列としてmyVarに取り込む。
For Each iVar In myVar If InStr(iVar, ":") > 0 Then
まずは、For EachでmyVarの配列各要素でループする。2行目がないと、空白行があった場合おかしな挙動になる。
myStr = Left(iVar, InStr(iVar, ":")) For Each jRange In myRange If InStr(jRange.Value, myStr) > 0 Then jRange.Value = iVar End If Next
ここが一番のキモ。myStrに”:”より左側の文字列、要するに項目名を取り込み、myRangeの各セルをループする。セルに、同じ項目名文字列を見つけたら、電子カルテから取り込んだ項目情報を書き込む。
以外に簡単にできた。いろいろ応用できそう。