1 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 00:22:23.67 ID:Fd224klc0.net] !extend:checked:vvvvv:1000:512 ↑同じ内容を2行貼り付ける ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part68 https://mevius.5ch.net/test/read.cgi/tech/1598756127/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
941 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 16:15:55.00 ID:gGJzxP62H.net] 百合・百合子バグ修正 Sub Macro1() rr = Cells(Rows.Count, 1).End(xlUp).Row For r = 1 To rr n = Cells(r, 1) s = Cells(r, 2) t = "・" & s & "・" For i = 1 To r - 1 If Cells(i, 1) = n Then w = Cells(i, 2) If InStr(t, "・" & w & "・") = 0 Then t = t & w & "・" End If End If Next t = t & s & "・" For i = r + 1 To rr If Cells(i, 1) = n Then w = Cells(i, 2) If InStr(t, "・" & w & "・") = 0 Then t = t & w & "・" End If End If Next t = Left(t, Len(t) - 1) t = Right(t, Len(t) - Len(s) - 2) Cells(r, 3) = t Next End Sub
942 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 16:53:04.48 ID:cZC9o7Y5M.net] 百合さんと百合・D・ルフィさんがいた時にバグる
943 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 17:22:11.94 ID:gGJzxP62H.net] 百合・D・ルフィバグ修正 Sub Macro2() Dim d As Object Set d = CreateObject("Scripting.Dictionary") rr = Cells(Rows.Count, 1).End(xlUp).Row For r = 1 To rr For i = 1 To rr If Cells(i, 1) = Cells(r, 1) Then s = Cells(i, 2) If Not d.exists(s) Then d.Add (s), 0 End If Next Cells(r, 3) = Join(d.keys, "・") d.RemoveAll Next End Sub
944 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 17:31:00.58 ID:tUVUKdZi0.net] >>932 Ruby で、CSV ファイルでやってみた require 'csv' tmp_hash = { } result_ary = CSV.read( "input.csv" ) # 2次元配列 result_ary.each do | row | # 1行ずつ処理する if tmp_hash.has_key? row[ 0 ] # 既に、その数字が存在すれば # 文字列が存在しない時だけ、その文字列を追加する tmp_hash[ row[ 0 ] ][ row[ 1 ] ] = true unless tmp_hash[ row[ 0 ] ].has_key? row[ 1 ] else tmp_hash[ row[ 0 ] ] = { row[ 1 ] => true } end end # p tmp_hash # {"11111"=>{"A子"=>true}, "11112"=>{"B子"=>true}, # "11113"=>{"C子"=>true, "D子"=>true, "E子"=>true}, # "11114"=>{"F子"=>true}, "11115"=>{"E子"=>true}} result_ary.each do | row | # 1行ずつ処理する # その行の3列目に、キーを結合した文字列を追加する row.push tmp_hash[ row[ 0 ] ].keys.join( "・" ) end csv_str = result_ary.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する print csv_str
945 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 17:41:01.13 ID:QPeaG/4LM.net] 何故突然にRuby?
946 名前:932 mailto:sage [2021/03/16(火) 18:32:29.43 ID:yEkj4Jws0.net] >>940 度々ありがとうございます! 最初ヤツでも今の所大丈夫そうでしたが、今後はこちらを使わせていただきます! 他の方もありがとうございます!
947 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 19:02:04.81 ID:EUyNpk5n0.net] >>942 rubyスレだと相手にもされないからわざわざ違うスレに来てるかわいそうな人だよ
948 名前:デフォルトの名無しさん [2021/03/16(火) 21:06:28.11 ID:8Gn4pDRu0.net] 名前の例が○子とは、そうとうなジイさんだなw
949 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 21:12:32.28 ID:gGJzxP62H.net] >>945 現代だとどう書くの? ランキングによると結が人気あるらしいから結A、結B、結Cか
950 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 21:15:14.58 ID:lullOsMB0.net] そら「百合(ろーず)」よ
951 名前:デフォルトの名無しさん [2021/03/16(火) 21:28:58.74 ID:8Gn4pDRu0.net] >>946 なんで女なのか?
952 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 21:42:16.30 ID:gGJzxP62H.net] そんなこと言ったら、なぜ日本人なのか、なぜ人類なのか
953 名前:デフォルトの名無しさん [2021/03/16(火) 21:51:49.14 ID:8Gn4pDRu0.net] 太郎、次郎、三郎、四郎、五郎でいいだろ。
954 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 21:55:45.14 ID:YCs8uHit0.net] なんで男なのか?
955 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 22:05:23.00 ID:gGJzxP62H.net] 3000行もあるのに、それじゃ考えるのが大変だ
956 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 23:39:47.76 ID:FDp5iKWO0.net] 手作業でAからFカップを調べる作業にVBA使うとか お前ら男として終わってるわマジで
957 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 00:14:55.79 ID:8Ujh9QFC0.net] ろーずって薔薇じゃないの?
958 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 00:20:54.29 ID:lKwA7qQn0.net] そうだよ
959 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 00:54:57.81 ID:KXbC8pO1H.net] わざと間違えるっていう2chから続く伝統芸 https://i.imgur.com/h4Fip2L.jpg
960 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 02:44:52.10 ID:LQZUutD10.net] >>933 いきなりCellsで始まるのはいただけないなw できればブックから始める習慣を付けて欲しい。
961 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 03:45:50.60 ID:KXbC8pO1H.net] >>957 なおした Option Explicit Sub VBA69_932() Dim A_number As Long, B_name As String, C_list As Object Dim last_row As Long, row_loop As Long, search_loop As Long Set C_list = CreateObject("Scripting.Dictionary") With ThisWorkbook.ActiveSheet last_row = .Range("A" & Rows.Count).End(xlUp).Row For row_loop = 1 To last_row C_list.RemoveAll A_number = .Range("A" & row_loop) For search_loop = 1 To last_row If .Range("A" & search_loop) = A_number Then B_name = .Range("B" & search_loop) If Not C_list.exists(B_name) Then C_list.Add (B_name), 0 End If End If Next .Range("C" & row_loop) = Join(C_list.keys, "・") Next End With End Sub
962 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:07:11.87 ID:wJCP0FMq0.net] >>933 謎の変数名を多用するのやめてくれ。見る気が一瞬で失せる。 ネスト深くするのも罪悪感感じてくれ
963 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:20:01.36 ID:QeKL1gNm0.net] 配列でやれ
964 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:38:31.95 ID:CnU6DmD/0.net] はい
965 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:48:27.37 ID:AkcuhhXSr.net] れつ
966 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:49:53.05 ID:rwSgtXuJ0.net] ゴー
967 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:52:25.95 ID:KXbC8pO1H.net] >>960 なおした Option Explicit Sub VBA69_932_a() Dim This As Worksheet Dim table() As Variant Dim A_number As Long, B_name As String, C_list As Object Dim last_row As Long, row_loop As Long, search_loop As Long Set C_list = CreateObject("Scripting.Dictionary") Set This = ThisWorkbook.ActiveSheet last_row = This.Range("A" & Rows.Count).End(xlUp).Row ReDim table(last_row - 1, 2) table = This.Range("A1:C" & last_row) For row_loop = 1 To last_row A_number = table(row_loop, 1) C_list.RemoveAll For search_loop = 1 To last_row If table(search_loop, 1) = A_number Then B_name = table(search_loop, 2) If Not C_list.exists(B_name) Then C_list.Add (B_name), 0 End If End If Next table(row_loop, 3) = Join(C_list.keys, "・") Next This.Range("A1:C" & last_row) = table End Sub
968 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 10:59:16.82 ID:AkcuhhXSr.net] 変数にABCなんてのを使ってる時点でセンスゼロ 後で見て全くわからないバグの温床にしかならない
969 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 11:12:33.58 ID:QeKL1gNm0.net] LBound UBound使えよ
970 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 11:56:37.23 ID:KXbC8pO1H.net] >>965 お手本見せて >>966 データ数は変数に入れたから改めて調べる必要ないという判断
971 名前:デフォルトの名無しさん [2021/03/17(水) 12:13:35.08 ID:YH/YYkmR0.net] クソコード
972 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 12:27:17.82 ID:rAxKrtcHF.net] うんコード
973 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 13:20:25.46 ID:4HdAS7ns0.net] 変数名に対する識者の見解 https://mevius.5ch.net/test/read.cgi/bsoft/1608362765/253n
974 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 14:37:09.94 ID:rwSgtXuJ0.net] 口だけで何もしない(できない)奴はスルーでいいよ
975 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 15:25:09.30 ID:vF0LuwhE0.net] >>964 うーん 頭ごなしに糞というつもりはないけど そうだね、もし改善点を挙げるとすれば・・・ まぁ聞き流して良いけどね。 ・変数名は一貫性を持たせて、一見して何を意味しているのか分かるようにすること。 例えば頭の1文字が大文字だったり小文字しているのをキャメル形式に統一するとか。 ・ActiveSheetは極力使わない。 キチンとした意味を持っているならそれでいいけど、フォームやツールバーから呼ばれることやそのように改修される可能性も考慮してどのシートを使うか明示的に指定する方が良い。 もちろんその際はシート名が変更されてしまうことを考慮して シート名ではなくシートオブジェクト名を使用する。 ・単一責任原則を踏襲する。 一つの関数またはメソッドに、一つの役割のみ持たせて一つの関数またはメソッドが増長になることを防ぐ。 とは言ってもこれは何を一つの役割とするかを決めるセンスが必要で、 これを上手く作れれば「糞」からひとつ脱却出来る。 後は趣味の問題だけど ・Withを使わないことに慣れる。 VBA → VB.Net → C#に移行したとき、Withが無いから慣れておくとちょっと楽。 ・CreateObjectは使い所を考える。 CreateObjectはバージョンを考慮せずに済んだりする反面、 メソッドやプロパティのインテリセンスが効かなくなるため、タイプミスをし易くなるという欠点がある。 参照で繋ぐか、CreateObjectで作成するかは 一考した方が良い。 尚、本来Variant型は何でも入ってしまう危険な型なので 使わない方がいいと言いたいところだけど EXCELのRangeオブジェクトとあまりに相性が良いから使うなとは言えない。
976 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 16:55:51.25 ID:ttYMdvTCd.net] ワロタ
977 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:15:40.71 ID:2RS2aA5zM.net] メガネをクイってしながら凄い早口で言ってそう
978 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:24:46.18 ID:lGPcjQzL0.net] >>967 940が一番何をしてるのか分かりやすい これにシート銘柄をしっかり記述すればよいのでは?
979 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:25:19.68 ID:lGPcjQzL0.net] 銘柄w シート名ね
980 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:38:30.30 ID:vF0LuwhE0.net] >>964 ついでにもう一つ言っておくと、 ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。 着眼点は良かったけど、3000行を考慮すると オーバーフローで落ちる可能性があるよ。
981 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:56:32.92 ID:lKwA7qQn0.net] >>956 ちがう 金星(まぁず)ちゃんというDQNネームがあった
982 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 19:57:39.75 ID:lGPcjQzL0.net] ディクショナリは重複確認用で3000データをまるまる格納する訳じゃないだろ
983 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 20:01:06.73 ID:cHLiD5SO0.net] >>977 >ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。 初耳
984 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 20:20:25.27 ID:lKwA7qQn0.net] >>977 嘘を言うな
985 名前:デフォルトの名無しさん [2021/03/17(水) 21:15:41.95 ID:X8ZT7dpP0.net] 256ページの辞書なんて存在するの?
986 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 21:56:14.59 ID:2ghuU9if0.net] ウィンドウ上の制限
987 名前:デフォルトの名無しさん [2021/03/17(水) 23:33:51.91 ID:YH/YYkmR0.net] 経験からくる誤った思い込みだろうね。 1バイト単位の区切りというのは、8ビットパソコン時代からExcelが存在していれば、可能性としてあるが、16ビットパソコンから作っているのに1バイトという制限はありえない。
988 名前:デフォルトの名無しさん mailto:sage [2021/03/17(水) 23:42:58.65 ID:n+mEYgox0.net] ディクショナリとかコレクションとかが、具体的に何を指してるかにもよるんだが まあ255個とかいう制限のディクショナリやコレクションは思いつかないが EXCELに限れば、上限255とか256とかいう制限のものは今ですらちょこちょこあるんだぜ https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E5%88%B6%E9%99%90-1672b34d-7043-467e-8e27-269d656771c3#ID0EBABAAA=%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3
989 名前:デフォルトの名無しさん [2021/03/18(木) 00:01:49.93 ID:7fQvPjcg0.net] >>985 論点ずらしだな。単純に初期のExcelの時代だとメモリ節約で1バイトにしただけで、足りないと判断されたものは、のちに2バイト、4バイト単位に変更されている。
990 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 00:28:15.06 ID:POZoiR5o0.net] 改善点とか言って挙げてる内容は偏ってて微妙だし知識も無いのに態度だけ上からだし昔の人はすごいなぁ
991 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 02:36:30.62 ID:Z7yNcrmt0.net] >>985 例えば列の幅が255文字なのは別に1バイトで管理してるわけじゃなくて上限を設定してるだけだろ そう言うのはExcelに限った話じゃないよ
992 名前:941 mailto:sage [2021/03/18(木) 13:11:04.06 ID:VjRMlHUp0.net] >>941 11111,A子 11112,B子 Ruby で、こういうCSV ファイルを処理した場合、 辞書は、こうなる。 値のtrue に意味はない {"11111"=>{"A子"=>true}, "11112"=>{"B子"=>true}, "11113"=>{"C子"=>true, "D子"=>true, "E子"=>true}, "11114"=>{"F子"=>true}, "11115"=>{"E子"=>true}} F子は、重複しない
993 名前:941 mailto:sage [2021/03/18(木) 13:17:05.45 ID:VjRMlHUp0.net] ただし、このファイルを、1パスでは処理できない 11113,C子 11113,D子 11113,E子 "11113"=>{"C子"=>true, "D子"=>true, "E子"=>true}, C子 を読み込んだ時点で、その行よりも後ろにある、 D子・E子 の情報を取得できないから だから、>>941 では、データ配列を2回読んでいる
994 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 13:36:31.16 ID:pzBF2kYz0.net] >>964 64bit版の時はlonglongで宣言するようにしないとエラーになる可能性があるよ
995 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 14:11:19.12 ID:Z7yNcrmt0.net] >>991 3,000行ぐらいなのに?
996 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 14:55:42.20 ID:pzBF2kYz0.net] そんな考えならプログラミングやめたほうが良いんじゃない
997 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 15:38:13.36 ID:Z7yNcrmt0.net] 何でもかんでもLongLong使うのが正解だとでも思ってるの?
998 名前:デフォルトの名無しさん [2021/03/18(木) 15:58:28.07 ID:7fQvPjcg0.net] >>993 はデタラメを言っているな。妄想なのかな。
999 名前:デフォルトの名無しさん [2021/03/18(木) 16:01:58.30 ID:7fQvPjcg0.net] 他の言語や環境の仕様とごっちゃになってるんだろうな。 Excel VBAで32ビットと64ビットで、よく使われるデータ型に大きい違いがあるなんて聞いたことがない。
1000 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 17:13:11.58 ID:Z7yNcrmt0.net] LongLong は 64bit 環境でないとサポートされないとか LongPtr のビットサイズやバリアント型の文字列の付加サイズが 32bit と 64bit 環境で違うとかはあるけどまあ些細といえば些細な話だわな そもそも現状最大行数が Long 型で扱えるのに >>991 が何を心配してるのか興味ある
1001 名前:デフォルトの名無しさん [2021/03/18(木) 17:39:14.84 ID:7fQvPjcg0.net] 64ビットというのも何の組み合わせを言っているのかもわからない。 それにしてもここはマイクロソフトのサポートの人がいないか? この中途半端さが日本マイクロソフト風なんだが。
1002 名前:デフォルトの名無しさん [2021/03/18(木) 18:16:57.50 ID:d7pvjDlRM.net] サポートの人が256個なんて言わないだろ
1003 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 19:19:46.38 ID:Z7yNcrmt0.net] 組み合わせ? 単に64bit Excelかどうかだけじゃね?
1004 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 95日 18時間 57分 23秒
1005 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています