トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0002デフォルトの名無しさん2015/11/30(月) 19:06:16.48ID:zHM+I8Nt
Sub 1_Otsu()
0003デフォルトの名無しさん2015/11/30(月) 21:18:18.94ID:QHANvkhd
変数宣言を強制するほうが先だろうが
0004デフォルトの名無しさん2015/12/01(火) 19:27:05.42ID:m+Ed34Zj
最近、vbaを学んだ者ですが、配列の有り難みがよくわかりません。
前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします
0005デフォルトの名無しさん2015/12/01(火) 20:28:12.95ID:eT3ZeD+F
>>4
配列処理はワークシートのレイアウトとかと無関係に独立したライブラリにしやすい。
0006デフォルトの名無しさん2015/12/01(火) 21:07:28.65ID:3m4PeF6r
配列の有効性が分からないってVBAを学んだって言えないレベルだろ。
Z80エミュレータからやり直せ。
0007デフォルトの名無しさん2015/12/01(火) 21:20:20.66ID:bdqEzHLJ
>>4
そもそもエクセルのセル自体が広義の意味では2次元配列そのものなので
エクセルを使うという事はすなわち配列を使うことに他ならないわけです。
(A1セル一個しか使わないというなら話は別ですが、そんな人はまず居ないでしょうし。)

貴方の言う「配列」がVBAにおける「配列変数」の事であれば、
連続したデータを順に扱う、
複数のデータに対して繰り返し同じ処理をする、
といったような操作をする際には
配列変数は非常に便利(というか無しではお話にならない)です。
0008デフォルトの名無しさん2015/12/01(火) 23:23:09.59ID:DoIn4zBF
初心者の質問ですが
例えばワークシートに値を入力するときに

Worksheets(1).Name = "2ちゃん"

でシート1のシート名が変更されますよね。でもオブジェクト名のsheet1を使っても変更できますよね。
オブジェクト名を変えた場合にWorksheets(1)かどうか確認するのはどうやったらいいんでしょうか。
シートのプロパティウィンドウみてもオブジェクト名は書いてるけどWorksheets(1)かどうか載ってない
0009デフォルトの名無しさん2015/12/01(火) 23:41:37.98ID:VMDnA6sJ
>>8
Debug.Print Worksheets("sheet1").Index

ちなみに index値は シートタブの左から 1 2 3 ・・・・
となりますので シートオブジェクトと index値は常に 一致するとは限りませんよ
0010デフォルトの名無しさん2015/12/01(火) 23:44:42.53ID:6iNC03K1
年と月をそれぞれB1とD1に入力するだけで日と曜日を自動出力するマクロを作りたいのですが
(たとえば、2015と12と入れればその下に
 1
 火
 2
 水
 といったぐあいに31日まで出力してくれるようなのを目指してます)
自分なりに組んでみたのですが、なかなかうまくいきません
Offsetが悪いのかな、とも思うのですが代替案が浮かびません、どうか助言をお願いします
Excel2013です

Sub Sample()

Dim a As Range
Dim b As Variant
Dim u As Integer
Dim v As Integer
Dim w As Integer
Dim x As Integer
Dim y As Integer
Dim z As Integer

v = 0
w = Range(
0011デフォルトの名無しさん2015/12/01(火) 23:48:55.25ID:DoIn4zBF
>>9
それではWorksheets(1)というのはシートタブの1番左という意味でいいのでしょうか?
0012デフォルトの名無しさん2015/12/01(火) 23:49:02.31ID:6iNC03K1
あれ、切れてる

w = Range("B1")
z = Range("D1")

If z = 2 And Day(Dateserial(w,2,29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or 6 Or 9 Or 11 Then
y = 30
Else: y = 31
End If
End If

For x = 1 To y
w = v * 2
Range("B3").Offset(0,w) = x
b = "Weekday(w,z,x)"
u = w + 1
Range("B3").Offset(0,u) = b
Next x

End Sub
0013デフォルトの名無しさん2015/12/01(火) 23:52:23.38ID:VMDnA6sJ
>>11
そゆこと
ちなみにこれで確かめてみればどうかな?

Debug.Print Worksheets(1).Name
シート名が返ります
0014デフォルトの名無しさん2015/12/01(火) 23:57:05.93ID:DoIn4zBF
>>13
なるるー
イミディエイトで確認できました!ありがと
0015デフォルトの名無しさん2015/12/02(水) 00:19:38.80ID:iA4P55nL
>>12
こんなかんじ?
日と曜日は別の列のほうが良い気もするけど(セルの書式が違っちゃうから)

Sub test()
Dim yr As Long
Dim mo As Long
Dim dy As Long
With ThisWorkbook.Sheets(1)
 .Cells(3, 2).CurrentRegion.Clear
 yr = .Range("B1")
 mo = .Range("D1")
 For dy = 1 To Day(DateSerial(yr, mo + 1, 0))
  .Cells(dy * 2 + 1, 2) = dy
  .Cells(dy * 2 + 2, 2) = DateSerial(yr, mo, dy)
  .Cells(dy * 2 + 2, 2).NumberFormatLocal = "aaa"
 Next dy
 End With
End Sub
0016デフォルトの名無しさん2015/12/02(水) 00:29:46.76ID:YKAbvKrp
>>15
ありがとうございます
こんなに簡素化できるものなんですね……精進します
0017デフォルトの名無しさん2015/12/02(水) 00:33:35.11ID:BpyWczK7
>>11
添削してみた
変数はわかりやすい名前にした方が良いと思うぞ


If z = 2 And Day(DateSerial(w, 2, 29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or z = 6 Or z = 9 Or z = 11 Then '変更
y = 30
Else: y = 31
End If
End If
For x = 1 To y
v = x * 2            '変更
Range("B3").Offset(0, v) = x
b = Weekday(DateSerial(w, z, x)) '変更
u = v + 1
Range("B3").Offset(0, u) = WeekdayName(b) '変更
Next x
0018172015/12/02(水) 00:34:44.42ID:BpyWczK7
アンカ間違えた
>>12 さんへね
0019デフォルトの名無しさん2015/12/02(水) 00:38:55.45ID:iA4P55nL
>>16

とりあえず年(仮にyrとする)と月(仮にmoとする)が定まれば
Day(DateSerial(yr, mo + 1, 0))
つまり、翌月のゼロ日(1日の前の日)を求める事で、
その月の日数をエクセルが自動的に出してくれるんですよ

あと、セルの書式設定も日と曜日が別の列なら
曜日の列だけをNumberFormatLocal = "aaa"でいっぺんに設定できます
例えば曜日をC列にするなら
.Columns(3).NumberFormatLocal = "aaa"
だけで済むわけです

>>15みたいにループの中で1セルずつ変更するってのは
あまり格好良いもんじゃないですよね?
0020デフォルトの名無しさん2015/12/02(水) 10:37:37.63ID:CO7jH6lO
4です、ご返事ありがとうございます。
叩かれること覚悟で書きますが、同じ処理の繰り返しなら配列変数ではなくても、for next
とかfor eachステートメントでは、望ましくないのでしょうか?
002172015/12/02(水) 11:33:14.55ID:ZeoaW+75
for each はともかく、 for next は処理対象を番号で指定するじゃないですか。
番号で指定すると言うことは
配列変数との親和性が高いと思いませんか?
既に言及したとおり、
エクセルのセルは2次元の配列ですから、
セルに対してfor next で繰り返し処理をするというのは
まさしく配列操作そのものなのです。

もし、広義の配列そのものではなく、
redimで宣言する狭義の配列変数のみについて
有効性を論じたいと言うのであれば、
セルに代入するよりも速度が速いとか
メモリの消費量が少ないとか、
3次元以上の配列を扱いたいケース
(まぁ、多次元配列は遅いらしいですけど)
とか、そんな理由があげられますね。

とはいえ、配列など不要だと思うならば
無理に使う必要は無いですし、
その辺は使う人の自由ですよね。
0022デフォルトの名無しさん2015/12/02(水) 11:50:42.44ID:tBPWNP4P
>>20
配列を使わず for next とはどのようなものを想定しているんですか?
002342015/12/02(水) 12:15:32.57ID:IdfHYqnb
For nextも配列立ったのですか、知らなかったです。
てっきり、配列とは
Dim i(5) as long
みたいなものだけを指すと考えており、上手い使い方がよくわかっていませんでした
0024デフォルトの名無しさん2015/12/02(水) 12:32:59.22ID:1aVlPH12
>>23
そういう固定長配列とReDimで作る可変長配列がある。>>21氏の言うところの狭義の配列ですね。
「For Nextも配列だっのですか」という文は意味不明ですが、何かを勘違いしてる?。
0025デフォルトの名無しさん2015/12/02(水) 13:35:58.72ID:ES2jo2hu
質問お願いします!
演算子を変数に格納することはできませんか?

b = ”<=”

If n & b & 10 then

みたいに使いたいのですが、型が一致しませんというエラーとなります。
002672015/12/02(水) 14:29:54.99ID:xdo22nBP
If Evaluate(n & b & 10) then

でいけます
0027デフォルトの名無しさん2015/12/02(水) 15:59:46.36ID:IdfHYqnb
24さんへ
自分にとって配列とは狭義のものと、(A1:C5)みたいなものだけをだけだと思ってました。
Fornextは、配列と関係ないと考えてました
0028デフォルトの名無しさん2015/12/02(水) 17:50:57.38ID:megPAB6I
>>26
ありがとうございました!
0029デフォルトの名無しさん2015/12/02(水) 18:37:30.73ID:l3wtZpWO
もう一つお願いします!
配列を別の変数に格納するときは、次のようなコードで大丈夫でしょうか?一応テストでは成功していますが、なんとなく作って出来てしまったもので、、使い方が危ない場合、ご指摘お願いします。

dim varA as variant
redim a(10,0)
redim b(10,0)

if n = 0 then
varA = a()
else
varA = b()
end if
0030デフォルトの名無しさん2015/12/02(水) 19:04:11.72ID:1aVlPH12
>>29
varA = a、varA = bでいい。後ろの()は不要。varAはVariantだからそれでいける。
代入したものは元の配列のコピーであって別物だよ。コピーする意味はあまりないと思うけど?
0031デフォルトの名無しさん2015/12/02(水) 19:26:54.23ID:UPwzPe+L
>>30
ありがとうございます。助かりました!
a.bは既に要素が入ってる配列のつもりでした。
後に場合分けで参照するときにコード短縮の為に変数格納しました。
少し書き方が悪かったですね。すいません。
0032デフォルトの名無しさん2015/12/04(金) 14:58:36.71ID:R21wXbu/
みんなが今まで読んだVBAの本の中で1番良かった本またはベスト3あったら教えてくれ
0033デフォルトの名無しさん2015/12/04(金) 17:23:30.92ID:gPECvyso
入門書を一冊しか読まなかった
できるシリーズのヤツ
お勧めはしないけど
■ このスレッドは過去ログ倉庫に格納されています