Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 22:08:43.71ID:jtngtgXU0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

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

※前スレ
Excel VBA 質問スレ Part69
https://mevius.5ch.net/test/read.cgi/tech/1607786543/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/05/05(水) 14:52:08.71ID:CaKZkb7J0
>>667
知らないわ
別言語のスレとかそんなに見ない
669デフォルトの名無しさん (ワッチョイ 7f8e-MiMN)
垢版 |
2021/05/05(水) 15:01:03.66ID:CAyVZDxB0
そもそもいつものあいつだし
2021/05/05(水) 16:38:09.75ID:nWfClEZV0
みなさんを混乱させてしまいまして
もうしわけありません
2021/05/05(水) 20:02:01.88ID:mEvPZJoP0
VB6やVB.NetでVBA用のDLLビルドしてるんだけど、
DLL側のクラスのメンバ構成に変更加えてリビルドしたら、それを参照しているVBAのプロジェクト側で、いちいちDLL参照解除→DLL再参照を手作業でやらんとアカンの?
面倒くさいんやけど。
って、これまでの流れ見たら、スレチな質問になるんかな。
2021/05/05(水) 22:06:37.83ID:XLRqwo1W0
DLLてデルルでいいの?
673デフォルトの名無しさん (ワッチョイ dfe6-HlUj)
垢版 |
2021/05/05(水) 22:10:12.24ID:TYeLzB6b0
ダリラ
2021/05/05(水) 22:14:38.02ID:CaKZkb7J0
>>672
「ダイナミックリンクライブラリ」
昔はドゥルルって勝手に読んでたな
2021/05/05(水) 22:15:56.49ID:tRoHSHAj0
ドロロ
2021/05/05(水) 22:23:14.23ID:mEvPZJoP0
質問した俺が間違っていた。
2021/05/05(水) 22:29:51.86ID:XLRqwo1W0
「質問した俺が間違っていた」
つまりこれをSOM、読み方はデルル
2021/05/05(水) 23:07:25.23ID:gm6jmmXW0
>>671
VB6とかしらんが
COMだよな?ID変わらん限り参照設定変える必要ないと思ったが
ちゃんとレジストリに登録されてないんじゃね
2021/05/06(木) 06:00:24.75ID:fowE0ZYM0
>>678
レジストリには間違いなく登録してる。
例えばVB.Netで実装するDLL側で、公開するクラスのメンバ関数を一つ増やしてリビルドすると、それを参照しているVBA(Excel)実行時にエラーが出る。VBAプロジェクトのコンパイルもできなくなる。
この時、DLL参照設定解除→DLL再参照をやると正常に読み込まれる。
なお上の例では、VB.Net実装のDLL側で増やしたクラスのメンバ関数を消去して元に戻した上で再リビルドすると、DLL参照設定解除→DLL再参照をしなくても、再びDLLが正常に読み込まれる模様w。
2021/05/06(木) 12:12:28.40ID:EE3pjJQ7a
>>663
おー、美しいな
Rubyの人は>>665-666みたいな声に全く耳を貸さずに延々と書いてる方で、このスレでもたまに見るのよ
ほとんど荒らしだから話しかけても無駄。丁重に無視して差し上げるのを推奨します
681デフォルトの名無しさん (ワッチョイ df11-TNk6)
垢版 |
2021/05/06(木) 17:15:18.35ID:YSpOci5b0
質問です
下記のように重複している項目を除いて合計値を算出するコードを教えてください。
調べたところ連想配列?を使えば良いと書いておりましたが、難しくて使い方がよくわかりませんでした・・・
素人すぎて申し訳ないですが、宜しくお願いします。
https://i.imgur.com/xJ71PFz.png
2021/05/06(木) 17:31:33.29ID:5qdpVrsh0
>>679
軽く試したけど再現しない
たぶん、タイプライブラリの変えてはいけない何か(DispIdが怪しい)が変わってると思われ

これ以上はVB.Netのスレ行け
2021/05/06(木) 18:29:38.21ID:jNBg/veuM
>>681
SUMIFで良いじゃんと思ったけど重複は除くのか面倒くせぇな

配列にA〜Cのデータを代入するだろ?
4列目にりんごなら1、みかんなら2を頭に付けてCのデータを連結した上で数値化して放り込むだろ?
そしたら

For RowCnt = LBound(TgtAry, 1) to UBound(TgtAry, 1)
For RowCtR = Ubound(TgTAry, 1) to RowCnt
If TgtAry(RowCnt, UBound(TgtAry, 2)) > TgtAry(RowCtR, UBound(TgtAry, 2)) Then
SavAry([略]) = TgtAry(RowCnt, [略])
TgtAry(RowCnt, [略]) = TgtAry(RowCtR, [略])
TgtAry(RowCtR,[略]) = SavAry([略])
[省略]
End If
Next
Next

みたいな事をやって配列をソートしてやるだろ?
あとは上から順に見ていけば4列目を無視しても重複が弾けるんじゃねぇかな?
2021/05/06(木) 18:48:02.86ID:2oPZ0CXkF
連想配列だと練習問題みたいな課題やね

set ## = createobject("scripting.dictionary")
set @@ = createobject("scripting.dictionary")
for r = 2 to cells(rows.count, 1).end(xlup).row
if not ##.exists(cells(r, 1).value & cells(r, 2).value) then
##.add cells(r, 1).value & cells(r, 2).value
@@(cells(r, 1).value) = @@(cells(r, 1).value) + cells(r, 3).value
end if
next r

for each key in @@
rr = rr + 1
cells(rr + 1 , 5) = key
cells(rr + 1, 6) = @@(key)
next key

今スマホだから試せてないけど、こんな感じでどうだべ?
2021/05/06(木) 19:08:24.28ID:fowE0ZYM0
>>682
検証、ありがと。しかし、再現ならずか。
>>679の書き込みは、一応、直前に確認してから書き込んだ。
こちらでは、管理者権限でVB.Netを立ち上げて、ビルド時にDLL登録してる。
あと>>679で試しに追加するメンバ関数は最後じゃなく、真ん中あたり(property getブロックとsubブロックの間)に追加している。
ところで、みんな、汎用の俺俺ライブラリをDLL化しないのか。
2021/05/06(木) 19:14:13.18ID:95uMi6p80
>>681
俺ならわざわざVBA書かずに関数追加してピボットテーブルで集計するけど。


https://i.imgur.com/LwvzJns.png
2021/05/06(木) 19:40:05.49ID:VTnVqyux0
キーは若干不安なので
=A2&"_"&B2&"_"&C2
ぐらいにはした方が良いと思う
2021/05/06(木) 20:15:22.86ID:b7Mkjg0R0
>>681
Ruby では、

require 'csv'

input = <<"EOT"
りんご,A,2
りんご,B,4
みかん,D,1
りんご,B,100
EOT

input_ary = CSV.parse( input ) # 2次元配列

# 0/1列目が同じものを排除する。先に現れた行が使われる。「りんご,B,100」は使われない
input_ary.uniq! { |row| [ row[ 0 ], row[ 1 ] ] }

# [["りんご", "A", "2"], ["りんご", "B", "4"], ["みかん", "D", "1"]]

result = [ ]

# フルーツ名でグループ化する
input_ary.group_by { |row| row[ 0 ] }.each do |row|
sum = row[ 1 ].sum{ |row| row[ 2 ].to_i } # 合計
result.push [ row[ 0 ], sum ]
end

pp result #=> [ ["りんご", 6], ["みかん", 1] ]
2021/05/06(木) 20:23:53.60ID:95uMi6p80
>>687
なるべく簡潔に書きたくて、そのリスクは無視したw
実際は間に何か挟んだほうがいいね。
2021/05/06(木) 21:11:34.82ID:VTnVqyux0
>>681
元データいじっていいなら重複の削除が超早い(ダメでもコピーすればいいだけだけど)
ってかSQLのサブクエリなら一行で行けそうだ

Sub Macro5()
Range("a:c").RemoveDuplicates Array(1, 2), xlYes
ActiveWorkbook.PivotCaches.Create(xlDatabase, Range("a:c")).CreatePivotTable Range("e1"), "p1"

Set p1 = ActiveSheet.PivotTables("p1")
p1.PivotFields("com").Orientation = xlRowField
p1.PivotFields("com").Position = 1
p1.AddDataField p1.PivotFields("v"), "合計 / v", xlSum
End Sub
2021/05/06(木) 21:12:21.95ID:VTnVqyux0
すまん、"com"は"会社名"、"v"は"値段"などに適宜書き換えてくれ
2021/05/06(木) 22:14:14.24ID:zoaLFLbx0
D列に
=COUNTIF(B$2:B2,B2)
数値合計に
=SUMIFS($C$2:$C$9,$A$2:$A$9,"=" & E2,$D$2:$D$9,"=1")
693デフォルトの名無しさん (ワッチョイ 7f8e-MiMN)
垢版 |
2021/05/06(木) 23:20:33.75ID:srB+AETb0
>>681
しつこい
2021/05/07(金) 04:04:27.47ID:UcyGqCZa0
いまだにIFとISERROR組み合わせてエラー回避やってる人いるんだ。。。??
2021/05/07(金) 04:24:40.54ID:f/k3XSIv0
流石にいまだにVBA使ってるニキの煽りは違うなw
2021/05/07(金) 06:55:01.06ID:sJ3lVRb90
iferrorはエラーの場合の値の置き換えでは?
2021/05/07(金) 07:20:54.57ID:tuSKe1qQ0
booleanで取りたい場合はIFとISERROR組み合わせた方が早い
698デフォルトの名無しさん (ワッチョイ cf05-M0W8)
垢版 |
2021/05/07(金) 07:26:43.31ID:DloXWpsH0
Excelのセルって、Accessで言うところのコントロールの
OldValue プロパティってないの?
Application.Undo以外で更新前の値に戻すときに使いたいんだけど
699デフォルトの名無しさん (ラクッペペ MMe6-YEtS)
垢版 |
2021/05/07(金) 08:26:31.62ID:EfOHcgmKM
見りゃわかることをいちいち聞くな
700デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/07(金) 09:36:16.79ID:dif1qALr0
教えてください
データベースから取得した大量のデータを、他のシートに簡潔集計したいです。

生データシートには
文字列としてyy(2021)mm(03)をはじめ、メーカ、注文番号、数量、ナンバー、大分類、中分類、小分類など68列に渡ってあります。

理想としては別シートに月別に
メーカ、大分類、中分類、小分類(ピポット的配置のイメージ)で購入金額、数量を降順で出したいです。
メーカや分類名は多く、都度新しいのが出たりするので、メンテナンスなくして自動で出せるようにしたいです。

どうすればいいでしょうか。
2021/05/07(金) 09:51:31.13ID:/bDSijiLM
>>700
DBに入ってるんだったらSQLで最初からgroup byしたらいいだけ
702デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/07(金) 10:21:13.76ID:dif1qALr0
>>701
すみません、>>700が最終形態ではなく、これができたら私のイメージのモノができるのでお聞きしました。
なのでvbaで回答頂けたら助かります<(_ _)>
2021/05/07(金) 10:44:31.42ID:uFptLScD0
>>702
VBAの中でシートに対してSQL投げて
結果のRecordsetをシートに貼り付けるだけでは?
704デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/07(金) 10:49:59.41ID:dif1qALr0
>>703
すみません。
私がSQLを理解していないので、正直わかりません。
何か分かりやすいサイト等あったら教えてもらえますか?
705デフォルトの名無しさん (ワントンキン MMda-wmZf)
垢版 |
2021/05/07(金) 11:55:04.67ID:Uq/dH8v/M
またいつものあいつか
2021/05/07(金) 12:02:29.78ID:W+W51fKCa
ここの諸先輩方にとってSQLってどういう位置付け? 常識レベル?
2021/05/07(金) 12:10:39.55ID:Gobk7VPl0
手足と同じレベル
2021/05/07(金) 12:13:21.02ID:/bDSijiLM
>>704
DBがあるんだったらそれをメンテしてる人間もいるだろ?
そいつに聞け
2021/05/07(金) 15:40:07.47ID:1tkbLq7p0
DeBu
2021/05/07(金) 19:08:51.24ID:uFptLScD0
>>704
EXCELでどういうObject使ってシートにSQLを投げるかはVBA シート Sql 辺りでググればいくらでも出てくるけどとりあえず一例としてここかな
http://www7b.biglobe.ne.jp/~whitetiger/ex/ex2002088.html

SQLがどういうものかは流石に SQL 入門 辺りでググってくれ
今は使ってないとしても本来VBAと同等かそれ以上の優先順位で覚えるべきものだから絶対覚えておいた方がいい。
711デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/07(金) 20:08:21.87ID:xGNvq5Jp0
なぜインプロセスだかアウトプロレスだかの話を入れたのかがわからないな
2021/05/07(金) 21:41:30.83ID:Z7WMK8Ny0
Ruby on Rails は、MVC(model/view/controller)モデルだから、
最初から、3大データベース(SQLite/MySQL/PostgreSQL)を使う

入門レベル
713デフォルトの名無しさん (ワッチョイ be8e-gIfd)
垢版 |
2021/05/07(金) 22:30:42.79ID:hSzgOaHp0
>>712
MVCだから?馬鹿は黙ってろよ
2021/05/08(土) 00:33:08.33ID:H8oTRyi2d
>>712
ちょっと何言ってるのかわからない
715デフォルトの名無しさん (ワントンキン MMda-wmZf)
垢版 |
2021/05/08(土) 00:50:58.02ID:9rj5+JrYM
オワコンRubyにしがみつくのはこういう馬鹿ばっか
2021/05/08(土) 00:57:21.53ID:PaQQNn710
言語の終わりを実体験するとかなかなか稀有な例だと思う
2021/05/08(土) 00:59:37.62ID:xzBPi/0q0
VBA使っておいて他の言語をオワコン呼ばわりする権利はないと思うが
Ruby荒らしは前からいるキチだからNGしよう
718デフォルトの名無しさん (ワッチョイ be8e-wmZf)
垢版 |
2021/05/08(土) 01:17:43.20ID:xwL6HEYY0
>>716
は?馬鹿なの?
DelphiとかADAとかSmallTalkとかたくさんあるだろ
2021/05/08(土) 01:46:00.09ID:PaQQNn710
>>718
どれもこう、誰も使わなくなってから「あ、そういやなくなってたんだ〜。D言語(だぶりゅー)なんてあったな〜」程度だけど、
rubyに関してはこの狂信者だか超アンチが一強で荒らし回っていて強制終了させている
終わり目の言語に止めをさすとか、こんなん後にも先にもないだろうw
720デフォルトの名無しさん (ワッチョイ be8e-wmZf)
垢版 |
2021/05/08(土) 05:21:49.11ID:xwL6HEYY0
>>719
そういう意味なら納得
721デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 08:40:58.17ID:Wz5DhM+2F
>>710
ありがとうございます。
ふとした疑問なんですが、基本データベースからの
処理が多い場合は、vbaよりもsql勉強した方がいいのでしょうか。

今vbaを一生懸命勉強している最中ですが、効率の悪いのかなって思ってしまって
722デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/08(土) 08:47:24.17ID:YWSmrfQq0
Excel Access使うならVBAは必須
データベース使うならSQLは必須

当たり前のことですね
2021/05/08(土) 09:07:14.40ID:L4NnuIXtM
何するにしてもVBAは別に必須ではない
データ処理やプログラミングをするほぼ全ての人にとってSQLは必須
724デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 09:40:04.43ID:Wz5DhM+2F
初歩的な質問ばかりですみませんでした(-_-;)
私自身パソコンが苦手なので、せめてvbaを身に着けようと思いましたが・・・

vba sql どちらも難しそうですネ
2021/05/08(土) 09:58:17.60ID:Z/jAVLJW0
>>721
>ふとした疑問なんですが、基本データベースからの
>処理が多い場合は、vbaよりもsql勉強した方がいいのでしょうか。

それはそうなんだけど
あくまで俺の場合はだけど
SQLをまともに勉強した記憶がない。

まぁ必要にかられたとき
必要な分だけ調べて覚えれば
基本部分は十分追いつけるものって
ことなんだろうな
726デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 10:18:13.28ID:Wz5DhM+2F
vbaってどれくらいできたら、まあまあ使える人になりますか"(-""-)"
私は下のやつでもう混乱しています・・・これは基本なんですかね?
Sub ()
  Dim i As Long
  Dim ixR As Long
  Dim ixC As Long
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Set ws1 = Worksheets("練習15")
  Set ws2 = Worksheets("練習15_回答")
  ws2.Range("A1").CurrentRegion.Offset(1, 1).ClearContents
  With ws1
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
      ixC = 2
      Do Until ws2.Cells(1, ixC) = .Cells(i, 1)
        ixC = ixC + 1
      Loop
      ixR = 2
      Do Until ws2.Cells(ixR, 1) = .Cells(i, 2)
        ixR = ixR + 1
      Loop
      ws2.Cells(ixR, ixC) = ws2.Cells(ixR, ixC) + .Cells(i, 3)
    Next
  End With
End Sub
2021/05/08(土) 10:19:00.10ID:PaQQNn710
>>724
事務作業で死ぬほど役に立つのはvba。事務だけじゃなく営業でもちょっとした所で使えるなら、事務作業はほぼゼロになるだろう
sqlは使うべき時が来れば、その時に勉強すれば良い。その時に使うのはselectとjoinのはずだ
728デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 10:23:23.79ID:Wz5DhM+2F
>>727
なりほど( *´艸`)
私は事務ですけど、正直vbaもsqlも使わなくても力技でどうにかなってきました。
関数とピポットで・・・
でも時短でvbaしようと思ってやってるんですが、どっちがいいか正直よくわかってません。

勉強しないと
2021/05/08(土) 10:23:26.16ID:PaQQNn710
>>726
読みづらいし色々詰め込みすぎ。個人的にも使わないものが多い
・宣言(dim〜)
・with
・do until
はそうそう使わない

>For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row

>最終行=Cells(.Rows.Count, 1).End(xlUp).Row
>For i = 2 To .最終行
と分けたほうが読みやすい

for、if、setが使えれば大体良いと思う
2021/05/08(土) 10:25:26.96ID:PaQQNn710
>>728
毎回同じピボットを作っているなら、ピボットをvbaでボタン一つで作ってみるとか
普段やってることを自動化するとすぐに覚えられるよ
※ただ、ピボットマクロはかなり大変なのマクロの記録を全力で使ったほうが良い
2021/05/08(土) 10:25:49.52ID:7sae8zS6M
質問者は現に今使うべき時に来ているのに何を言っているのか
実際SQLで一瞬でできることを知らないままVBAで>>726みたいな暗号を延々血反吐吐きながら垂れ流してる可哀想なVBAerは多いし、質問者もここでSQLを使えと言われていなければそうなっていただろう
SQLはVBAよりずっと簡単だから、あまりVBAを使い込む前にSQLは一通りやった方がいい
732デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 10:26:05.17ID:Wz5DhM+2F
>>729
そうなんですか!?
私が使ってるサイトdimは全部に使ってました・・・

すごいショック😢
733デフォルトの名無しさん (アウウィフ FF1f-gUNg)
垢版 |
2021/05/08(土) 10:29:56.46ID:Wz5DhM+2F
>>731
vbaを反吐がでるまで打とうと思ってました
私文系で詳しくないから、みなさん数を打って覚えているのかと・・・

一度sqlについて調べてみます。ありがとうございます。
2021/05/08(土) 10:30:50.49ID:PaQQNn710
あぁ、確かに一回は触っておいた方がいいか

>>732
どっちでもいいよ
宣言なんて間違えないため+メモリ節約のためだけど、
今はメモリが潤沢にあるし宣言を書きに頭に戻るとかアホらしいし余計に間違うわ
2021/05/08(土) 11:21:40.14ID:SHLAkmOY0
前から気になっていたんだけどセルを1つ選んで右クリックして挿入や削除するときのメニューで
セルの削除なのに「ファイルの削除」って表示されるの俺だけ?
2021/05/08(土) 11:36:39.10ID:PaQQNn710
>>735
yes
2021/05/08(土) 11:50:01.75ID:zkiV4DEW0
>>732
> 私が使ってるサイトdimは全部に使ってました・・・
それで正しい
今時コードの先頭にOption Explicitが入ってないサイトは無視していいレベル
ID:PaQQNn710はレベルの低いドヤ顔爺だから話半分に受け流しておけばいい
2021/05/08(土) 12:39:16.21ID:wIqzNMvOM
ここはドヤ顔爺の巣窟ですよ。
子供は他所で遊んだ方が良いですよ。
739デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/08(土) 13:17:27.11ID:SUb7u/UA0
私の勉強方法が合っているのか分からなくなってきました( *´艸`)
740デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/08(土) 13:18:27.12ID:SUb7u/UA0
ID変わっちゃったけどdimのモノです・・・
2021/05/08(土) 13:36:12.98ID:75Tkj6otd
>>740
dimもwithもdo untilも安心して使っていいよ
ただ必ずしも関数の最初にdimをまとめておく必要はないのでiとかは必要になったときに宣言するのでも大丈夫
あとws1みたいな連番の変数よりは目的を具体的に表した変数名の方が良い
742デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/08(土) 13:49:53.06ID:SUb7u/UA0
>>741
ありがとうございます。
粛々とがんばります・・・
実際>>726は綺麗ではないんですかね?
2021/05/08(土) 14:01:23.31ID:75Tkj6otd
>>742
綺麗か綺麗でないかって尺度だとなんともだけど丁寧に書こうとしてるのは伝わるので応援したい
パフォーマンスとか考えるともう少し良くできそうなのと、個人的には関数を小さく分けた方が見通しが良くなるかもしれない(ちょっと曖昧な表現になってすまない)
2021/05/08(土) 14:50:38.57ID:PaQQNn710
俺ならこうなるかなぁ
ただ書いてて思ったけど、index(match(),match())で済むような?

Sub () foo
  Set 元シート = Worksheets("練習15")
  Set 転記先シート = Worksheets("練習15_回答")
  転記先シート.Range("A1:B2").ClearContents

  For i = 2 To 元シート.Cells(元シート.Rows.Count, 1).End(xlUp).Row
    転記列 = 2
    Do Until 転記先シート.Cells(1, 転記列) = 元シート.Cells(i, 1)
      転記列 = 転記列 + 1
    Loop
    転記行 = 2
    Do Until 転記先シート.Cells(転記行, 1) = 元シート.Cells(i, 2)
      転記行 = 転記行 + 1
    Loop
    転記先シート.Cells(転記行, 転記列) = 転記先シート.Cells(転記行, 転記列) + 元シート.Cells(i, 3)
  Next
End Sub
2021/05/08(土) 14:53:21.72ID:PaQQNn710
間違えた、こうか

Sub () foo
  Set 元シート = Worksheets("練習15")
  Set 転記先シート = Worksheets("練習15_回答")
  転記先シート.Range("A1:B2").ClearContents

  For i = 2 To 元シート.Cells(元シート.Rows.Count, 1).End(xlUp).Row
    列 = 2
    Do Until 転記先シート.Cells(1, 列) = 元シート.Cells(i, 1)
      列 = 列 + 1
    Loop
    行 = 2
    Do Until 転記先シート.Cells(行, 1) = 元シート.Cells(i, 2)
      行 = 行 + 1
    Loop
    転記先シート.Cells(行, 列) = 転記先シート.Cells(行, 列) + 元シート.Cells(i, 3)
  Next
End Sub

>742
慣れてない感じは凄い伝わる
コードは後で見直してすぐに内容が分かるように書いたほうが良い。コメントを入れまくるんだ
746デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/08(土) 15:03:51.26ID:SUb7u/UA0
みなさんご丁寧にありがとうございます_(._.)_
vbaを使う人はみなさん頭がいいですね・・・自信ないなーww

sql含めてやってみます。。
2021/05/08(土) 15:07:11.21ID:zkiV4DEW0
>>742
Do Until 〜 Loop
は他の言語だとあまり見ないから条件逆にして
While 〜 WEnd
の方が馴染みのある人が多いっていうぐらいの話
あとコメント入れまくれとか言う老害は無視していい

>>745
そこまでやるなら i じゃ無くて 転記元行 とかにしろよ
2021/05/08(土) 15:13:57.96ID:75Tkj6otd
入れまくれってのは程度にもよるけど読み返すときの手がかりとしてのコメントは残しておいた方がいい
749デフォルトの名無しさん (ワッチョイ be8e-gIfd)
垢版 |
2021/05/08(土) 15:16:34.30ID:xwL6HEYY0
ID変える、しつこく何度も質問する、わざとらしいへりくだり
いつものあいつだろうが
750デフォルトの名無しさん (ワッチョイ 2301-gUNg)
垢版 |
2021/05/08(土) 15:26:39.50ID:SUb7u/UA0
>>749
すみません、誰のことを指しているか分かりませんが、私はあなたの想像している人ではありませんよ。
vbaで悩んでて、質問掲示板ってあったので使わせてもらっただけです。
2021/05/08(土) 17:03:41.13ID:6tENHryO0
>>729
VB6の開発プロジェクトやってたけど
どのソースコードでもdimもwithもdo untilも当然のように使ってたぞ
お前が使わないってだけじゃないの?
あとOption Explicitつけないのはバグの原因になるから推奨できない。
2021/05/08(土) 18:11:49.59ID:jYvDj1vcd
VBScript(WSH)はDimないし使わないのも自然だけどVBAはありがたくOption ExplicitもDimも使うな
2021/05/08(土) 18:14:06.32ID:IhtMBIEH0
俺は変数宣言するけどoption付けない事も多いな
自分だけのちょんプロとか
2021/05/08(土) 19:23:35.24ID:vdqKmiMMd
>>750
この文章でモロバレ
2021/05/08(土) 20:01:04.28ID:+76Iryda0
With使わないのは、C#に採用されなかったように最近の流れだからまあいい
Doも、ループはWhileに統一しろってルールならまあいい

Dim使わんってどういうことだ?
まさか変数の宣言しないってことじゃないよな

Option Explicitなんて自分で書くことまずないが、真っ先に変更するオプションじゃないのか
2021/05/08(土) 20:07:27.25ID:cJeFkg/00
変数の宣言しないと型違いのエラーとか検知しづらくなるし、
コードの中で比較が出てきた時に自作関数の結果か変数の値かどっちと比較してるのかわかりづらくなったり…

とにかく色々エラー回避とかメンテナンス性とか考えて変数宣言しないのはナシよりのナシかと
2021/05/08(土) 20:35:45.94ID:QG+os5rrH
基礎ができてなくて、型の使い分けがわからなくて全部Variantで書いてる人
2021/05/08(土) 21:04:16.49ID:PaQQNn710
>>755
しない

以下でエラーが起きないって時点で俺はアホらしくなって宣言をやめた

Sub foo()
Dim a As String
Dim b As Long

a = "1"
b = 2
Debug.Print a + b '3が出るぞ良かったな

End Sub
2021/05/08(土) 21:06:38.67ID:PaQQNn710
宣言しないと何ができなくなるのか、何を間違えるのかが分からん
2021/05/08(土) 21:30:00.76ID:6tENHryO0
>>758
それは暗黙の型変換が行われるから。

変数の宣言をしたほうがいいのは以下のような場合にエラーにできるから。

public sub foo()
hensu = 1
Debug.Print hansu + 1
end sub

2が出力されることを期待しているが、この場合1が出力される。(変数名の打ち間違い)
2021/05/08(土) 21:36:40.65ID:6tENHryO0
VB6やVBAは型が弱いので、変数名の先頭にintやlng、str等をつけてデータ型がわかるようにするのが一般的だと思ってる。
この場合だと
Dim intHensu As Integer
の宣言を入れておくべき。
2021/05/08(土) 21:37:56.47ID:PaQQNn710
>>760
なるほど
そういう意味では型をつけずに全部variantで宣言はアリなのか
dim a,b,c
ってな感じで
2021/05/08(土) 21:39:48.07ID:PaQQNn710
>>761
変数名見れば何入ってるか分からないか?
2021/05/08(土) 21:43:37.13ID:6tENHryO0
>>763
ごめん一般的といったのは、自分がそう思ってただけなので、実際はそうじゃないかも。
2021/05/08(土) 21:45:17.15ID:jYvDj1vcd
何でもかんでもVariant型だと余計にメモリ食ったり速度面で劣るんじゃなかったっけか
2021/05/08(土) 21:52:57.44ID:QG+os5rrH
簡単なマクロならメモリも速度もほとんど気にしなくていい
そういうのが気になってきてから速くする方法を勉強してもいいと思う
2021/05/08(土) 21:55:44.85ID:cJeFkg/00
文字列 String
整数 Long
小数以下も必要 Single
日付 Date
Setが必要なもの Object
なんでも Variant

初心者ならこれくらいの使い分け出来てたら十分だから宣言はして
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。