投稿

バーコードフォントを使用してCODE-128のバーコードを作成する

バーコードリーダーを使って入力の手間を省きたいと思う。 Excelで印刷イメージを作成する場合、CODE39のバーコードフォントを使用したり、バーコードのオブジェクトを使用する方法が簡単である。 ただし、CODE39では取り扱える文字が限定されていたり、環境によりExcelのバーコードオブジェクトが使用できない、等の事情がある場合もある。 文字数が多いCODE128を、バーコードフォントを使用してい印刷する場合、いくらか工夫が必要になる。 ・チェック文字の問題: 計算の必要がある。バーコードリーダーの設定が可能であれば、チェック文字を省くことで対応も可能 ・フォントによる文字コードとパターンの対応の違い: 使用するフォントにより文字コードとパターンの対応が異なるため、使用するフォントに従って変換が必要。 チェック文字の計算や、文字コードの対応の違いなど、(コードセットB限定にすれば)Excelの関数(LET+α)で対応が出来たが、VBAでの計算・変換も試してみた。 使用するフォントは、0~94のコードが、32~126までの文字のパターン、95~105が、195~205の文字のパターン、終端が206の文字のパターンに割り振られていることを想定している。 Option Explicit ' CODE-128 バーコード ' ' GS-1 制限:先頭にFNC1、最大データ容量48文字 ' '入力 ASCII ' 0-127 ' ' EncodeCtrlAsc ' EncodeCtrlCode128 ' EncodeCode128 ' AddCheckSum ' FontCode ' ' 'encode ASCII, Code128 系の文字列>文字変換 ' FUNC = 195(#95 a127), 196-205,206(#96 - #105,ed) ' $ Code128系特殊コード ' $$ $ ' $96-$106 これが、196-206に変換される ' $[STARTA] $103 2...

Selenium Basic から Edge を使用したときの「Webエクスペリエンスのカスタマイズ」を非表示にする

Selenium にて、 EdgeWebDriver を使用して、Edge(chrome)を操作したとき、「Webエクスペリエンスのカスタマイズ」のウインドウが表示される現象が起きた。 【現象の整理】 ・通常に(Seleniumではなく手動で)Edgeを起動したときは、初回のみ表示される ・Selenium から起動したときは、毎回表示される ・表示されるページが、意図しないページになることがある。 【問題】 ・SendKeys などを使うときに問題となる。 ・Selenium にて、Get しても指定したページが開かないことがある。 【調査】 調べてみると以下の情報があった。 ・Selenium では、ユーザーのプロファイルは、起動毎に作成・廃棄される。 ・Selenium の起動時にユーザープロファイルを指定する方法がある。 通常起動時に、2回目以降表示されないため、ユーザープロファイルが関係していると推理。 Selenium からの起動時にユーザープロファイルを指定することで、ユーザープロファイルが保持されるようになり、「Webエクスペリエンスのカスタマイズ」が表示されなくなるか、検証することとした。 【検証】 ユーザープロファイルを指定して起動。 初回起動時に「Webエクス~」が表示されるため確認。 2回目以降は表示されないことを確認した。     Dim driver As New Selenium.EdgeDriver     Dim elmDoc As Selenium.WebElement          driver.AddArgument "--user-data-dir=任意のフォルダ"     driver.AddArgument "--profile-directory=任意のフォルダ2"          With driver         .Start                   .Get "http://任意のアドレス"   ...

クリップボードの制御:テキストデータをセットする

概要および目的 計算結果や検索結果を、他のアプリに貼り付けて利用する場合、VBAのプログラムから、クリップボードにデータ(テキスト)をセット(コピー)します。 データは、他のアプリで貼り付けることができます。   Option Compare Database Option Explicit #If VBA7 Then Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long #Else Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long #End If #If VBA7 Then Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr #Else Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long #End If #If VBA7 Then Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr #Else Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long #End If #If VBA7 Then Private Declare PtrSafe Function CloseClipboard Lib "User32" () As Long #Else Private Declare Function CloseC...

テキストの差分

  目的および概要 似たような2つのテキストの違いを調べたい場面が、たまにあります。 テキストを出力するプログラムの修正で意図した結果になっているか確認する場合や、プログラムの変更箇所を調べる場合などです。 いろいろな比較ツールがあり、これを使えば、違いをわかりやすく見る事ができます。 ここでは、敢えてVBAで比較する方法を検討します。 一致する箇所を探す 目的は2つのテキストの違う箇所の探す事ですが、その為には一致する箇所を探します。元のデータから一致箇所を取り除けば、残ったデータが不一致箇所となります。 2つのファイルは殆ど一緒の前提(その為、プログラムで不一致箇所を調べたいので)です。テキストの先頭から読み込み、行単位で比較して一致する箇所を取り除きます。 不一致の場合は、次に一致する行をなるべく近い位置で探します。いろいろな方法が考えられますが、スキップする行数の合計を1から順に増やしながら探し、最初に見つかった行同士を次の一致箇所とする方法が簡単です。 見つかった一致箇所までは不一致箇所として残します。一致箇所から処理を繰り返し一致する箇所を取り除きます。 これで、不一致箇所が残ります。 行単位の比較 行単位での比較は、strcompを使うのが簡単です。 不一致箇所を見つけたときに次の一致箇所を探すのですが、このとき、同じ行を何度も読み込む事になります。もし、strcomp が遅いと思われるなら、文字数を配列に保存しておき最初に評価する事で不要なstrcompを回避できます。 また、曖昧な評価をしたい場合は、予めテキストを変換するか、strcompとは別に比較のロジックを準備します。 前者の例では、スペース文字とタブ文字を同一にする場合は、予めタブ文字をスペース文字に置換します。また、スペース文字の数を無視する場合は、複数のスペース文字を1文字のスペース文字に予め置換します。 文字単位の比較 行の中のどの文字が違うかを知りたい場合は、行単位ではなく、文字単位で処理します。 文字単位の場合でも、基本的な考え方は一緒で、一致箇所を取り除いた残りを不一致とします。但し、行という纏った単位がないため、一致箇所を探す場合はデータの近さより、一致箇所の長さに注目した方が良い結果となると思います。 具体的には、まず、データ全体を、不明箇所として考えます。 不明箇...

VBAでハッシュの計算

 概要 advapi32.dllを呼び出すことで、ハッシュ値を取得できるとの情報を見かけたため、試してみました。 備忘録として、コードを貼り付けておきます。 Option Compare Database Option Explicit #If VBA7 Then Private Declare PtrSafe Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" _                             (ByRef phProv As LongPtr, ByVal pszContainer As String, ByVal pszProvider As String, _                              ByVal dwProvType As Long, ByVal dwFlags As Long) As Long Private Declare PtrSafe Function CryptReleaseContext Lib "advapi32.dll" _                             (ByVal hProv As LongPtr, ByVal dwFlags As Long) As Long Private Declare PtrSafe Function CryptCreateHash Lib "advapi32.dll" _                             (ByVal hProv As L...

PDFファイルのテキストを抽出する

ここでは、PDFファイルに含まれるテキスト情報をVBAから利用することを考えます。 PDFファイルを、ページの内容により分類し自動処理する場合、まずページ毎の内容を把握することが必要です。 多くのPDFファイルでは、テキスト情報を含んでいるため、これを読み取る方法を検討します。 PDFSharpを使った方法(失敗) 検索で見つけたページを参考に、PowerShellからPDFSharpを使ってテキストが抽出できるか試したところ、文字化けしたようなデータしか得られませんでした。 $root="C:\PDFTEST" [void][Reflection.Assembly]::LoadFile( $root + "\PdfSharp.dll"); $pdf = $root + '\TEST.pdf'; $rd = [PdfSharp.Pdf.IO.PdfReader]::Open($pdf, [PdfSharp.Pdf.IO.PdfDocumentOpenMode]::Import); $pgnum = $rd.PageCount; $txtname = [String]$root + "\out.txt" $fs = new-object System.IO.FileStream($txtname, [System.IO.FileMode]::Create) $sw = new-object System.IO.StreamWriter $fs function ReadContent( $cobj) {     $rettext = ""     $objcount =$cobj.Count     for($j=0; $j -lt $objcount; $j++){         $TypeName =$cobj[$j].GetType()         $obj = $cobj[$j]         if ($TypeName.Name -eq "COperator...

PDF印刷の印刷順序を検討する(4)

"PDFに出力・印刷される各種リストのページを使いやすく並べ替える”ことを引き続き検討しています。 PDFからページの抽出 1つのPDFから所定のページを抜き出し、1つのPDFに連結します。 これにより、ページの順序を変えたPDF2を作成します。 Public Function MergePdfPg3 _ (ByVal pi_sTMPPdfFile As String, _ ByVal pi_nADDPdfFileCnt As Long, _ ByRef pi_sADDPdfFile() As String, ByRef pi_nPgFrom() As Long, ByRef pi_nPgTo() As Long) As Long 'PDFSharpを使ってPDFファイルを連結(ページ指定あり) Dim com As String Dim i As Long Dim j As Long com = PSPath & "powershell -Command " com = com & "[System.Reflection.Assembly]::LoadFrom('" & CurrentBookPath & "PDFSharp.dll');" com = com & "$pdf = '" & pi_sTMPPdfFile & "';" com = com & "$doc = New-Object PdfSharp.Pdf.PdfDocument;" com = com & "function AddPDFFile( $fnm, $pgf, $pgt )" com = com & "{" com = com & "$rd = [PdfSharp.Pdf.IO.PdfReader]::Open($fnm, [PdfSha...