[過去ログ] Excel VBA 質問スレ Part39 [転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
4(3): デフォルトの名無しさん [] 2015/12/01(火) 19:27:05.42 ID:m+Ed34Zj(1) AAS
最近、vbaを学んだ者ですが、配列の有り難みがよくわかりません。
前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします
52(3): デフォルトの名無しさん [sage] 2015/12/08(火) 19:55:43.49 ID:ZPfyD2ax(2/2) AAS
誰か>>48頼む!
=if(a3>a2,3,-3)を入力しても無理だった・・・
60(3): デフォルトの名無しさん [sage] 2015/12/09(水) 11:36:59.80 ID:NOtadkaS(1/2) AAS
エクセルにcsvファイルのデータを貼り付けて一部の列にvlookupの数式を上書きしたいんですけど
どうすればよいですか?
マクロにしたいのは数式の上書き部分だけです
76(3): デフォルトの名無しさん [sage] 2015/12/10(木) 20:33:09.52 ID:GTbd/bMS(1/2) AAS
VBAでCreateObject("Scripting.Dictionary")とすると
連想配列が使えることを知ったのだけど
動的配列(要素を放り込むと勝手に伸びていく配列)はないですかね
普通の配列は、要素数を決めてDimなりReDimなりしてからでないと
使えなくて不便で…
130(3): デフォルトの名無しさん [sage] 2015/12/22(火) 14:25:32.96 ID:toHtA+zz(1) AAS
VBAってIf文やFor文等のブロック内で変数宣言しても、そのブロック内だけのスコープにならないんだよね
結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
183(3): デフォルトの名無しさん [] 2015/12/29(火) 10:58:22.65 ID:u34Ypxab(1) AAS
プロシージャ名/関数名はすべてラクダ型の文字列にしたいのですが
その夢がかなわない単語1つのときはどうしたらいいですか?
[通常]
createSheet
fillData
[問題]
initialize
186(5): デフォルトの名無しさん [] 2015/12/30(水) 14:22:33.58 ID:WC2i3iyl(1/5) AAS
For each構文でループを回すとき、
一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?
ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。
210(3): デフォルトの名無しさん [sage] 2015/12/31(木) 12:11:06.57 ID:3FCNx6UT(1/2) AAS
For i 〜の構文内での話なのですが・・・
1.iやjの変数の宣言がされてないとエラーが出ます。
2.下記の記述をしていますが、自分が想定したのと違う動きになります。
For i = 1 To 9
For j = 1 To 9 - i
If IsNumeric("TextBox" & (2 * (i - 1) + 2 * j + 7)) = False Then
テキストボックスを順にチェックしていきたかったのですが
なにか記述方法が間違っているのでしょうか?
ご指導のほど、よろしくお願いたします。
240(3): デフォルトの名無しさん [] 2016/01/05(火) 12:34:15.92 ID:Kvov8i6k(4/6) AAS
Javaに慣れてると
他のSub(例えば名前をAdditionの2つの引数を取るとします)を呼ぶときに
Addition(5 , 8)
が構文エラーとなるのが気持ち悪くてしかたがありません。
正しくは
Addition 5 , 8
Call Addition(5 , 8)
のいずれかにしなければなりません。
でもどうにかしてJavaのように
Addition(5 , 8)
のようにできる方法はありませんかね?
257(5): デフォルトの名無しさん [] 2016/01/06(水) 10:36:47.15 ID:qs2eqDcn(2/2) AAS
>>255>>256早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・
最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします
まだどうしtらいいかわからないです
22歳OL
305(4): デフォルトの名無しさん [sage] 2016/01/08(金) 16:51:24.45 ID:VkXSxnl8(1/4) AAS
>>304Dim v As Variant
'LBound=0 : 長さ3の配列
ReDim v(0 to 2)
v(0) = 0: v(1) = 1: v(2) = 2
' LBoundを1に変えたい
' LBound=1 : 長さ4に拡張
ReDim Preserve v(1 to 4)
'長さ3に戻す
ReDim Preserve v(1 to 3)
こうするとLBoundの値は確かに変わるし、巨大な配列でも一瞬で終わる。
これが仕様的に正しいと言えるのか不明。ループでやると仕様的な不安はないけど時間は掛かる。
416(4): デフォルトの名無しさん [] 2016/01/14(木) 13:51:57.39 ID:q8GDBYq3(3/3) AAS
1つのSubの中が長くなって短くしようとするときに
そのSub内で繰り返しのコードが見つかったので
それをさらにそのSubから呼ばれるSub(サブSubと呼ぼう)にしたいとき
単にそのサブSubをPrivate Subにするしか方法はないですか?
理想はそのSubからしか呼ばれないからそのSubの内部にそのサブSubを置きたいのですが。
425(4): デフォルトの名無しさん [sage] 2016/01/14(木) 22:09:12.75 ID:kKuTLL/9(1) AAS
みなさんの話が難しくてわからない
どうすればVBAに詳しくなれますか?
437(3): デフォルトの名無しさん [] 2016/01/15(金) 20:17:56.81 ID:JNdiAV22(1) AAS
プロシージャの役割は1つだけにして簡潔に短く、というポリシーは賛成ですが
それを実現するためにプロシージャを分割しようとすると
元のプロシージャで使ってたローカル変数が使えなくなって困ります。
そのへんみなさんはどう対処してますか?
たくさんの引数を使ってわたしてる?
さらにプロシージャ分割を行うとさらに引数を使い、たらいまわしになってしまうのですが。
475(4): デフォルトの名無しさん [sage] 2016/01/19(火) 19:36:21.61 ID:1yi9x6jx(5/7) AAS
>>474モジュール1
private tableA() as currency,tableB tableC
…動的配列10個程
sub 実行()
CALL A
配列の要素数決定しredim処理
CALL B
CALL C ←BCDで配列の中身を入れていく作業
CALL D
end sub
CALL先のプロシージャでは、ほとんど全ての配列を使っています。配列以外のこまごました変数だけ値渡ししています。
モジュール2
sub 全実行()
for n = 1 to 60
CALL 実行(name)
next n
end sub
こんな感じです。スマホからですいません。
487(3): デフォルトの名無しさん [sage] 2016/01/20(水) 00:34:12.16 ID:tnXkhLo5(1) AAS
ExcelでVBAマクロl動かしてる間
他のExcelの作業が中断してしまうのですが
どうにかなりませんか!
499(6): デフォルトの名無しさん [] 2016/01/20(水) 18:19:33.52 ID:xdXYdVv+(1/3) AAS
対象セルがどこかのセルで参照されているかどうか、
判定することはできるのでしょうか。
参照先のセルを得るのではなく、
「参照されているか、否か」を判定する方法です。
シート内の不要データの整理に使いたいと考えています。
505(3): デフォルトの名無しさん [sage] 2016/01/21(木) 00:52:36.55 ID:rehOk3U9(1) AAS
10行×5列の表があって、1列目に5個、2列目に8個、3列目に5個、4列目と5列目は空欄となっています。各項目は必ず1行目から入っています。
各列から1つずつ取って、それらを左から繋げた文字列(順列)を作りたいのですが、どのように書けば良いのでしょうか。
各列に何個要素があるかをカウントするところまでは書けたのですが、そこからよくわからなくなってしまいました
509(3): デフォルトの名無しさん [sage] 2016/01/21(木) 06:18:36.49 ID:0jk7vnPh(2/3) AAS
>>508Sub test()
Dim a(1 To 5), str(5), b() As String, index As Long
For i = 1 To 5
a(i) = Range(Cells(1, i), Cells(Rows.Count, i).End(xlUp)).Value
Next
For Each v1 In a(1): str(1) = v1
For Each v2 In a(2): str(2) = v2
For Each v3 In a(3): str(3) = v3
For Each v4 In a(4): str(4) = v4
For Each v5 In a(5): str(5) = v5
c = ""
For Each x In str
c = c & x
Next
ReDim Preserve b(index)
b(index) = c
index = index + 1
Next:Next:Next:Next:Next
For Each x In b
Debug.Print x
Next
End Sub
五桁固定。最低でも一桁当り2要素ないといけない。
桁数まで柔軟にすると、くっそ面倒だから自分でやれ。
520(4): デフォルトの名無しさん [sage] 2016/01/21(木) 13:30:20.23 ID:X7n9A0oT(3/3) AAS
>>515515(2): デフォルトの名無しさん [sage] 2016/01/21(木) 12:00:32.16 ID:tGM9G3/P(2/2) AAS
>>509
ありがとうございます。
条件を書くと、以下のようです。
1)各列に何個の要素があるかは動的(
2)何列あるかも動的(>>506のネストの数は3だが、ここが何回ネストするかが動的になる)
3)組み合わせの仕方は左から順にのみで、並び替えの必要はない(樹形図的)
4)要素の文字数も動的で、何桁か決まってはいないし、数字もあれば文字列もある
私は条件2のうまい書き方がよくわからず、結局、何列あるかを調べて、if文で1列なら〜2列なら〜3列なら>>506というようにしています。
再帰ってのはこんなふうに書くんだよ
ループのネストの段数が不定でも問題なく動く
VBAの仕様でデータが300列ぐらいあるとメモリ不足を起こすけど、300列の順列なんて出そうとしたら人類が滅亡するほど時間がかかるんで実用上は問題ない
Sub main()
Call Recursive(1, "")
End Sub
Sub Recursive(c As Long, s As String)
max_row = Cells(Rows.Count, c).End(xlUp).Row
If Cells(max_row, c).Value <> "" Then
For r = 1 To max_row
Call Recursive(c + 1, s & Cells(r, c))
Next
Else
Debug.Print s ' データ出力
End If
End Sub
533(4): デフォルトの名無しさん [sage] 2016/01/22(金) 12:38:57.86 ID:6pvUxBV3(1) AAS
最近、If文の1行書きを知ったのですが、例えば、10個の分岐を10個のelseifを使って分岐させるのを1行書きに書き換えるとスピードはやはり落ちるものなんでしょうか?
elseifを使うと、該当したら他のelseifコードはスルーしますが、1行書きifを使うと、一応ぜんぶ判定しにいくので。しかし可読性は1行書きの方なんですよね〜
564(3): デフォルトの名無しさん [sage] 2016/01/23(土) 15:40:45.44 ID:xVQLFIqO(1) AAS
2つの配列の値を比較してサンプルを数える(Countifs系)コードについてアドバイスお願いいたします。
ListP()as Currency とGPR() as Stringという配列で、欲しいサンプルは、以下の5個です。
ListPが60以上の、サンプル数、SamSix
ListPが60以上かつ、GPRが4つの文字列である数、SB,SHB,SL,SHL
For n = 1 To 1000
If ListP(n, x) = Empty Then
Exit For
ElseIf ListP(n,x) >= 60 Then
SamSix = SamSix + 1
If GPR(n, x) = "B" Then
SB = SB + 1
ElseIf GPR(n, x) = "HB" Then
SHB = SHB + 1
ElseIf GPR(n, x) = "L" Then
SL = SL + 1
ElseIf GPR(n, x) = "HL" Then
SHL = SHL + 1
End If
End If
Next n
このループを多用(約1万回)しているのですが、ループを使用しなかったり、もっとスピードの出るアイデアはございませんでしょうか?
5個のサンプルを取得できれば満足です。
よろしくお願いいたします。
616(3): デフォルトの名無しさん [] 2016/01/25(月) 20:30:20.64 ID:S6u4QlwX(1) AAS
VBAなんてやめてHaskell使いなよ。
こんな数学的に説明できない糞言語使いにくいでしょ。
649(3): デフォルトの名無しさん [sage] 2016/01/28(木) 20:55:34.37 ID:87VXcHuk(1) AAS
>>648648(2): デフォルトの名無しさん [sage] 2016/01/28(木) 20:19:00.28 ID:l8d43dgO(1/2) AAS
i = UBound(arr)
For i = 1 to i
Next
みたいにリサイクルしちゃう事はよくある。
たまにあるならまだしもよくあるなら向いてない
特にループ変数に i とか使うのはまだわからんでもないが
> i = UBound(arr)
とか書く奴は単なるバカ
695(3): デフォルトの名無しさん [sage] 2016/01/29(金) 23:03:44.66 ID:x5GxlBbm(1) AAS
>>694どのようにやるのか教えていただけませんか?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.235s*