空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

2019-01-01から1年間の記事一覧

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その4.3(非配列Variant型変数による配列受け渡し編)

初めに 処理 コード DLL AccessibleFromVBA.h AccessibleFromVBA.cpp AccessibleFromVBA.def VBA 実行結果 DllTestSetArrayV DllTestGetArrayV まとめ 過去掲載分 初めに 前回の予告通り、今回は非配列のVariant型変数に配列を格納して、DLLとの受け渡しをし…

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その4.2(配列編)

初めに SAFEARRAYに関する追加情報 配列要素のデータ型 引数 主な処理と使用する関数 HRESULTを返す関数の成否判定 SAFEARRAYに格納されている要素のデータ型分類値の取得 配列の次元数の取得 配列の1要素のサイズの取得 指定した次元のインデックスの指定…

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その3.2(String型による文字列の受け渡し)

初めに BSTR 構造 メモリ管理 ポインタを介してのデータの書き換え 内部のデータ文字列の状態 ヘッダ 関数 SysAllocStringByteLen SysAllocString SysAllocStringLen SysFreeString SysStringLen SysStringByteLen SysAllocStringとSysAllocStringByteLenの…

【VBA】非配列のVariant型変数に格納した配列のLBoundや要素数を変えてみた

SafeArrayRedim を使うと、 非配列のVariant型変数に格納した配列でも、LBoundとかElementsとかの変更ができる。だまって、 ReDim Preserve v(2 To 4) とかすればいいんだけど・・・ ソース Private Type SAFEARRAYBOUND cElements As Long lLbound As Long …

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その4.1(配列 準備編)

はじめに SAFEARRAY SAFEARRAY構造体 cDims fFeatures cbElements pvData rgsabound 次回予告 過去掲載分 はじめに 前回の文字列の受け渡しでは、VARIANTを使いました。(自分でもびっくり)今回の配列でも、int* とか short* とかを使うのかと思いきや SAFE…

【VBA】UTF-8 CSV の読み込みを、ADODB.Recordset と ADODB.Stream で比べてみた・・・第2回 ADODB.Streamを使ったコードの処理速度改善

前回のコードでは、完敗だったADODB.Stream ですが、汚名返上なるか? 見つけたサイトに掲載された方法による効果を検証してみます。 前回 z1000s.hatenablog.com 目次 前回の結果概要 処理時間 不明な点 ADODB.Stream を使った処理の分析と改善 参考サイト…

【VBA】UTF-8 CSV の読み込みを、ADODB.Recordset と ADODB.Stream で比べてみた・・・第1回 1行ずつ読み込みしてみる

初めに データ 処理概要 ADODB.Recordset ADODB.Stream コード 事前準備 共通部分 ADODB.Recordset Scema.ini ADODB.Stream(1行ずつ読み込み) 結果 要素分割が正しく行われていなかった・・・ まとめ それぞれの方法の比較 次回予告 初めに 以前、ADODB.R…

エクセルクイズ 回答コード

ネタ元はこちら暗号で会話ができれば、本当のチャレンジ成功か!?問題Excelを用いて、次の暗号を解読して、暗号で答えてください。BMT NX YMJ HZWWJSY RNSNXYJW TK IJKJSXJ#エクセルクイズ pic.twitter.com/qTYr7ZmVWG— わえなび the Theory of Word-Excel …

ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。・・・その3(文字列の受け渡し)

その1、その2と書いたものの 1年以上放置して、いまさらの第3段。今回は、文字列の受け渡しです。 初めに 文字列を受け渡しするためのデータ型 VARIANT型 vt bstrVal pbstrVal 関数 DLL側でのVARIANT内部形式の判断 VARIANTの文字列の変換 VARIANT→BSTR …

【VBA】9桁以上の16進数表記文字列同士のORを求める

昨日、Twitter で、 「16進数のORをとるのにもっと効率のいいやり方ある?」 というやつを見つけました。16進数のORをとるのにもっと効率のいいやり方ある?誰かおせーて!#VBA pic.twitter.com/qmQrwBiWti— ささきさん (@sasaki__san) 2019年9月16日スマホ…

【VBA】Excelで、ひとつ上の可視セルの値を取得して貼り付けする

Excelでフィルタの適用状態に関わらず、任意のセルの(見た目上の)ひとつ上のセルの値を取得しようというもの。元ネタはこちら koroko.hatenablog.com 別の方法で、こちらでも。 infoment.hatenablog.com両者とは別のアプローチで・・・目次 抑えておくべき…

【VBA】ExcelのUnionで纏められたRangeの Areas.Count と Areas.Item(N)

初めに Union メソッド 機能 構文 パラメータ 戻り値 使用例 Areas.Count と Areas.Item(N) 実際に返ってくる値 Areas.Item(N) Areas.Count 複数の Range がひとつの Areas.Item( N ) に纏められるケース(具体例) 隣接する2個以上の Range が矩形となる場…

【VBA】偶数判定、奇数判定

主に偶数判定のための私的メモ。 判定式結果 偶数の場合奇数の場合 偶数判定( N Eqv 0 ) And 101 ( N And 1 ) = 0TrueFalse 奇数判定N And 101 ( N And 1 ) = 1TrueFalse Eqv(XOr の逆パターン) 値1 値2 値1 Eqv 値2 False False True False True Fals…

【VBA】同じデータのセルを結合(Union未使用版)

下記のサイトで、同じデータのセルを結合するということで、Unionを使ってRangeをまとめて最後にMergeという処理を行っていました。kouten0430.hatenablog.comこれはこれで良いのですが、非連続データならともかく、連続データである場合には、 個人的には、…

【VBA】種目別に自動採番(別解)

コロ子さん(id:SNegishi)のところで、自動採番処理をやっているのを見て、ちょっと気がついた点をコメントしました。 すぐに修正版がアップされて「おぉ~、仕事はえぇなぁ」と感心していました。 koroko.hatenablog.com そんな中で、 「Worksheet_Selecti…

【VBA】特定の範囲内の任意の整数をインクリメント、デクリメントして次の値を求める

条件 求める式 補足 コード 実行例 テストコード 実行結果 条件 任意の3つの整数において、以下の条件を満たす事(負の値があっても可) 最小値 範囲の最大値をインクリメントした場合、範囲の最小値を返す事。 範囲の最小値をデクリメントした場合、範囲の…

【VBA】ADOを使ったテキストファイル(CSV)の読み込みについて調べてみた。ついでに、Line Input と速度を比べてみた。

タイトルに「比べてみた」と書いてあるけど、ADOでの処理や設定についてがメインだったりするので、結果だけ知りたい場合は、ずっと下の結果へ・・・ 環境 処理の流れ ADO Schema.ini ファイル (テキスト ファイル ドライバー) Schema.ini ファイルとは INI…

【VBA】任意のRangeの先頭1行を除いたRangeを簡単に取得する

Excelでデータを入力していると、1行目にヘッダ行があって、実際のデータは2行目からということはよくあると思います。 VBAで何らかの処理を行っている際に、ヘッダ行を含んだRangeは取得済みだけど、ヘッダ行を除いた部分をRangeとして取得したい場合、今…

【VBA】Excelで、製品の販売価格の更新情報を持つマスタから、いろいろな販売日の価格を取得する

難しく書いたけど、要するに ある製品の販売価格が、不定期に変わっていて、その履歴が残っている。 じゃあ、「任意のタイミングでの販売価格はいくらか?」を取得するというもの。元ネタはこちら https://twitter.com/ia02003812/status/112285709966959820…

【VBA】Excelはアクティブシートが変わると、処理時間が変わる場合があるようだ

いつもの如く、怪しげな事(?)をゴニョゴニョとやっていて、 「あれ、さっきより処理速くね?」となったので・・・ 経緯 結果 コード まとめ(のようなもの) 追記 行削除(2019/5/5) 経緯 ワークシートに50万件ほどのデータがあって、そいつにフィルタ…

【VBA】割り算を使わないで、数値の2進数表示を取得する(負値対応済み)

最初に断っておきますが、この記事は半分ネタです。 あえて、面倒くさいことしてます。 私がやりたかっただけです。基本に則って2進表示を求めたい方は、 ググる WorksheetFunction.Dec2Bin とか、して下さい。但し、10進数の2進数表示した文字列を取得す…

【VBA】For ループの罠(?)

次のコードを実行するとどうなると思いますか? Public Sub foo() Dim i As Long For i = &H7FFFFFFE To &H7FFFFFFF Debug.Print i Next i End Sub もうひとつ Public Sub bar() Dim i As Long i = &H7FFFFFFE Do Debug.Print i i = i + 1 Loop Until i > &H…

VBAのDictionary の Key について実験してみた

VBAのDictionaryのKeyには、数値、文字(数字を含む)、オブジェクト等が使えます。 そんな中で、ちょっと気になったことがあったので、実験してみました。 データ型が異なる同一値の数値を指定してみる 「データ型が異なる別々の値」をKeyとしてDictionary…

VBAの$付きの文字列関数

VBA

VBAの文字列関数には$付きの物がありますが、ネットで見るコードではほとんど見かけません。Microsoftのサイトで関数を検索しても、出てくるのは$なしばかり。何が違うのと言われれば、 VBA の文字列関数の中には 2 種類のバリエーションを持つものがありま…

VBAで、エンディアンの変換をやろうとしたら、やっぱりハマった

Windowsを使っていると、ソケット通信のコーディングでもしない限り、ほとんど意識する事がないであろうビッグエンディアンとリトルエンディアンに関する事です。まず、「エンディアンって何それ美味しいの?」って人は、こちらをどうぞ。 ja.wikipedia.org…

ExcelのAutoFilterの抽出条件には、配列が指定できる・・・でも、ちょっと注意しないといけない事もある

AutoFilterの抽出条件に配列が使用できるとの事で、試してみた際にハマったので・・・こんなデータを用意。 まずは、1件抽出するコード。こんな感じ? Public Sub doAutoFilter() Dim r As Range Set r = ThisWorkbook.Worksheets("Sheet1").Range("A1").Cu…

VBAでFindFirstFile、FindNextFileを使ってファイルリストを取得する

2022/10/20 追記 この記事のコードを FindFirstFileW を使って Unicode 対応した記事がありますので、そちらも ご覧ください。 z1000s.hatenablog.com ことりちゅんさん(id:Kotori-ChunChun)のところで、FileSystemObjectとDirを使って、ファイルパスの一…

Excelのワークシート名取得 ADOでOpenSchema と Workbooks.Open を比べてみた

ADOというとデータベースに使うというイメージが強いような感じがしますが、Excelに対しても使えます。Excelのワークブックを指定して、ワークシート名の一覧取得を、ADOの使用有無で行ってみます。 使用環境 Windows 10 Home Excel 2013 CPU:古い(恥ずか…

VBAで乱数を使って、意味不明(?)な文字列を生成する・・・コケヲチヰヱタトンシ

いろいろな処理をするコードを書いていると、テスト用の文字列データが欲しくなる時があります。 5個とか10個位なら適当にキーボードから入力して作ってもいいのですが、数百とか数万とか、それ以上となるととても手入力では無理なので、どこかから探して…

指定日が、月内で第何度目の何曜日かを求める(VBA)

最近、表題の処理を2件ほど、はてなブログで見かけた。 いずれの処理も、月始めから指定日までループ処理をしていたが、この手の処理は1週間(7日)の周期性があるので、それを利用してループ処理なしで求めてみた。thom.hateblo.jp b004nws862zx.hatenab…