Excel VBA 質問スレ Part71

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f5f-nIK+)
垢版 |
2021/05/25(火) 12:48:01.06ID:mepUVc/i0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/05/25(火) 14:39:07.41ID:Eok9KjPbM
↑おつ
3デフォルトの名無しさん (アウウィフ FFc7-4Cki)
垢版 |
2021/05/25(火) 15:29:32.37ID:9esnpvbXF
>紙の表を目で追いながら画面を見ずにどんどん入力するとか普通にある

下手に補完機能とか発動するとうざいよな
2021/05/26(水) 13:42:07.91ID:LJxSJ8rb0
時々画面も見たほうがいいぞ
2021/05/26(水) 18:56:30.36ID:mkbiTVsAd
画像のような処理をするコードを書きたいのですが・・・
整理番号に対してアルファベットがランダムに振られており、それをまとめるというようなコードです。
ただし、まとめたい整理番号は行が飛び飛びになっており固定されております。
forやifなどを少しかじっただけのため、頑張ってみましたが全くできませんでした。
何卒宜しくお願いいたします。

https://i.imgur.com/w5P4FX4.jpg
6デフォルトの名無しさん (ワッチョイ 9a8e-/g3G)
垢版 |
2021/05/26(水) 19:27:52.83ID:DrPaJmjh0
いつものあいつ
2021/05/26(水) 20:40:38.47ID:YzhdN1Yma
のんびりやろうぜ
2021/05/26(水) 20:43:32.54ID:FIJmCPPEH
>>5
法則がまったくわからん
2021/05/26(水) 20:57:38.79ID:mkbiTVsAd
>>5ですがウンコしてたら閃いてできました。でももしどなたか書いてくださってたら、参考のために見せていただけると嬉しいです。

>>8
整理番号に対してくっついているアルファベットを、重複削除して横向きに整頓したという感じです。
2021/05/26(水) 22:04:20.25ID:VymsA87rM
ID:mkbiTVsAdはとにかく繊維質と水分を十分に摂って山ほどウンコしろ
そうすればこのスレを必要とする事も無くなるだろ
2021/05/26(水) 22:11:44.89ID:XGTO2klA0
入力データは違うけど、Ruby で作ってみた

require 'csv'

tmp_hash = { }
input_ary = CSV.read( "input.csv" ) # 2次元配列

input_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

result_ary = tmp_hash.map do |num, hash|
ary = hash.map { |str, b_true| str }
[ num, *ary ] # 配列展開
end

# p result_ary # 2次元配列
# [["1", "A"], ["2", "B", "C"], ["3", "X"]]

csv_str = result_ary.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する
print csv_str

出力
1,A
2,B,C
3,X
2021/05/26(水) 22:16:14.20ID:FIJmCPPEH
>>9
1と3は、整理前と整理後で同じ行にあるけど、2と4が上に移動してる理由がわからん
移動量も違うし
条件は全部文章で書いて
13デフォルトの名無しさん (ワンミングク MM8a-ZbgT)
垢版 |
2021/05/26(水) 22:55:47.72ID:Ca/oJ0kCM
いつものあいつ=ruby馬鹿
2021/05/26(水) 23:30:39.65ID:CbYT3Zs7M
>>5
Dictioraryを使わずにデータを1列目〜2列目、出力先を4列目以降であると仮定する

配列 = Range(Cells(出力先の1番上の行,4),Cells(出力先の1番下の行,4))

For i = LBound(配列,1) to UBound(配列,1)
For j = データの一番上の行 to データの一番下の行
If Cells(j,1).Value = 配列(i,LBound(配列,2) Then
If 配列(i,UBound(配列,2) <>″″ Then
ReDim Preserve 配列(LBound(配列,1) to UBound(配列,1),LBound(配列,2) to UBound(配列,2)+1)
End If
For k = LBound(配列,2) to UBound(配列,2)
If 配列(i,k) = Cells(j,1),Value Then
Exit For
Else If 配列(i,k) = ″″ Then
配列(i,k) = Cells(j,1),Value
End If
Next
Next
Next

ってやって出力するとか?
思いつきで適当にやったから動かなかったらゴメンね
2021/05/27(木) 01:00:26.94ID:hl6lLSzud
>>12
移動後の整理番号の位置は決まっているだけ という話なのですが... というかそれは書いてあるのですが
2021/05/27(木) 01:01:43.36ID:hl6lLSzud
>>14
おお ありがとうございます
参考にさせていただきます

>>11
このバカはなんですか?
17デフォルトの名無しさん (ラクッペペ MMb6-9F53)
垢版 |
2021/05/27(木) 08:26:53.22ID:f+HvaIKyM
>>5
ピボットテーブルでいいやん
2021/05/27(木) 11:03:53.72ID:hl6lLSzud
>>17
添付画像は簡略化してあるだけなので...
本当に画像みたいなデータしかないんだったらいいかもしれないですが...
19デフォルトの名無しさん (スプッッ Sdf3-FygT)
垢版 |
2021/05/28(金) 11:25:16.55ID:EVw9ke/Wd
>>11
頭が悪いの?
大丈夫?
日常生活は遅れてる?
2021/05/28(金) 12:11:04.92ID:akPeanIUM
>>19
聞いても無駄
自覚できてないからずっとこんなこと続けてるんだろ
2021/05/28(金) 14:13:31.59ID:wSpOVLhu0
A列がKey、B列がItemが入っていたとして、一括でDictionaryに代入する方法はありますか

今はForで処理していますが、
For r = 1 To 10000
dic.Add Cells(r, 1), Cells(r, 2)
Next r

だと読み込みに時間がかかり、配列のほうが早いくらいです
22デフォルトの名無しさん (ラクッペペ MM4b-hX9V)
垢版 |
2021/05/28(金) 15:04:21.04ID:TV0Jrg4dM
どう頑張っても配列のほうが速いよ
2021/05/28(金) 16:57:29.10ID:VcGAYAhXH
配列を経由してDicに入れると多少は速くなると思う
確認はしてない

Sub Macro1()
  Dim Dic As Object
  Set Dic = CreateObject("Scripting.Dictionary")
  Dim aa()
  aa = Range("A1:B10000")
  For r = 1 To 10000
    Dic.Add aa(r, 1), aa(r, 2)
  Next
End Sub
2021/05/28(金) 17:29:35.83ID:ZW1biLGGa
そもそもDictionaryにRange型も入れられるんじゃないっけ?
だから「配列の方が速い」という使い方ならCellsの後にValue付けなきゃいかんのでは
2021/05/28(金) 18:05:19.20ID:wSpOVLhu0
>>23
ありがとうございます。
2021/05/28(金) 18:55:00.91ID:dVrlPf170
>>21
スピードを求めているの?
ならシートにSQL投げた方が速い場合もあるよ
格納場所はRecordsetになるけど
2021/05/29(土) 00:17:36.64ID:EOgZ8Zck0
>>24
それだと重複時に例外が出るメリットが生かせないのでは
配列でいいって言ってるから保証出来てるのかも知れないが

(最終的な目的次第では不要な可能性もあるけど)Dictionaryが必須だとしたら、
使用しない行を予めオートフィルターで弾いて読み込む行自体を減らすのがいいと思う
2021/05/29(土) 09:21:11.45ID:u1rl2gESM
>>23
配列を使うとセルへのアクセスが一万分の一なるね
2021/05/29(土) 12:21:19.40ID:tq3mFxPFH
>>27
非表示になってるセルもRange型一括だと配列に代入されてしまう
1つずつチェックしながらForで回すしかなくなるから、どっちが速いかなあ
2021/05/29(土) 12:22:00.64ID:tq3mFxPFH
>>28
2列あるから2万分の一だよ
2021/05/29(土) 17:06:38.14ID:7OwGsnto0
つかまずディクショナリに入れたいのはRange型なのかそのセルの値なのか

なんにしてもこの程度は一瞬で終わったけどな
2021/05/29(土) 21:19:22.31ID:nUzcb4+O0
>>26
シートにSQLはよく使うが、
数字が入ってると数字と判定されやすいの何とかならんかな。
IMEX=1も利かないときあるし。
(セルの書式設定で文字列にするのは全然効かん)
2021/05/29(土) 22:40:30.37ID:hG567TCp0
>>32
あー、あるあるだね
その辺はSQLの書きっぷりで例えば
数値として判断させるならケツに*1くっつけるとか
文字列としてならケツにブランクくっつけてやることで何とかなるけど確かにあまり綺麗な形とは言い難いかもね。
2021/05/29(土) 22:58:50.78ID:WsLgMeGM0
VBAのユーザーフォームについて、
プロパティウィンドウ上でフォントサイズを変更しようとした場合、
Fontの右側に出てくる[...]ボタンを押して、フォントウィンドウ上でサイズを選択するのが普通ですが、
ボタンを押すとなるとマウス操作が必要になります。

フォントサイズを変更する時に使えるキーボードのショートカットってないですか?
2021/05/29(土) 23:27:11.67ID:tq3mFxPFH
>>34
F4でプロパティウィンドウに移動、↓でフォントの行に飛んでからAlt+↓を押すとフォント選択ダイアログが開く
2021/05/30(日) 00:06:02.75ID:mvwOdKaH0
Alt+↓では開きませんでした。

ForeColor等のように、右側に出るボタンが ▼ の項目については、
Alt+↓で選択候補がプルダウンで表示されました。
これは知らなかったので、一つ知識が増えました。ありがとうございます。
37デフォルトの名無しさん (ワッチョイ 518e-jepm)
垢版 |
2021/05/30(日) 00:29:48.27ID:WJGvMidO0
>>36
ただの馬鹿だろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況