Excel VBA 質問スレ Part69
レス数が1000を超えています。これ以上書き込みはできません。
!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 手作業でAからFカップを調べる作業にVBA使うとか
お前ら男として終わってるわマジで >>933
いきなりCellsで始まるのはいただけないなw
できればブックから始める習慣を付けて欲しい。 >>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 >>933
謎の変数名を多用するのやめてくれ。見る気が一瞬で失せる。
ネスト深くするのも罪悪感感じてくれ >>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 変数にABCなんてのを使ってる時点でセンスゼロ
後で見て全くわからないバグの温床にしかならない >>965
お手本見せて
>>966
データ数は変数に入れたから改めて調べる必要ないという判断 >>964
うーん
頭ごなしに糞というつもりはないけど
そうだね、もし改善点を挙げるとすれば・・・
まぁ聞き流して良いけどね。
・変数名は一貫性を持たせて、一見して何を意味しているのか分かるようにすること。
例えば頭の1文字が大文字だったり小文字しているのをキャメル形式に統一するとか。
・ActiveSheetは極力使わない。
キチンとした意味を持っているならそれでいいけど、フォームやツールバーから呼ばれることやそのように改修される可能性も考慮してどのシートを使うか明示的に指定する方が良い。
もちろんその際はシート名が変更されてしまうことを考慮して
シート名ではなくシートオブジェクト名を使用する。
・単一責任原則を踏襲する。
一つの関数またはメソッドに、一つの役割のみ持たせて一つの関数またはメソッドが増長になることを防ぐ。
とは言ってもこれは何を一つの役割とするかを決めるセンスが必要で、
これを上手く作れれば「糞」からひとつ脱却出来る。
後は趣味の問題だけど
・Withを使わないことに慣れる。
VBA → VB.Net → C#に移行したとき、Withが無いから慣れておくとちょっと楽。
・CreateObjectは使い所を考える。
CreateObjectはバージョンを考慮せずに済んだりする反面、
メソッドやプロパティのインテリセンスが効かなくなるため、タイプミスをし易くなるという欠点がある。
参照で繋ぐか、CreateObjectで作成するかは
一考した方が良い。
尚、本来Variant型は何でも入ってしまう危険な型なので
使わない方がいいと言いたいところだけど
EXCELのRangeオブジェクトとあまりに相性が良いから使うなとは言えない。 >>967
940が一番何をしてるのか分かりやすい
これにシート銘柄をしっかり記述すればよいのでは? >>964
ついでにもう一つ言っておくと、
ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。
着眼点は良かったけど、3000行を考慮すると
オーバーフローで落ちる可能性があるよ。 >>956
ちがう
金星(まぁず)ちゃんというDQNネームがあった ディクショナリは重複確認用で3000データをまるまる格納する訳じゃないだろ >>977
>ディクショナリやコレクションの要素数は1バイトで扱える数、つまり1から数えて256まで。
初耳 経験からくる誤った思い込みだろうね。
1バイト単位の区切りというのは、8ビットパソコン時代からExcelが存在していれば、可能性としてあるが、16ビットパソコンから作っているのに1バイトという制限はありえない。 >>985
論点ずらしだな。単純に初期のExcelの時代だとメモリ節約で1バイトにしただけで、足りないと判断されたものは、のちに2バイト、4バイト単位に変更されている。 改善点とか言って挙げてる内容は偏ってて微妙だし知識も無いのに態度だけ上からだし昔の人はすごいなぁ >>985
例えば列の幅が255文字なのは別に1バイトで管理してるわけじゃなくて上限を設定してるだけだろ
そう言うのはExcelに限った話じゃないよ >>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子は、重複しない ただし、このファイルを、1パスでは処理できない
11113,C子
11113,D子
11113,E子
"11113"=>{"C子"=>true, "D子"=>true, "E子"=>true},
C子 を読み込んだ時点で、その行よりも後ろにある、
D子・E子 の情報を取得できないから
だから、>>941
では、データ配列を2回読んでいる >>964
64bit版の時はlonglongで宣言するようにしないとエラーになる可能性があるよ そんな考えならプログラミングやめたほうが良いんじゃない 何でもかんでもLongLong使うのが正解だとでも思ってるの? >>993 はデタラメを言っているな。妄想なのかな。 他の言語や環境の仕様とごっちゃになってるんだろうな。
Excel VBAで32ビットと64ビットで、よく使われるデータ型に大きい違いがあるなんて聞いたことがない。 LongLong は 64bit 環境でないとサポートされないとか LongPtr のビットサイズやバリアント型の文字列の付加サイズが 32bit と 64bit 環境で違うとかはあるけどまあ些細といえば些細な話だわな
そもそも現状最大行数が Long 型で扱えるのに >>991 が何を心配してるのか興味ある 64ビットというのも何の組み合わせを言っているのかもわからない。
それにしてもここはマイクロソフトのサポートの人がいないか?
この中途半端さが日本マイクロソフト風なんだが。 組み合わせ?
単に64bit Excelかどうかだけじゃね? このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 95日 18時間 57分 23秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。