1 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 07:07:35.59 ID:tS4zKdphH.net] !extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑同じ内容を3行貼り付けること ExcelのVBAに関する質問スレ コード書き込みや作成依頼もOK 次スレは>>980 が立てること 無理なら細かく安価指定 ※前スレ Excel VBA 質問スレ Part76 https://mevius.5ch.net/test/read.cgi/tech/1651339421/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
321 名前:デフォルトの名無しさん mailto:sage [2022/08/10(水) 22:31:30.17 ID:uspPIoStd.net] >>315 どんなやり方でもいいと思うけどキーワードを含むかどうかを関数にするといいんじゃない Function CheckKeyword(ByVal pValue As String) As Boolean CheckKeyword = True If pValue <> Replace(pValue, "商品", "") Then Exit Function End If If pValue <> Replace(pValue, "価格", "") Then Exit Function End If 残りのキーワードも同様に判定 CheckKeyword = False End Function これを使えば i = i + 1 Cells(i, 1) = B 'セルへ入力 の部分は1つでいいよね
322 名前:デフォルトの名無しさん mailto:sage [2022/08/10(水) 23:03:22.07 ID:kx7L/9BB0.net] >>318 VBA マルチステートメント でググってくれ
323 名前:デフォルトの名無しさん mailto:sage [2022/08/10(水) 23:23:06.57 ID:20iS7AqN0.net] >>318 改行みたいなもん。たとえば N0 = 0 N1 = 0 という複数行のコードを1行にまとめることができる N0 = 0: N1 = 0 だけど、やらない方がいいと言われている
324 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 19:50:59.53 ID:eLvp/vGod.net] 変数宣言と同時に初期化する用途に限って俺は許容してるな それよりif文を1行で閉じる奴が凶悪 ネストするとEnd ifの数が合わなくなる
325 名前:デフォルトの名無しさん [2022/08/11(木) 20:39:49.16 ID:Eqlf5oxG0.net] >>324 変数宣言と一緒に初期値設定する人はよく見かけるしアリだと思う。 同様に実は特殊な場合に限りIf文を一行で記載することもある。 本来構造化言語で使わない方が良いとされているGoto文も特殊な場合に限り使うこともある。 VBAは結構何でもありの言語だからその辺、仕事場のコーディングルールや 作ってる人のマイルールによって随分違いが出てくる。 一概にどんな方法をとることが最善とは言えないから人の書いたソース見てると面白い。
326 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 20:49:36.22 ID:bTQMDZYqd.net] Ifの中身が1行だけの時に全体を1行で書くのはマルチステートメントとは違うくない? If a = 0 Then b =0 あくまでコロンでつなぐ場合のことでしょ
327 名前:310 (ワッチョイ 1301-lJ3c) mailto:sage [[ここ壊れてます] .net] 俺も本来はマルチステートメントは使わないけど、5chのレスは行数制限あるからマルチステートメントにしてるだけ そもそもこの手の話は好みもあってどっちが正しいとかはないからそろそろやめようよ
328 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 22:00:47.13 ID:/ib3rHvC0.net] そもそもダメだとか誰が言っているのだろうか。。
329 名前:デフォルトの名無しさん (スッップ Sd33-N11w) mailto:sage [[ここ壊れてます] .net] ○○ならアリって言ってるってことはそれ以外はナシって受け取る人もいるだろ 提供されたコードをそのまま使うだけしかできないならそれだけの話だし 自分のルールに従って直せばいいだけの話で人のコードにケチ付ける必要なんてないだろ
330 名前:310 (ワッチョイ 1301-lJ3c) mailto:sage [[ここ壊れてます] .net] >>328 > だけど、やらない方がいいと言われている みたいな意見があるから
331 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 00:11:05.61 ID:gP2cSn76d.net] コーディングルールなんて宗教みたいなもんだけど、一応マルチステートメントは推奨されないという意見のが多数 リーダブルコードにも書いてあるし、MS公式も推奨しないと言ってる https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/statements 明確に禁止したがってる人は肌感覚でもっと少数派だけどね
332 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 00:24:13.41 ID:nWfz+VWs0.net] どうせ仕事でVBA作ってる質問者なんて少ないやろ
333 名前:310 mailto:sage [2022/08/12(金) 05:00:53.71 ID:zAuzG+foa.net] >>331 おっちゃんそれVBAじゃなくてVB.NETのドキュメントやで
334 名前:デフォルトの名無しさん [2022/08/12(金) 05:44:37.34 ID:Icr7mfuu0.net] Van.Netなら変数宣言と同時に初期値設定出来るから 引き合いに出すのもお門違いだな
335 名前:デフォルトの名無しさん [2022/08/12(金) 06:23:06.84 ID:dDX14IC1M.net] >>334 van.netなどない、このハゲ!
336 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 08:48:11.58 ID:nWfz+VWs0.net] 中のVBAのコードだけGitに上げることってできるの? めんどいコマンドとか外部サービス使わずに そもVBEからコミットとかプルリクとかやりたい
337 名前:デフォルトの名無しさん [2022/08/12(金) 09:02:48.49 ID:Icr7mfuu0.net] >>335 すまん、VB.Netの間違いだった しかし俺は禿げてはいない。頭頂点しかな!!
338 名前:デフォルトの名無しさん [2022/08/12(金) 09:16:28.60 ID:Icr7mfuu0.net] >>336 まあコードをエクスポートしたものを載っけておくくらいかな。 Bisual Sutadioみたいにエデイタ上から設定するのは無理だと思った。 て言うかコードだけ取っておいてもexcelのVBAの場合はexcelそのものに影響されるところも多いから excelごと取っておいてソースを比較したいときだけ何かのツールでソースの比較を行った方がいいと思う。
339 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 12:38:04.21 ID:Oc3JB1Iir.net] Bisual Sutadio
340 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 12:52:14.02 ID:kbIhrpmL0.net] >>336 今のVBAでGitは見たことないけど 昔VSSで管理するアドインがあったから、アドイン作ればできるんじゃね >>338 マクロ入ってるエクセルはどうか知らんが、今のエクセルってXMLをzipで固めただけのはずだから Zip解答してソース管理に突っ込む手もあるかもしれん つかお前の誤字はわざとかこのハゲ
341 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 16:32:51.36 ID:BEh6dSX60.net] お前ら禿好きだな
342 名前:デフォルトの名無しさん [2022/08/12(金) 16:38:58.11 ID:eSjTAJcc0.net] ↑この人ハーゲマンです
343 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 17:59:10.79 ID:BEh6dSX60.net] いきなし禿げたんよ。 去年の夏位まではふさふさだった
344 名前:デフォルトの名無しさん [2022/08/12(金) 20:16:41.08 ID:ijOecH2p0.net] それはコロナだから治療行けよ。
345 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 21:06:52.17 ID:rQBVWxEE0.net] Dim Eight As Typhoon Set Eight As Typhoon Debug.Print Eight.HPa
346 名前:デフォルトの名無しさん mailto:sage [2022/08/12(金) 21:35:36.13 ID:JWVBEjPKr.net] 質問です エクセルでvba書くとハゲるというのは本当ですか? それともハゲじゃないとまともなコードにならないということでしょうか?
347 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 00:36:53.33 ID:7+qtu9p80.net] >>345 Set Eight = New Typhoon
348 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 00:54:21.19 ID:C3GQNRB30.net] Print Eight.Name Mary
349 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 07:49:57.82 ID:Q44FuubAd.net] >>346 ハゲる→外に出られなくなる→VBAしか無い人生に陥る
350 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 18:00:34.01 ID:+/onKVXv0.net] 禿が気になるなら頭ツルッツルにするという構想は無いのかね?
351 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 18:44:02.54 ID:qT7WXGgOd.net] Dim Hair As Object Set Hair = Nothing
352 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 21:29:48.82 ID:+/onKVXv0.net] >>351 座布団100枚
353 名前:デフォルトの名無しさん mailto:sage [2022/08/13(土) 22:55:44.03 ID:ZiFcsOVE0.net] >>346 こら!良い大人ならスキンヘッドと言いなさい!
354 名前:デフォルトの名無しさん (ワッチョイ d2bd-nhkz) mailto:sage [[ここ壊れてます] .net] スキンヘッドが似合う顔ならスキンヘッドにしてるんですよ・・・
355 名前:デフォルトの名無しさん [2022/08/14(日) 11:14:09.47 ID:VI2zLni0a.net] ezoe職務質問されたってよ
356 名前:デフォルトの名無しさん mailto:sage [2022/08/14(日) 13:17:19.86 ID:RtZKjyzz0.net] >>355 QZ は逮捕・拘留11日を食らったってよ
357 名前:デフォルトの名無しさん mailto:sage [2022/08/14(日) 16:16:37.77 ID:L75yFRnI0.net] スキンヘッドは メガネがポイントだと思う。 閑話休題。 次の話者に期待
358 名前:デフォルトの名無しさん [2022/08/14(日) 16:36:03.46 ID:LT2TaV3B0.net] 皮頭よりはハゲと言われたほうが人権を尊重してるだろ
359 名前:デフォルトの名無しさん [2022/08/14(日) 19:46:54.17 ID:mUrr83gX0.net] >>349 →VBAの質問スレに書きこむようになる
360 名前:デフォルトの名無しさん [2022/08/14(日) 23:12:05.82 ID:LT2TaV3B0.net] きみたちハーゲマンに質問なのですが VBAの配列でJavascriptのようにpushやpopを使いたいときってどうしてます? わざわざredim使って要素数を変えるのはそれが頻繁になるときは使いづらいなと思うし。
361 名前:デフォルトの名無しさん mailto:sage [2022/08/14(日) 23:52:33.60 ID:mUrr83gX0.net] >>360 最初の配列はそのままで添え字を管理
362 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 00:13:18.77 ID:WD7exLpg0.net] ツルピカかつ、不精ヒゲだから女さんなんて絶対に寄り付かない。
363 名前:310 mailto:sage [2022/08/15(月) 05:37:50.20 ID:zxOEKBbO0.net] >>360 VBA で残念に思う所の一つやね サイズの上限が決められるならその上限で確保してサイズは別途管理 上限が決められない時はReDimでちまちま管理してる あとReDimでサイズを0にできないのも地味に辛い
364 名前:デフォルトの名無しさん [2022/08/15(月) 06:56:28.24 ID:OUaqH/oW0.net] >>361 >>363 レスありがとう、ハーゲマンたち。 じゃあしかたないんですね。 でもVBAでもpush, pop, shift, unshiftが使える配列のようなものをVBAのクラスかなにかを使って再現することは可能だろうか?
365 名前:デフォルトの名無しさん [2022/08/15(月) 07:26:27.37 ID:3rPnXTV50.net] >>364 可能、だが○○の機能がないから作れないではなく 目的の動作をするように作るんじゃね 質問が本末転倒している
366 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 08:25:48.51 ID:7kbqjBHA0.net] >>364 他の言語でもスタックやキューは長さの決まった配列だよ そこへオブジェクトを出し入れするときに端のポインタを動かすだけ 長さが足りなくなったら長さ2倍の配列を新しく定義してそっちへオブジェクトを引っ越し、オブジェクトの数が長さの25%を下回るようになったら長さ半分の配列を作り直してそっちへ引っ越し
367 名前:310 mailto:sage [2022/08/15(月) 08:28:07.85 ID:zxOEKBbO0.net] >>364 pushpush, pop だけだけど実装例 https://kazusa-pg.com/vba-stack/
368 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 12:57:14.28 ID:3rPnXTV50.net] EXCELのシートが配列みたいなもんだし
369 名前:310 mailto:sage [2022/08/15(月) 13:34:09.14 ID:zxOEKBbO0.net] >>366 それは実装による リストで実装してる奴もあるし
370 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 16:10:48.09 ID:Z5BB7x+B0.net] VB(A)の配列でpopが必要になる場面ってあんまないなあ 不要になったらemptyぶちこむだけだし
371 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 18:21:13.35 ID:u0LihC760.net] 時間データ >>364 他言語はよー知らんけどdictionaryじゃあかんの?
372 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 18:23:08.68 ID:u0LihC760.net] >>371 ああスマン。なんかへんな一言張り付いた。
373 名前:デフォルトの名無しさん [2022/08/15(月) 19:15:38.92 ID:HvBHLkJg0.net] Dictionaryでいいと思う。 キーに連番、スタックポインタ代わりに変数一個用意してやって、使い終わったらremove で消して。
374 名前:デフォルトの名無しさん (ワッチョイ 6eda-5Ix7) mailto:sage [[ここ壊れてます] .net] やり方は色々あるのにVBAが使いにくいとか言い出す初心者w
375 名前:デフォルトの名無しさん (ワッチョイ 4d2f-O3lh) mailto:sage [[ここ壊れてます] .net] だがしかしVBAにDictionaryはないのだよ WSHはいつまでサポートされるかなぁ VBAより短い気がしてきた まあ俺ならどうしてもキューかスタックほしいなら、.NET Frameworkのやつ使うかな
376 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 19:54:05.83 ID:3rPnXTV50.net] だからVBA使うのやめなよ
377 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 20:17:32.58 ID:kNyRr/sv0.net] VBAでDictionary使えるでしょ
378 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 20:25:53.14 ID:u0LihC760.net] ああ、なるほど。いつ使えなくなるとも知れないとなれば先々を考えて使わないほうがいいかもね。たしかに使い方も特殊だし。>dictionary まぁ、それなら捨てsheet作って貼り付けるかな。2次元までなら。 そのかわり処理速度は格段に落ちる可能性はあるけど、待ってりゃいいならそれもアリか。
379 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 20:28:32.11 ID:Mg/eEpn60.net] それって findfirst/findnext 一発で済む問題なのでは?いちいちマクロで書くのもウザったいですよね‥‥
380 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 20:41:37.63 ID:3rPnXTV50.net] 使いにくいとか面倒とか愚痴るくらいならEXCEL使うのやめればいいのに
381 名前:デフォルトの名無しさん [2022/08/15(月) 21:05:11.95 ID:OUaqH/oW0.net] >>371 Dictionaryはとおの昔から使っておったのじゃよ。 しかし使い続けているうちにふと頭をさわるとなんとハゲてしまったのじゃ。 それは困ると思ってDictionaryに変わるいい方法を探求しておるのじゃ。
382 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 21:40:01.71 ID:u0LihC760.net] >>381 なんだ、ただふざけてるだけか。。。
383 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 22:39:37.83 ID:fsND5nPed.net] そんなハゲ頭に免じてArrayListを進ぜよう
384 名前:デフォルトの名無しさん [2022/08/15(月) 22:52:26.96 ID:HvBHLkJg0.net] DictionaryがイヤならCollection使えばいいと思うけど。 まぁ別に普通に配列でもいいんだけどさ。 多少凝った作りにしたって関数化しとけばいい訳だし。
385 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 04:43:22.32 ID:Z2Qcd4DId.net] >>384 流石に無知すぎるから少し黙った方がいいよ
386 名前:310 mailto:sage [2022/08/16(火) 05:59:23.35 ID:CNdrdYLw0.net] Collection に Exists メソッドがあれば...
387 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 11:11:29.27 ID:09rAK4Ti0.net] 何作ってんだよ
388 名前:デフォルトの名無しさん [2022/08/16(火) 12:23:01.42 ID:2L6vp4NY0.net] >>385 そうだね よく分かりもしないで無知とか決めつける無知は すっこんでればいいよね
389 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 16:58:27.92 ID:tG1qlgnq0.net] あまりマウントの取り合いは止めようぜ 意見交換の場なんだから
390 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 17:40:43.11 ID:09rAK4Ti0.net] どちらかというとけなし合いだな
391 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 18:00:08.72 ID:0h33t1VnM.net] ここにいると神になった気分になるな お前らの見苦しさに対してもなんだか優しくなれそう
392 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 18:20:47.96 ID:tG1qlgnq0.net] 昔は違ったんよ いつからか荒れやすいスレになった
393 名前:デフォルトの名無しさん [2022/08/16(火) 20:19:48.02 ID:NUsqsy200.net] >>382 ふざけてるつもりは毛頭ございませぬ。 でもこれからもハーゲマンの名に恥じぬようVBAを探求していきたいです。
394 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 20:50:53.76 ID:tG1qlgnq0.net] 毛という毛全部剃っちゃえ!
395 名前:デフォルトの名無しさん [2022/08/16(火) 21:16:40.24 ID:NUsqsy200.net] >>394 アホ。 そしたらハゲてまうやんけ。
396 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 21:54:28.52 ID:tG1qlgnq0.net] え? 別にいいじゃん、アンタ元から禿なんだから。
397 名前:デフォルトの名無しさん [2022/08/17(水) 01:45:03.16 ID:d962r+SMa.net] ソルのはムダ毛だけにしとけ
398 名前:デフォルトの名無しさん [2022/08/17(水) 01:57:01.99 ID:sNWv67oad.net] 頭髪は生えないのに髭は生える
399 名前:デフォルトの名無しさん [2022/08/17(水) 04:59:55.38 ID:EILeizBb0.net] >>396 コラ、われわれハゲ族は、 励まし合って生きていかねばならぬ。 ハゲ増し合うことはするな。
400 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 07:35:41.89 ID:hasTYsFP0.net] 頭髪はハゲても、耳毛は濃くなる
401 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 11:39:32.10 ID:Ork7WWB+0.net] 禿ではないのだけど、40歳にして髪は真っ白よ。
402 名前:デフォルトの名無しさん (ワッチョイ 6eda-5Ix7) mailto:sage [[ここ壊れてます] .net] 好きな色に染めようぜ
403 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:58:33.86 ID:PQdbwjDzr.net] Excelらしく緑だな
404 名前:デフォルトの名無しさん [2022/08/18(木) 12:18:45.39 ID:yPHO1+kSp.net] なんという体たらく もうハゲはこのスレ出入り禁止でいいな
405 名前:デフォルトの名無しさん (ワッチョイ fdb7-laJE) mailto:sage [[ここ壊れてます] .net] 2つの表があって、表Aと表Bとして 表の作りは二つとも同じで、 コードと数字を持ってます。 二つの表のコードが一致してる場合は コード A B 101 50 60 102 40 100 103 30 104 50 といった感じで片方にしか存在しない場合は片方だけの行を追加して行くってvbaを作りたいんですが、何かいい案はありますか? AとBの表で数字の比較をしたいです for nextでやろうとしてますがうまくいいやり方が見つからずです
406 名前:デフォルトの名無しさん (ブーイモ MM85-Hx7L) mailto:sage [[ここ壊れてます] .net] まずVBAを忘れます SQLで FULL OUTER JOIN します (゚д゚)
407 名前:デフォルトの名無しさん (ワッチョイ 468c-hYSv) [[ここ壊れてます] .net] >>405 テーブルのリレーションシップを設定したらいいんじゃないかな
408 名前:デフォルトの名無しさん (アウアウウー Saa5-dwW8) mailto:sage [[ここ壊れてます] .net] 例えば以下の様なデータがあるとします 開始~終了:消費量 1月1日 0時~1月1日16時:500 1月1日16時~1月2日10時:1000 1月2日10時~1月5日 0時:800 1月5日 0時~1月5日0時:300 1月5日0時~1月6日0時:2500 1月6日0時~1月7日12時:1200 このように時間の区切りがバラバラ(かつ日跨ぎや0分間もある)のデータに対して、1月1日、2日、3日にそれぞれ合計いくらかを出したいです なお、例えば20時~翌6時で1000の様な場合は4h:6h=400:600として計上したいです どう計算するか方針すら思い浮かばないのですが何かアイディアありましたら教えてください
409 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 15:01:03.74 ID:JMDQexcx0.net] vlookupでできない? 普通にforループでも難しいことなさそうだけど、どんなコード書いたの?
410 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 15:04:36.75 ID:JMDQexcx0.net] >>409 は>>405 へのレスね
411 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 15:14:31.63 ID:EMP5KmCeM.net] >>408 まず問題を分割しよう まず(step1)日別にレコードを分割し、(step2)それを日付でグループ化して合計を出すと考えればいい step2は典型的なグループ化と小計なんで楽勝として、step1はちょっと面倒だから更に分割しようか 例えば、入力として一行の内容を渡すと、日別分割されたレコードの配列を返す関数を作って、その結果を結合すればいいだろう
412 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 15:53:00.45 ID:XgHMEnCRd.net] >>405 深く考えなくていいなら ①2つの表(シート)をそれぞれ参照して作業用のシートAを作る コード シート 値 101 A 50 102 A 40 ・・・ 101 B 60 102 B 100 ②シートAをソートする ③シートAの内容を読み込んで質問にあるようなシートBを作る
413 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:12:23.70 ID:EfwMa2qS0.net] できた! 二重ループでできました。
414 名前:411 mailto:sage [2022/08/18(木) 16:21:20.45 ID:fCi7ElhaM.net] 日別分割関数について補足しておこう この関数を更に分割すれば、下記のようになるだろう (1) 開始日時と終了日時の間の日付を全て取得する (2) 終了日時と開始日時の差を時間単位で求め、結果をHとする (3) (1) で取得したそれぞれの日付(dとする)について、下記を実施する (3.1) 開始日時と終了日時の間において、日付dに属する時間が何時間あるかを計算し、結果をhとする (3.2) 消費量*h/Hを計算し、結果をxとする (3.3) 日付dと消費量xのペアを分割結果の1レコードとする ここまで分ければ簡単だろう。もしまだ難しければこのように適宜分割するとよい。
415 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:23:33.57 ID:MNMwm62Z0.net] 初歩的な質問なんだけど、上下一致してる場合だけ転記して行くという場合 1行目は例外として省く処理いれて cells(r-1,1)=cells(r,1)とかってやってくと、不一致のものが現れた時に一致してた行の最初の値が転記できなくなるんだけどどうしたらいい? 100 100 101 101 102 とかって並びの時に、100の一番上が転記されないとか 102とかも転記されない 上下比較の時の最適解の比較方法を知りたい
416 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:23:56.43 ID:X/mZUHYK0.net] >>405 結構面倒、前提条件として「表A, 表Bのコードは各々ソートされてる」かつ「表A, 表Bのコードは各々の表内で重複してない」のであれば... Type T S As WorkSheet: L As Long: R As Long: C As Long: D As Long: F As Boolean End Type Dim TA As T, TB As T Set TA.S = WorkSheets("表A"): Set TB.S = WorkSheets("表B") TA.L = TA.S.Cells(TA.S.Rows.Count, 1).End(xlUp).Row: TB.L = TB.S.Cells(TB.S.Rows.Count, 1).End(xlUp).Row TA.R = 1: TB.R = 1 TA.F = False: TB.F = False Dim S As WorkSheet: Set S = WorkSheets("結果") Dim R As Long: R = 1 Do G TA: G TB If TA.F And TB.F And TA.C = TB.C Then S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: S.Cells(R, "C").Value = TB.D: TA.F = False: TB.F = False ElseIf (TA.F And TB.F And TA.C < TB.C) Or (TA.F And Not TB.F) Then S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: TA.F = False ElseIf (TA.F And TB.F And TB.C < TA.C) Or (Not TA.F And TB.F) Then S.Cells(R, "A").Value = TB.C: S.Cells(R, "C").Value = TB.D: TB.F = False Else Exit Do End If R= R + 1 Loop Private Sub G(T As T) If Not T.F And T.R <= T.L Then T.C = T.S.Cells(T.R, "A").Value: T.D = T.S.Cells(T.R, "B").Value: T.F = True: T.R = T.R + 1 End If End Sub
417 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:34:05.48 ID:EfwMa2qS0.net] >>416 ありがとぅざいます! そうなんです 考え出したらこれかなり面倒だなと思って、、 同じような発想かもしれないですが 外のループはA表のコード番号の縦列の値を固定して、 内側ループでB表を縦にコードが一致するまで検知して 一致した場合フラグを立てて、一致したコードの時は一致してるコードの隣に値を転記。 内側ループを抜けた時点でフラグが立っていない場合はBにしか存在しない値なので、A表の最終行以降に転記 って考え方でいけました!
418 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:37:32.42 ID:EfwMa2qS0.net] あ.A表に転記ではなくてC表ですね
419 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 18:49:57.27 ID:AeknNWbaa.net] >>411 ,414 ありがとうございます、そのヒント元に自己解決できました 1. 対象となる期間を配列に格納 2. データを1つずつ0:00で分解、按分は都度[その日の時間/全体の時間]で実施 3. 配列内の一致する日付に割振り 4. 2-3ループ
420 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 20:46:21.25 ID:JMDQexcx0.net] >>415 102は一致する相手がいないけど、転記される必要があるのかな? ぱっと思いつくのは ポインタをrとsの2つを用意してr=1, s=1から始める 1. Cells(s, 1) == Cells(r, 1) の間だけ s を進める。 2. Cells(s, 1) の値が変わったところで a) s - r > 1 なら Cells(r, 1) を転記しながら s に追いつくまで r を進める b) s - r == 1 なら転機せずに s に追いつくまで r を進める 3. 1からの手順を表の最後まで繰り返す
421 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:39:41.60 ID:MNMwm62Z0.net] >>420 相手がいない場合も転記です そのやり方試してみます 単純そうでむずかしい…