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
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

初心者ならこれくらいの使い分け出来てたら十分だから宣言はして
2021/05/08(土) 21:57:26.01ID:L/dDaofga
大量のデータをがばっと取るときはsql
とってきたデータをチマチマ加工したいときはVBA

二刀流がべだー
2021/05/08(土) 22:02:54.21ID:L/dDaofga
変数宣言でいちばん重要なのは
パブリック変数なのか
プライベート変数なのかだよ

型はそんなに気にしなくてよいから
3文字以下ならプライベート、パブリックなら5文字以上にする
2021/05/08(土) 22:18:22.12ID:Z/jAVLJW0
>>769
いや、そもそも
外部とのやり取りはプロパティで行わないと
ブレイクポイント等仕掛けて
どこから呼ばれたか分かり辛くなることを考えると
変数をPublicで宣言する機会はまず無くなるだろう。

もちろんこのプロパティと言うのは概念的なものを含めて
Javaの様に関数と同じ様に設定することも含めるけど。

そうすればパブリック、プライベートの
判断のために変数名の考慮を行う必要も無くなる。
良かったな。
2021/05/08(土) 22:31:52.03ID:PaQQNn710
>>765
variantはかなり遅い
longをvariantにすると
0.001秒の処理が0.01と、処理時間が10倍近くになることも

>>769
vbaのグローバル変数はマジでやめたほうが良い。大体良くない事が起こる
グローバル変数使うなら作業シートに書いたほうがよっぽどマシ
逆にシートにないデータをconst staticみたいに使うならアリ
2021/05/08(土) 23:54:10.02ID:+76Iryda0
>>758
そもそもそのコードで3を期待しないのがおかしいとしか思えんのだが

"12"を期待するなら+じゃなくて&使えよ
2021/05/09(日) 00:48:39.55ID:vQpWnC+C0
>>761
ハンガリアンなついな
VBAあたりを最近書いてないからか
2021/05/09(日) 01:41:49.82ID:SiihAWPs0
variantにすると型間違いでエラーがでないので
やはり推奨できない
2021/05/09(日) 02:15:37.67ID:vzYu7ze/0
知恵を貸してください

ある可変長2次元配列のデータについて
各列のデータから1つずつ抽出した文字列の組み合わせを出力したいと考えています

例えばArray(2,2)のデータが以下だとします
Array(0,0)="いちご"
Array(0,1)="みかん"
Array(0,2)=""
Array(1,0)="あまい"
Array(1,1)="すっぱい"
Array(1,2)="にがい"
Array(2,0)="100円"
Array(2,1)="200円"
Array(2,2)=""
この場合
「いちご,あまい,100円」「いちご,あまい,200円」「みかん,すっぱい,100円」
などの
空白を除く2*3*2=12通りの組み合わせ全てを抽出したいのです
(抽出先はシートでも配列でも何でも良いです)

そして実際にはこの配列をArray(x,y)とすると
xとyは1以上の自然数で不定です

配列の行数が固定長であれば各行において行の数だけFor文でループの中にループを入れれば良いのでしょうが
配列の行数が1以上の不定数の場合にどうすれば良いか思い付きません

vbaというよりアルゴリズムの問題かも知れませんが
良い方法はあるのでしょうか
776デフォルトの名無しさん (ワッチョイ be8e-gIfd)
垢版 |
2021/05/09(日) 02:26:22.29ID:qbmXU1K50
はい、いつものあいつ
2021/05/09(日) 04:53:38.03ID:yBvaHslb0
>>724
はい、難しいです。簡単なら今頃VBマスターで溢れ帰ってます!
日々の努力あるのみです!
2021/05/09(日) 06:11:50.07ID:Gu7b6Am40
相手しない相手しない
2021/05/09(日) 08:20:21.39ID:nRlrfZeFa
ワークシートをグローバル変数みたいなつかい方をする

うむ、よくある
2021/05/09(日) 09:19:54.62ID:TBZcO69u0
uboundで現在の配列の最大要素番号調べて、そこまでループとかじゃないの?
そもそも配列なんて自分はあんまり使わない。redim preserveって確かかなり遅かった気がする。
2021/05/09(日) 09:44:03.47ID:1mWvM4p1M
ReDim Preserveは1番ケツの次元しか可変に出来ねぇのがとても残念
2021/05/09(日) 09:48:20.73ID:HdQWbOvH0
>>775
Sub foo()
Dim array1() As String
ReDim Preserve array1(3, 3)

array1(0, 0) = "いちご"
array1(0, 1) = "みかん"
array1(0, 2) = ""
array1(1, 0) = "あまい"
array1(1, 1) = "すっぱい"
array1(1, 2) = "にがい"
array1(2, 0) = "100円"
array1(2, 1) = "200円"
array1(2, 2) = ""

For Each dim1 In array1
If dim1 <> "" Then
Debug.Print dim1
End If
Next

End Sub

vbaの動的配列は本当にめんどくさいな
2021/05/09(日) 10:05:56.73ID:Nzaho5/SH
行数、列数はUBound関数で調べられる
2次元配列の場合は

UBound(array1, 1)
UBound(array1, 2)

で、それぞれの次元の大きさが取得できる
2番目のパラメータが対象となる次元

あと、多次元配列に一気に代入するにはarray関数を次元と同じ数だけ入れ子にする方法がある

  array1 = Array( _
    Array("いちご", "みかん", ""), _
    Array("あまい", "すっぱい", "にがい"), _
    Array("100円", "200円", ""))
2021/05/09(日) 10:13:55.83ID:vzYu7ze/0
ありがとうございます

ReDim Preserveの配列再定義は知っているのですが
例えば>>782のようだと
「いちご」
「みかん」
「あまい」
……
「200円」
のような2+3+2の7個出力されるだけですよね

「いちご,あまい,100円」
「いちご,あまい,200円」
「いちご,すっぱい,100円」
……
「みかん,にがい,200円」
のような2*3*2の12個を出力したいのです

行数が固定なら例えばArray(2,x)のように列数が不定でも
For i=0 To UBound Array(0,x)
For j=0 To UBound Array(1,x)
For k=0 To UBound Array(2,x)
Debug.Print Array(0,i)& "," & Array(1,i)& "," & Array(2,i)
Next
Next
Next
のようにして空白部分の例外処理を適当に入れれば良いのは分かりますが
行数が不定なので分からないというお話です
2021/05/09(日) 10:14:00.97ID:Nzaho5/SH
>>775
2次元配列の要素数が不明の場合こういう書き方もできる
  For i = 0 To UBound(array1)
    For j = 0 To UBound(array1(i))
      Debug.Print array1(i)(j)
    Next j
  Next i
2021/05/09(日) 10:14:31.62ID:HdQWbOvH0
>>782は全然違うわ、スマン
2021/05/09(日) 10:50:20.26ID:Nzaho5/SH
>>784
とりあえず、Array関数というのが存在するから、変数名にArrayは使っちゃだめ
ArrとかMyArrayとか何か別の名前に変えないと
2021/05/09(日) 11:38:04.63ID:TBZcO69u0
自分で書くならこうかな?
再帰処理使わないでスッキリ書く方法は思いつかなかった。

https://i.imgur.com/noQC9bg.png

これでだめ?
2021/05/09(日) 11:47:23.05ID:Nzaho5/SH
とりあえずもう一つ突っ込みたい
Preserveは不要だしパラメータも(3, 3)じゃない
ReDim array1(2, 2) が正解

>>788
ネストの深さが不定の時は再帰でやるのが一番自然だと思うよ
2021/05/09(日) 11:59:36.87ID:TBZcO69u0
ごめんちょっと動作検証してたら、Uboundのとこxとyが逆だった。
Ifの中に書いてるのが、Ubound(ary1)
でForの中に書いてるのが
Ubound(ary1, 2)
ですね。
2021/05/09(日) 12:09:11.80ID:TBZcO69u0
>>789
おっしゃるとおりですm(_ _)m
せっかくご指摘いただいたので、直したものを上げ直します。

https://i.imgur.com/ykrQPY4.png
2021/05/09(日) 12:10:40.52ID:Nzaho5/SH
やってることは同じだけど画像だと入力が面倒だろうし、俺もほとんど同時に作っちゃってたんで貼らして

Option Explicit
Sub foo()
  Dim array1() As String
  ReDim array1(2, 2)
  array1(0, 0) = "いちご"
  array1(0, 1) = "みかん"
  array1(0, 2) = ""
  array1(1, 0) = "あまい"
  array1(1, 1) = "すっぱい"
  array1(1, 2) = "にがい"
  array1(2, 0) = "100円"
  array1(2, 1) = "200円"
  array1(2, 2) = ""

  Call recloop(array1, 0, "")
End Sub

Sub recloop(array1, row1, str)
  Dim col1
  If row1 < UBound(array1, 2) Then
    For col1 = 0 To UBound(array1, 2)
      If array1(row1, col1) <> "" Then Call recloop(array1, row1 + 1, str & array1(row1, col1) & ",")
    Next
  Else
    For col1 = 0 To UBound(array1, 2)
      If array1(row1, col1) <> "" Then Debug.Print str & array1(row1, col1)
    Next
  End If
End Sub
2021/05/09(日) 12:23:48.39ID:vzYu7ze/0
ありがとうございます
再帰関数の知識は持っていたのですが
自身で再帰関数を使用したことは無かったため盲点でした
このように使用するのですね

助かりました参考にさせて頂きます
2021/05/09(日) 13:41:59.08ID:WHUEfE6G0
>>779
グローバル変数と言うよりストレージみたいなもんだと思ってる
2021/05/09(日) 21:06:29.88ID:o10D8BaNM
ReDim使うのって要素数に変数使うときじゃなかった?
数が決まってるならDim array(0 to 2, 0 to 2) As Stringで良いんだよね?
796デフォルトの名無しさん (ワッチョイ 2a05-M0W8)
垢版 |
2021/05/09(日) 21:07:35.90ID:OCR3m9+L0
>>737
あなたに禿同!
2021/05/09(日) 21:47:13.65ID:HdQWbOvH0
>795
動的配列と静的配列の違いだよ
「変数」でもなければ「数が決まってる」でもなく、「後で変更するかどうか」が違う所
2021/05/10(月) 01:12:41.56ID:8FNokcfwd
再帰を使わない方法でやってみた
「r行c列」の配列を「c桁のr進数」とみなしてる。とりあえず動いたけどバグあるかも

Sub Macro5()
  Dim array1() As String
  ReDim array1(2, 2)
  array1(0, 0) = "いちご"
  array1(0, 1) = "みかん"
  array1(1, 0) = "あまい"
  array1(1, 1) = "すっぱい"
  array1(1, 2) = "にがい"
  array1(2, 0) = "100円"
  array1(2, 1) = "200円"
  row0 = UBound(array1, 1)
  col0 = UBound(array1, 2) + 1
  For n = 0 To (row0 + 1) ^ col0 - 1
    nn = n
    s = ""
    For row1 = row0 To 0 Step -1
      col1 = nn Mod (row0 + 1)
      nn = nn \ (row0 + 1)
      If array1(row1, col1) = "" Then
        s = ""
        Exit For
      Else
        s = array1(row1, col1) & s
        If row1 Then s = "," & s
      End If
    Next
    If s <> "" Then Debug.Print s
  Next
End Sub
2021/05/10(月) 20:50:28.57ID:6x/72ii/a
そもそもの疑問で、なぜVBAは初心者向けとか言われるのでしょうか。
こんなに小難しいチマチマしたこも書かなきゃいけないのに。
全然わからん。
2021/05/10(月) 20:50:49.81ID:GwFlyMni0
>>761
俺もハンガリアン使ってるわ
2021/05/10(月) 20:53:01.66ID:2ArSfNqX0
>>775
総当りってよく考えればパワークエリでクロス結合すれば一発だろって思ったら、パワークエリにクロス結合が無かった・・・
https://www.shegolab.jp/entry/excel-macro-cross-join

accessだとアホみたいなクエリで即完成
https://i.imgur.com/moHa3bx.png
2021/05/10(月) 20:55:51.32ID:/NuMOBBIM
>>799
昔はプログラミングはもっと敷居が高かったんだよ
その中では、Excelさえあれば使えてUIはExcelのワークシートをそのまま利用できるという手軽さは初心者には魅力的だった
その頃の名残だね
今ではPowerAppsとかGASとかSalesforceとかもっと簡単で強力な選択肢は色々あるし、
プログラミングの勉強ならPythonとかJavaScriptの方が初学者には敷居が低い
803デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/10(月) 20:57:55.19ID:vb1TGTCB0
ハンガリアンより#%&$の方が分かりやすいよな
2021/05/10(月) 21:06:13.53ID:6x/72ii/a
>>802
レスありがとうございます。
今、流行りの言語に比べてなぜこんなに、と思っていました。
もっと難しかったのですね。
理解しました。
パソコン仕事を楽に短縮できるよう頑張ります。
2021/05/10(月) 21:09:38.66ID:2ArSfNqX0
vbaは本当に楽。forとif覚えるだけで仕事がはかどりまくり
Cはメモリの知識やらヘッダやら本当に覚える事が多かった上に超便利なワークシートってもんもない
2021/05/10(月) 21:10:42.65ID:aMiH/GVN0
まったくな
807デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/10(月) 21:13:02.21ID:vb1TGTCB0
沢山の似たようなライブラリが公開されていて
いろいろな方法でやりたいことが実現できる

それはそれはいい時代になりました

でも、コレがやりたければコウ書け!
まどろっこしいが他に道は無い!
ってのも初心者にはいいものですよ
808デフォルトの名無しさん (ワッチョイ 6aad-M0W8)
垢版 |
2021/05/10(月) 21:46:59.07ID:WQl4RFpm0
条件付き書式や文字の縮小機能まであって、CopyFromRecordsetの異様な速さ
(もちろんシート関数やオートフィルタの速さも異様でしょう)
VSでは無理だし、自作も当然無理
Excel部署の人だって、1人では無理でしょう
809デフォルトの名無しさん (ワッチョイ 6aad-M0W8)
垢版 |
2021/05/10(月) 21:59:47.57ID:WQl4RFpm0
でも.NETに比べれば、メモリを意識するよ
参照渡しとかMidで打刻とか
結果、値渡しの.NETの方が速いけどw(初期の.NETはVBAの方が速かったが)
2021/05/10(月) 22:34:57.25ID:ViCp850r0
VBA は、シェルスクリプトと同じ。
ちょっとした事しかできない

それを知らない香具師が、複雑なプログラミング用途に使って、
結局保守できなくて、Ruby の10倍ぐらいのコストが掛かる

ちょっとしたナイフで、マグロをさばいたりするのと同じ。
道具・用途のミスマッチ

だから、ウェブ系の会社は、プログラミング言語は適材適所で選択しますって言う。
道具・用途を合わせる。
言語を固定化しない

頭が柔軟。
先に道具を選択しない。
用途から道具を選ぶ

実社会では、ほとんどこればっかり
2021/05/10(月) 23:04:34.19ID:E9+bgpxg0
ExcelのAPIが優秀なのであってVBA自体は微塵も良くない
812デフォルトの名無しさん (ワッチョイ be8e-gIfd)
垢版 |
2021/05/10(月) 23:09:51.84ID:W7s1RH430
>>810
で、終わったRubyしか使えず>>712みたいな嘘を書き散らすようになると
813デフォルトの名無しさん (ワッチョイ 6aad-M0W8)
垢版 |
2021/05/11(火) 00:42:36.92ID:OkNnulfr0
先に道具を選択しないと言いながら、道具ありきの叩きw

オープン系は外から機能を持って来るのが特徴なので、言語自体の機能は不要
なんでも呼べるシンプルなシェルのようなもの、オープン系の起点としてふさわしい

大量データの組合せならSQL ServerにBULK INSERTしてCROSS JOINするのが最速のはず
でもそのクエリを投げるのはVBAで十分で、結果の表示はExcelのCopyFromRecordsetが最速のはず
2021/05/11(火) 01:44:32.13ID:hzo0csgz0
>>801
それじゃ希望した動作にならないのでは?
テーブルの数が不定なのだから。
集計するごとにクエリを作り直すことになる。
2021/05/11(火) 05:27:49.58ID:/SA0DWk40
>>814
クエリってAccess VBAで動的に生成できるんだぜ
2021/05/11(火) 07:53:09.78ID:FeyzCVkSd
>>815
そんなん知ってるが、結局VBAかよw
2021/05/11(火) 09:04:47.57ID:/SA0DWk40
>>816
適材適所だろ
全部VBAで組むより全然楽だし分かりやすいよ
818デフォルトの名無しさん (ワッチョイ 6aad-C7Xb)
垢版 |
2021/05/11(火) 11:31:41.06ID:OkNnulfr0
無償のSQL Serverがあるのに、わざわざ有償で低性能のAccessを使う理由は、初級者であること以外にないですよ
でもExcelはいろんな点で他では追い付けない性能があるので、初級者でなくても使う理由がある

AccessのグリッドもVS等の普通のグリッドとは違い、非同期のリピーターコントロールでできていて、
大量件数でも先頭から順次描画し、全行をメモリに持たないため、高速になるとのこと
その点では、VSより性能がいい(あと子要素の帳票フォームの簡潔さ)
そのかわり常に大量のイベントが走るため、不安定になりやすい
(DBとしてはなんちゃってなので、業者はADP等でSQL Serverと連携して使う)

その速度をさらに超えるのがExcel(特定の使い方で)
イベントが少ないので、不安定になりにくい(Delphiもその点が良かった)
イベントはブック単位で代表できるため、ソースも統合管理しやすい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。