トップページtech
1002コメント361KB

Excel VBA 質問スレ Part41©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2016/04/27(水) 04:11:46.79ID:Nk+oP5xR
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part40
http://echo.2ch.net/test/read.cgi/tech/1455817784/

※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 122
http://echo.2ch.net/test/read.cgi/bsoft/1461287268/
0385デフォルトの名無しさん2016/05/31(火) 07:03:20.88ID:lb4BA3Cb
なるほど>>357>>358は派遣ということか
0386デフォルトの名無しさん2016/05/31(火) 11:12:06.88ID:P7zsebxN
お願いします!
double型の配列に数値以外の文字を格納することは出来ませんか?空白と区別出来るものであれば何でも構いません。(-または/がベストな希望)
型をvariantに変えるという手もありますが、計算ミスがあるようなイメージがあるので、やっておりません。何かアドバイスお願いします。
0387デフォルトの名無しさん2016/05/31(火) 11:47:30.66ID:9/vIAIrD
>>386
計算ミスというのは無いと思うが、やはりVariantで型チェックすれば?
または自分でOptional型クラスを作るか。
0388デフォルトの名無しさん2016/05/31(火) 12:07:24.59ID:iuDv2fhM
>>386
そのまま答えるとvariantで格納して呼び出しの時にチェックするしか無いだろう

しかしそれ以前に根本的な設計が間違ってる
やりたいこと書いた方がいいかもしれない
0389デフォルトの名無しさん2016/05/31(火) 14:51:30.75ID:MV3Si3mC
>>387
>>388
ダブルだとやはり出来ないんですね。
稀にマイナス小数点同士の乗算除算や0出現時のエラーがあるのでそれを区別したいと考えてました。
variantでやってみます!
0390デフォルトの名無しさん2016/05/31(火) 21:08:56.37ID:mGubUgmp
>>386みたいな問題って、キングオブ糞なやり方が実際にはうまくいくんだよな
0391デフォルトの名無しさん2016/05/31(火) 21:30:53.23ID:C0QCg+Ll
まー、本当はセルに数値として設定されてるなら普通にDouble型で行けると思うけどね。
まさかセルからTextで値取得しているってオチは無いよね。

ちょっと気になったのがVariant型に入れて数値チェックするのと、
String型に入れて数値チェックしてDouble型に変換して使うのとどっちが早いのか。
まぁ気にするほど差が出ないのは分かっているけど、単純な疑問。

後、Variantに入れると変な暗黙の型に突っ込まれて本来のDouble型と挙動が変わることがないのか心配。
0392デフォルトの名無しさん2016/05/31(火) 21:51:56.92ID:LgcgyNaP
どうせアルゴリズムが遅いのだから実行速度とか気にせん方がええでお前らは
0393デフォルトの名無しさん2016/05/31(火) 22:01:55.92ID:iuDv2fhM
アルゴリズムが遅い・・・?
ふーん、アルゴリズムが遅いんだ〜
0394デフォルトの名無しさん2016/05/31(火) 22:04:20.02ID:mGubUgmp
>>391
単にVariant型に入れた値を数値チェック後に取り出すだけだったら、Stringから変換するよりずっとずっと速いはず。
前者と違って後者は本当の変換だからな。
0395デフォルトの名無しさん2016/05/31(火) 22:09:57.16ID:LgcgyNaP
>>393
せやで、プロとお前らの違いはアルゴリズムなんやで
変数がvariantとかどうでもええねん
0396デフォルトの名無しさん2016/05/31(火) 22:10:12.22ID:C0QCg+Ll
>>394
ただ、Variant型を使うよりString型を使う方が早いんだよね。
型変換でどのくらい相殺されるか
0397デフォルトの名無しさん2016/05/31(火) 22:13:58.47ID:hxNGQcCX
>>389
エスパると丸め誤差のことか?
0398デフォルトの名無しさん2016/05/31(火) 22:15:14.99ID:mGubUgmp
>>396
どういう使い方?
v = 3.1415
より
s = "3.1415"
として使う方が速いって意味?
0399デフォルトの名無しさん2016/05/31(火) 22:40:22.39ID:P0axz30G
>>344
俺もこれ知りたい
VBAからセル選択してもフォーカスはコントロールに行ったままだよな
0400デフォルトの名無しさん2016/05/31(火) 23:58:45.09ID:b/p0i84S
>>399
Excel 2013持っていないから試せないけど
APIでフォアグラウンドウィンドウを変えてみるとかは?

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Sub CommandButton1_Click()
 SetForegroundWindow Application.hWnd
End Sub
0401デフォルトの名無しさん2016/05/31(火) 23:59:23.43ID:C0QCg+Ll
>>398
そう。

http://officetanaka.net/excel/vba/speed/s6.htm
0402デフォルトの名無しさん2016/06/01(水) 00:08:55.15ID:v2Wj2/bB
>>401
いやそのリンク先は
s = "3.1415"
としたあとsを文字列のまま扱うときの話でしょ

>>391で「String型に入れて数値チェックしてDouble型に変換して使う」ってのが元の話
だからsをDoubleに戻すコストがいる。
0403デフォルトの名無しさん2016/06/01(水) 00:11:50.06ID:9sIb/BNE
>>399
いったんfalseにしてからtrueにするのは試した?
0404デフォルトの名無しさん2016/06/01(水) 00:28:41.02ID:f68tak/j
>>402
だからその型変換に掛かる時間と相殺してどちらが早いかという話。

数値チェックはどちらにしたって必要でしょ。
0405デフォルトの名無しさん2016/06/01(水) 00:46:14.53ID:v2Wj2/bB
>>404
なるほど
じゃ、明示的な数値チェックを略すと

Dim s As String
Dim v As Variant
Dim d As Double

s = 3.1415   ' ← 型変換(1)
d = s      ' ← 型変換(2)

v = 2.7183  ' ← 型変換(3)
d = v     ' ← 型変換(4)

としたときのコストは (1) + (2) >> (3) + (4) だ
、っていうのが>>394の主張。
0406デフォルトの名無しさん2016/06/01(水) 02:19:56.12ID:f68tak/j
>>405
そうやって並べてみると、
セルから取って来てVariant型に入れた
値は内部型でDouble型とは限らないから
結局は型変換が必要になるな。

後、Objectならともかく、こっちは
Doble型に変換するなら暗黙の変換使わずに
明示的な変換を行う想定でいたわ。

d = CDbl(s)     ' ← 型変換(2)

d = CDbl(v)     ' ← 型変換(4)
0407デフォルトの名無しさん2016/06/01(水) 07:17:59.36ID:v2Wj2/bB
>>406
うん、まあセルに入っている値が大多数は数値で、たまに変なエラーみたいなものが入っている前提とすると、

d = CDbl(s)     ' ← この型変換は常に重い

d = CDbl(v)     ' ← この型変換はたまに重い

となるね。(sはString型なので常に関数呼び出し)
0408デフォルトの名無しさん2016/06/01(水) 07:58:53.15ID:J5oSfmPv
>>407
よく分からないんだけど、例えばセルから取得した値をVariantが内部型をLong型とかに判断した場合って型変換は起こるんじゃないの?
0409デフォルトの名無しさん2016/06/01(水) 08:50:59.51ID:weg166lE
実測してみれば良いんじゃないかな
0410デフォルトの名無しさん2016/06/01(水) 09:02:22.06ID:akJUj8WN
質問です。
特定のフォルダに、ファイル(エクセルBook)が登録(保存、ペースト)された時に
VBAで記述した処理を起動したいのですが、どうすれば良いのでしょうか?
0411デフォルトの名無しさん2016/06/01(水) 12:22:55.53ID:K88eWt2g
>>410
API使ってタイマーで前回の状態と比較するしか無いんじゃなかろうか。

VB.Netなら確かfilesystemwatcherが使えた気がするけど、それでも難しいよ。

何せExcelファイルはファイルサーバとかに置いて共有切ったりすると、暫く違うファイルに前回状況を抱えて出力したりしてるからね。

簡単なことならいいけど、色々やろうとすると途端に難しくなる。
0412デフォルトの名無しさん2016/06/01(水) 17:11:37.67ID:E/1ScAaT
型変換するコストより、数値チェックするコストの方が圧倒的高い気がするんだが
チェックしないで例外拾うのも、例外処理のコストが高い気がするし

実測したわけじゃないから気がするだけかもしれんが
0413デフォルトの名無しさん2016/06/01(水) 18:33:41.83ID:9sIb/BNE
そんなチマチマしたこと考えるより、速いPCと速いSSDをドドーンと用意すればいいだけじゃないの?
そもそもそんなに速度が重要ならVBAは向いていないって話だしな。
0414デフォルトの名無しさん2016/06/01(水) 19:29:44.69ID:weg166lE
>>410
VBAだけでは難しいかも
0415デフォルトの名無しさん2016/06/01(水) 19:49:31.29ID:sRCfCf1w
VBAは純粋に処理速度遅いからなぁ。

出来合いの物同士を結んで駆動させるにはすごく便利なんだけど、
単体で何か作ろうってのは無理だな。
0416デフォルトの名無しさん2016/06/01(水) 20:29:22.31ID:NX6RE2hb
その用途でもVBA使いづらくない?
0417デフォルトの名無しさん2016/06/01(水) 21:07:08.13ID:v2Wj2/bB
>>410
ボタンを押してからフォルダの監視を始めて、ファイルが登録されるまでほっといていいんなら
単に無限ループにすればいいと思うけど?
0418デフォルトの名無しさん2016/06/01(水) 21:07:46.48ID:IfpgImxc
まーでもさ、SQL一発で処理出来て俄然速くなりそうなところを
VBAで三重ループとかして何とかしているコードとか見かけると
もう脱力感を通り越して微笑ましいよな
0419デフォルトの名無しさん2016/06/02(木) 03:58:28.00ID:0gMFQogn
質問したいんだけどかなり長くなるし
規模がそれなりになりそうでレス消費激しくなりそうなんだけど
別にスレ立てたほうがいい?
0420デフォルトの名無しさん2016/06/02(木) 06:34:02.28ID:uPQC6lrS
スレ立てて5レスくらいで終わったらどうするんだ
0421デフォルトの名無しさん2016/06/02(木) 06:38:04.75ID:jAQjQwIo
そんな時は知恵袋
0422デフォルトの名無しさん2016/06/02(木) 08:21:37.06ID:x3+LLHfF
>>419
とりあえず質問内容書いちゃいなよ
ダメだったら回答がないだけで
他になんのリスクもないじゃん
04234102016/06/02(木) 11:18:28.49ID:E1zOmXKj
>>411、414、417
レスありがとうございます。
他の方法考えてみます。
0424デフォルトの名無しさん2016/06/02(木) 12:23:31.19ID:0gMFQogn
>>419 だけど質問させてもらうわ

VBAで.CSVの中にある特定の文字列を書き出して右のセル、特定の文字列を書き出して右のセル・・・
とやって言ってある文字列が来たら下のセルの端から・・・という風なものを作りたいんだけど
0425デフォルトの名無しさん2016/06/02(木) 12:36:06.49ID:jr36f/Tp
csvが対象で文字列操作だけで済むならpythonかruby使え
0426デフォルトの名無しさん2016/06/02(木) 12:38:46.39ID:PrMOVFII
テキストストリームで開いて、
1行ずつ読み込んで、
1行をカンマで分解して、
分解した文字列を比較して、
スキップするのか右に書き出すのか改行するのか処理して、
全行読み込み終わるまで繰り返せばいい。
0427デフォルトの名無しさん2016/06/02(木) 13:42:52.85ID:0gMFQogn
>>426
なるほど 流れは理解できた
1行をカンマで分解ってどうすればいいんだ?

なんども質問して悪いね
0428デフォルトの名無しさん2016/06/02(木) 13:56:01.35ID:f0lhMNCN
Split関数
0429デフォルトの名無しさん2016/06/02(木) 14:03:22.31ID:PrMOVFII
その分だとCSVが結構曖昧なファイル形式と言うことも知らないよね?
大まかに文字通り「カンマ文字で区切られているテキストファイル」程度の縛りしかなく、
カンマ自体を文字列として扱う表現方法とか、
ダブルクォーテーションをどう扱うかとか、
改行コードも区切り文字として扱うのかとか、
そういった決まりが標準として存在してはいないことを注意した方がいいよ。
エクセルに読ませるCSVファイルの作成者とのファイル形式の詳細の確認をしておかないと誤動作する。
あと文字コードとかね。
0430デフォルトの名無しさん2016/06/02(木) 14:26:09.67ID:MCmPKbwB
とりあえず、ここくらいは知っとけ
http://www.pc-master.jp/sousa/csv.html
0431デフォルトの名無しさん2016/06/02(木) 14:27:01.89ID:0gMFQogn
>>429 親切にありがとう
確かにCSVってファイルの存在がよくわかってないのは事実だわ
文字が入ってるファイル 程度の認識だった
0432デフォルトの名無しさん2016/06/02(木) 17:08:58.17ID:H/+hHucZ
まあ俺ならCSVファイルのままどうこうしないで1回シートに落とすけどな
0433デフォルトの名無しさん2016/06/02(木) 17:20:17.63ID:QOEnZCBh
powershellが良いぞ
0434デフォルトの名無しさん2016/06/02(木) 18:34:23.67ID:VAHYdxVD
>>432 に1票
CSVのパースまで自分でやるならVBA使う意味ないじゃんw
ExcelにCSVのデータをセルに配置してもらって
自分で好きなようにいじって
最後にまたExcelにCSVとして書き出してもらいたいからVBAなのでは
0435デフォルトの名無しさん2016/06/02(木) 19:41:25.29ID:Q6rF1mtD
>>434
100万行以内ならそれだな
0436デフォルトの名無しさん2016/06/02(木) 19:54:53.84ID:jr36f/Tp
そもそも特定の文字列取り出すだけなら
CSVパースする必要なくね
0437デフォルトの名無しさん2016/06/02(木) 20:15:59.00ID:W5gwkCTf
元のファイルを読み込んで

特定文字列を見つけたら
ファイルに書き込んでカンマ

別のある文字列を見つけたら書き込んで改行

これをcsvファイルとして読み込む
0438デフォルトの名無しさん2016/06/02(木) 21:05:06.89ID:D6ak8EHx
>>424
やりたいのはこんな感じか? http://codepad.org/2IMAfd1O (コピペして(適当な名前).vbsで保存)
VBScriptだけどSUBの部分はEXCELのVBAにもそのままで持っていけると思う
ワークシートに出したいなら出力部分をファイルからワークシートに変更すればいい
0439デフォルトの名無しさん2016/06/02(木) 21:28:50.10ID:uPQC6lrS
UTF-8のファイルを扱う場合だったら CreateObject("ADODB.Stream") かな
0440デフォルトの名無しさん2016/06/02(木) 22:09:47.82ID:/P5tacee
Excel2010です

用意した置換前、置換後のワードリストに沿って複数の文字列置換を一括処理したいのですが、前後の重複に苦悩しています。

例えば
置換前 置換後
 あ → い
 い → う

というリストで「あい」という値を順番にReplace関数をかけると 
「あい」→「いい」→「うう」になってしまいます。
「あい」→「いう」
になるように処理したいです。

ひとつ考えたのは、置換が済んだ文字列は書式を変えて次の処理をしないという方法ですが、
大量処理のためワードリストも処理範囲も全て配列に格納して処理するようにしているので出来ません。

置換された文字列は次の置換処理に当たらないようにする手は無いでしょうか。
0441デフォルトの名無しさん2016/06/02(木) 22:09:53.87ID:Td5AQauD
正規表現つかったりカンマをタブに置き換えたり
ADODB使ったりSplitで改行位置を何とかしたり色々な方法を考えた結果、
>>429みたいなやり方が一番面倒臭さく無さそうだという結論に達した。

細々と何かすれば処理速度は上がるかも知れないけどね。
0442デフォルトの名無しさん2016/06/02(木) 22:13:13.72ID:Td5AQauD
>>440
置換って逆順にやって行くもんだよ
0443デフォルトの名無しさん2016/06/02(木) 22:18:37.69ID:ZNUdZI3k
>>440
「ぬぬぬ」を検索して使っていなければ
あ → ぬぬぬ
い → う
ぬぬぬ → い
みたいな感じ?
こういう場合どうすればいいんだろうね、知らないわ
0444デフォルトの名無しさん2016/06/02(木) 22:29:53.58ID:W5gwkCTf
>>440
application.screenupdate = false
calculatin = xlmanual
とかにすれば配列に入れなくても結構速くなるけど

それか2次元配列にして置換すみなら印をつけるとか

別にDictinaryとか作って置換すみの配列の添字を追加して
exist()メソッドでチェックするとか
0445デフォルトの名無しさん2016/06/02(木) 22:32:37.55ID:I8wr9FkH
>>442
逆順でも同じです、順序の問題ではありませんので。
例えばこんな相互置換というか循環置換とでも言うのかな、だったら

置換前 置換後
A1 → A2
A2 → A3
A3 → A1

対象範囲内にA1もA2もA3も全部存在するので上から置換しても下から置換しても同じ問題に当たります。

>>443
その手は考えたのですが、置換対象は何でもあるので「使っていない文字列」は常に不明です。
なので一旦意味を持たない大量のユニークな文字列に1次置換してから目的のワードに2次置換するという。
しかしひとつの値に複数の置換対象があった場合、正常な動作を保証できない気がします。

例えば上の例なら
「A1A2A3」という値を「A2A3A1」にしたいので一旦「&//$%%&%%%-5577'/?##-$」みたいになった時に
偶然他の1次置換ワードと繋がったら間違った結果になってしまいます。
0446デフォルトの名無しさん2016/06/02(木) 22:34:27.71ID:W5gwkCTf
>>440
他にはワードリストを工夫する
あ→い
い→う
のリストではなく
あい→いう
のリストを追加して
文字列の長い順に置換処理するとか
0447デフォルトの名無しさん2016/06/02(木) 22:40:12.20ID:I8wr9FkH
>>444
その2つはもちろん入れています。
処理範囲は沢山のシートの沢山の範囲で、置換ワードも沢山なので配列使わないのはなんとか避けたいです。

今はセル範囲を二次元配列1と2に入れて、配列2を置換し、配列1と配列2の値が違ったらその番地だけセルに代入するよう組んでいます。

FIND関数とLEN関数で置換した文字列の開始文字数と終了文字数を記録して、次の置換対象がその範囲内に被っていたらreplaceを回避
というのも考えたのですが、これもひとつの値に同じ置換が複数回発生した時に2個目以降が回避できないです。
0448デフォルトの名無しさん2016/06/02(木) 22:41:12.82ID:uPQC6lrS
>>445
あい→AB
いう→XY
っていう置換リストがある場合、
"あいう"
はどうなるルールなの?
0449デフォルトの名無しさん2016/06/02(木) 22:45:06.67ID:W5gwkCTf
文字列だけでなくその何文字目が置換すみかも管理しないとダメかもね
0450デフォルトの名無しさん2016/06/02(木) 23:05:21.74ID:27mXebeA
あ、これでいけるかな?

1. 絶対に使われていないであろう文字を一つ用意する(ゑ、ゐとか)
2. 一応全処理範囲にその文字が存在しないか検査する
2a.あったらアラート出して止める
3. 置換ワード1は「ゑ@ゑ」、置換ワード2は「ゑ@@ゑ」に置換する(@の数は置換リスト数だけ増えるようfor nextで)
4. 本命に置換する

これなら偶然繋がってた元の置換ワードが偶然別の仮置換ワードと一致しちゃう可能性は無い
0451デフォルトの名無しさん2016/06/02(木) 23:08:41.11ID:ZNUdZI3k
>>450
同じこと書こうと思ってたorz
絵文字でもいいね
正規表現でもいいと思うけど2byte文字が使えるかどうかは分からん
0452デフォルトの名無しさん2016/06/02(木) 23:16:43.98ID:W5gwkCTf
>>450
ワード1はゑ1ゑに
ワード2はゑ2ゑに
ワードnはゑnゑに置換でも良いかも
nを配列の添字とかdictionaryのkeyにすればいい
0453デフォルトの名無しさん2016/06/02(木) 23:47:31.70ID:I8wr9FkH
>>450自分ですが、いけそうですね
明日試してみます
皆さんご意見ありがとうございます
0454デフォルトの名無しさん2016/06/03(金) 00:05:59.50ID:WMPHIHXe
>>448
そういうのは想定していないんじゃない?
0455デフォルトの名無しさん2016/06/03(金) 00:15:28.22ID:3+Y90JKR
リストの最初の方が優先順位が高いと言うルールで良いんじゃないか
先に変換したらその後は変換対象にしない
あいう→ABう
になる
0456デフォルトの名無しさん2016/06/03(金) 00:59:00.12ID:YNoAy0SK
ある業務入力ソフトのデータが、きちんと正しく打ち込まれているかを確認するVBAを作りたいのですが、プログラミングの経験が薄いため、どういう発想で作ればいいか相談させて下さい。

A列には名前が入っています。
B列には日付が入っています。
C列には開始時刻が入っています。
D列には終了時刻が入っています。
E列にはタスク名が入っています。

丁度、以下のような感じです。
鈴木 6/2 11:00 11:30 タスクX
佐藤 6/2 10:30 12:00 タスクY
...

このデータについて、毎日、全員、全てのタスク(X、Y、Zとする)が漏れなく重複なく入力されていて、更にタスク毎に開始と終了もテンプレートに沿って(Xは11:00-11:30、Yは10:30-12:00、のように)入力されているかの確認をしたいのです。

要は、
鈴木 6/2 11:00 11:40 タスクX
となっていれば、11:40の入力ミスが分かるようにしたい。

鈴木 6/2 11:00 11:30 タスクX
鈴木 6/2 11:00 11:30 タスクX
鈴木 6/2 10:30 12:00 タスクY

となっていれば、「タスクXの重複」と、「6/2のタスクZの抜け」が分かるようにしたい。


という感じなのですが、やりたい事が伝われば、すみませんがご教授願います。よろしくお願いします。
0457デフォルトの名無しさん2016/06/03(金) 01:27:49.22ID:p2nW9YpX
「Range.Find , FindNext は検索の終端を検知できずループしてしまうから
最初のアドレスと比較することでループを抜ける条件にしてる」

というのを上のコメントで拝見したのですが、
例えば最初に列指定でFindした際にIf文でNothingの場合どうするのかというのを
いれると思うのですが、検索の終端を検知できずループしてしまうのであれば、
If文までいかずにFindの所で永久ループしてしまう気がするのですが、そうならないのは
何故なのでしょうか?
0458デフォルトの名無しさん2016/06/03(金) 01:37:33.93ID:SESshZ7L
毎日とか全員とかの定義が不明だが、基本的には書いてある通りやるだけなんだが
VBAの問題じゃなくてアルゴリズムもしくはフローの問題

発想は
毎日、全員に対して
 漏れがないかチェック
 重複がないかチェック
全タスクについて
 テンプレートに沿ってるかチェック
を行うだけだが
0459デフォルトの名無しさん2016/06/03(金) 02:02:50.57ID:fVYd85Q0
チケット制・タスク登録なら、Redmine を使えば?
04600gMFQogn2016/06/03(金) 02:48:08.41ID:PdZhxGoZ
いろいろ書いてくれてありがとう
Excelでやる理由はバカでも使えるようにoffice製品のみで完結させておきたいからなんだ

もうちょっと要件整理したり自力で作ってみるわ
またわからないことがあったら聞きに来るかもしれないいが
0461デフォルトの名無しさん2016/06/03(金) 06:26:17.43ID:3+Y90JKR
>>457
一度の実行の間は最初のアドレスを保持しているが
実行が終わると最初のアドレスを忘れてしまうから
0462デフォルトの名無しさん2016/06/03(金) 06:51:34.01ID:p2nW9YpX
>>461
それはFindNextもなのしょうか?
0463デフォルトの名無しさん2016/06/03(金) 06:52:10.03ID:p2nW9YpX
>>461
失礼しました。それはFindNextもなのでしょうか?
0464デフォルトの名無しさん2016/06/03(金) 07:11:10.78ID:PJyaHrdN
>>457
findにおける検索の終端と、
findを利用して自分で組むループの終端を混同してるようだけど、
findは検索範囲内でafter:=以降の部分から範囲内を一通り検索して、
検索対象が一個見つかるか全く見つからないときに検索を終える。
これがfind検索の終端。
それに対してfindでは検索範囲内に複数の検索対象があった時に
一個ずつしか見つけられないからfind next も組み合わせて
自分で組むループの終端は
最初に見つかった検索対象の位置を自前で記憶しておいて
そこまで戻ってきたらそこを終端とするって話。
ゴッチャにしたらダメ。
0465デフォルトの名無しさん2016/06/03(金) 07:33:19.48ID:p2nW9YpX
>>464
ありがとうございます。
複数の検索対象があった時に、FindNextでもFindに置き換えたとしても、
1個づつしか見つけられないから、Do〜Loop文等でアドレスを比較し、
一致するかしないかで終端を作るということですね。
0466デフォルトの名無しさん2016/06/03(金) 07:35:43.26ID:JncqPXc2
>>456
コレクションかディクショナリにタスク名をキーにして、作業情報を登録しておけば良いんじゃなかろか。

キーが登録されていないタスクは行われていないし、作業情報も
配列かコレクションかディクショナリにして登録するようにしておいて、複数データがあれば重複だし、
後で複数の重複があった場合、それも検知出来るし詳細な情報も残しておくことが出来る。
0467デフォルトの名無しさん2016/06/03(金) 08:12:34.05ID:+ITo/Rr7
また Find w
0468デフォルトの名無しさん2016/06/03(金) 13:15:16.45ID:n9h4VBSL
セルA1に=now()
が入って時刻が出ています。

セルB1に3分たったら+1ずつ足して行くVBAをお願いします。
0469デフォルトの名無しさん2016/06/03(金) 13:21:15.51ID:3+Y90JKR
>>468
質問内容は?
0470デフォルトの名無しさん2016/06/03(金) 14:11:58.99ID:fD9s4V2q
Sub A1から3分経過していたら加算()
Application.Calculate
End Sub
04714682016/06/03(金) 15:31:38.25ID:9vEli6cv
すみません。
要は3分たったら1、
次に3分たったら2、
次に3分たったら3、
次に3分たったら4
とセルB1に加算されてゆくVBAを知りたいのです。
分かりにくくてすみません!
0472デフォルトの名無しさん2016/06/03(金) 15:46:55.67ID:Ggdm0BoU
>>471
excel vba timerとかでググれ
ググりかたは知ってよな
0473デフォルトの名無しさん2016/06/03(金) 16:57:20.17ID:fD9s4V2q
=INT(TEXT((A3-A2),"hh:mm:dd")*480)
0474デフォルトの名無しさん2016/06/03(金) 21:58:12.97ID:JncqPXc2
>>471
本当にその要件なら>>473でこと足りるとは思うけど
タイマーによるイベント処理を行いたい訳ではないよね。

そうだとしたらVB6と違ってタイマコントロールはないからAPIを使うことになる。

時間を計ってぐーるぐる回して時間になったら処理をするという手もあるけど、
イベント使った方が何かカッコいい気がするし、
ゲームとか作るとき処理が終わりきれていないと
次のイベントを待つので「ああ、処理落ちだ」って昔のゲームみたいに
趣きのあるものが作れる
0475デフォルトの名無しさん2016/06/04(土) 00:43:24.42ID:x9jX4yju
>>473
それはVBAじゃない
0476デフォルトの名無しさん2016/06/04(土) 06:34:18.01ID:w3l9f/tm
[B1]="=INT(TEXT(A3-A2,""hh:mm:dd"")*480)"
0477デフォルトの名無しさん2016/06/04(土) 13:41:41.17ID:XvYHrNjs
480ってなに?
0478デフォルトの名無しさん2016/06/04(土) 13:51:00.00ID:qmE4Ukk2
>>477
24*60*60/180
Excelでは1日を1で表す
180秒で1増える様に上の値を掛ける
0479デフォルトの名無しさん2016/06/04(土) 18:51:18.35ID:Urj/a8QZ
>>476
どうでもいいけどこれ時刻の書式間違ってね?

"hh:mm:dd" → "hh:mm:ss"
0480デフォルトの名無しさん2016/06/04(土) 19:36:59.18ID:rYWf1jQa
selectとfromとwhereとorderbyを備えたクラスを作ったらLINQみたいに使えて便利かなあ?
0481デフォルトの名無しさん2016/06/04(土) 21:10:02.67ID:laCcMYDZ
>>480
用途があるなら便利じゃないの?
よくわからない質問だなあ…
0482デフォルトの名無しさん2016/06/04(土) 22:25:12.69ID:rYWf1jQa
>>481
ごめんなさい。愚痴です

Obj.select(変換式).from(情報源).where(抽出条件).orderby(大小関係)
ってするべきなんだけど難しくて。

Obj.from(情報源).where(抽出条件).select(変換式).orderby(大小関係)
だったら処理する順通りだから何とかなるけど。
0483デフォルトの名無しさん2016/06/04(土) 23:19:26.57ID:wPHlgGMm
なんか知恵袋で似たようなこと考えてた人いた
sql文て見づらくなる時もあるからこんなのもいいかもね
Dim SqlClass As CreateSql
Dim SqlList As String
Set SqlClass = New CreateSql
Call SqlClass.SqlSelect("テスト用テーブル")
Call SqlClass.SqlWhere("条件", "A")
Call SqlClass.SqlOrderD("条件B")
SqlList = SqlClass.SqlCode
0484デフォルトの名無しさん2016/06/04(土) 23:44:25.98ID:6mTFRE/r
Range("af11").Select

SendKeys "{F2}"
SendKeys "+{up}"
SendKeys "^{c}"

SetCursorPos 1710, 910
' mouse_event 2
' mouse_event 4


セルを選択し、書き込みモード?の状態にしてから内容を全てコピーして
(セルから直接コピーだとペーストさせてくれないソフトを使ってます)
マウスを指定した座標に移動させそこでクリックした後ペースト

というマクロを作りたいのですが、処理が上手くいきません
上記のマウスをクリックさせる を含めないとコピーが上手くいくのですが
マウスをクリック を含めると内容をコピーしてくれてません
原因は分かりますか?
04854822016/06/05(日) 00:07:58.54ID:6XcU5txU
>>483
それって本当のSQLで、SQL文をどうやって作るかっていう問題に見える。

Obj.select(変換式:=2倍).from(情報源:=配列a).where(抽出条件:=100未満).orderby(大小関係:=昇順)
みたいなのを想定してます。
■ このスレッドは過去ログ倉庫に格納されています