エクセルマクロオンライン講座 質問と回答

  • このエントリーをはてなブックマークに追加

無料・有料のオンライン講座で 寄せられたメッセージの一部を紹介致します。

[7855] 動的配列_3

平吹 敦史さんからの投稿です。

お世話になっております。発展編1に引き続いてよろしくお願いします。
Chap02-41の演習で以下がどうしても理解できません。

Sub sample6() '静的二次元配列
Dim vList(1, 32) As Variant
Dim cnt As Long
For cnt = 0 To 32
vList(0, cnt) = Range("G2").Offset(cnt).Value
vList(1, cnt) = Range("H2").Offset(cnt).Value
Next

For cnt = LBound(vList, 1) To UBound(vList, 1)
Range("A2").Offset(cnt).Value = vList(0, cnt)
Range("B2").Offset(cnt).Value = vList(1, cnt)
Next

End Sub


Sub sample6() '静的二次元配列
Dim vList(1, 32) As Variant
Dim cnt As Long
For cnt = 0 To 32
vList(0, cnt) = Range("G2").Offset(cnt).Value
vList(1, cnt) = Range("H2").Offset(cnt).Value
Next

For cnt = LBound(vList,2) To UBound(vList, 2)
Range("A2").Offset(cnt).Value = vList(0, cnt)
Range("B2").Offset(cnt).Value = vList(1, cnt)
Next

①と②の違いはLBoundとUBoundの第二引数だけです。
左から数えて二次元目だから引数に2を入れるとのことですが、なぜ実行すると、
①は2行2列だけ(0と1)の反映になるのかが理解できません。

1次元目の最小値は0で最大値も32ではないのでしょうか?

よろしくお願いします。

[ 続きを読む]  返信件数:3件  [ 動画を見る] 

[7245] 動的配列_3

田中 宏明さんからの投稿です。

扱うデータ数に応じて、配列の要素数を後から決定する方法「動的配列」を理解できました。
過去に自分が書いたマクロを見ていると、「静的配列」を「動的配列」に修正したくなります。

[ 続きを読む]  返信件数:1件  [ 動画を見る] 

[7143] Functionプロシージャ演習中

古口梨絵さんからの投稿です。

Functionプロシージャの演習について質問です。
抽象化というお話のなかで、
bgoukeiの第三引数を「3」、第四引数を「10」として設定していますが、「3」と「10」はどこから出てきた値なのでしょうか。
For Next構文から拾ってくるとすれば、「4」と「31」なのでは?と思うのですが。
実際にやってみると、やはり合計値が異なるので「4」と「31」かと。

[ 続きを読む]  返信件数:3件  [ 動画を見る] 

[6813] モジュールレベル変数との使い分け

受講生さんからの投稿です。

小川先生
こんにちは。VBA発展編2の動画を1通り勉強しました。
知識を定着させるために、テキストにある演習問題にとりかかっておりますが
色々なところ思考がとまってしまいヒントがほしいと思うことがあります。
模範解答はダウンロードする講座の資料の中にありますでしょうか。
また、発展2の知識定着のためにどのように復習すればいいかアドバイスありましたらお願いします。



[ 続きを読む]  返信件数:1件  [ 動画を見る] 

[6524] 引数として配列を受け取るFunctionプロシージャ

ゲストさんからの投稿です。

小川先生へ

お世話になっております。
1点質問があります。
下記のサブプロシージャーに
(C-2)とありますが、-2は、なぜついているのでしょうか。
ご教授ください。
よろしくお願い致します。


Sub SetCampaignFlag()
Dim stKonyuList() As String
Dim c As Long
For c = 2 To Range("F65536").End(xlUp).Row
ReDim Preserve stKonyuList(c - 2) '←(質問箇所)こちらです。
stKonyuList(c - 2) = Range("F" & c).Value
Next

For c = 2 To Range("B65536").End(xlUp).Row
'以下のIf文の中で、関数からの戻り値を利用している
If IsExists(Range("B" & c).Value, stKonyuList) Then
Range("C" & c).Value = "○"
Else
Range("C" & c).ClearContents
End If
Next
End Sub

[ 続きを読む]  返信件数:3件  [ 動画を見る] 

[5280] 動的配列_3

miendさんからの投稿です。

この動画の最後に説明している9月以降の祝日を抽出する演習問題についての質問です。
解答案のsub ccc()のコードについてホワイトボードのとおり書き写し、
実行したところ、「インデックスが有効範囲にありません」とのエラーがでました。
Forの前にReDim stHoliday(cm) As Stringを入れたら動きましたが、
If文の中のstHoliday = Range("H2").Offset(cnt).valueのところで
「型が一致しません。」とのエラーがでました。
stHoliday(idx)としてみたところ
元日から天皇誕生日までのすべての祝日を拾ってしまいました。

[Code]
Sub ccc()
Dim stHoliday() As String
Dim cnt As Long
Dim idx As Long
Dim cm As Long
cm = Range("H65536").End(xlUp).Row - 2
 ReDim stHoliday(cm) As String
For cnt = LBound(stHoliday) To UBound(stHoliday)
If Month(Range("I2").Offset(cnt).Value) >= 9 Then
ReDim Preserve stHoliday(idx)
stHoliday(idx)= Range("H2").Offset(cnt).Value
idx = idx + 1
End If
Next

For cnt = LBound(stHoliday) To UBound(stHoliday)
Range("L2").Offset(cnt).Value = stHoliday(cnt)
Next

End Sub
[/code]

そこで、上記のコードのIf Month(Range("I2").Offset(cnt).Value) >= 9 Then
をIf Month(Range("G2").Offset(cnt).Value) >= 9 Thenにしたところ、
エラーはでませんが、2009年と2010年の9月以降の祝日名が抽出されました。
問題の解答として合っていますでしょうか。

[ 続きを読む]  返信件数:2件  [ 動画を見る] 

[5280] 動的配列_3

miendさんからの投稿です。

この動画の最後に説明している9月以降の祝日を抽出する演習問題についての質問です。
解答案のsub ccc()のコードについてホワイトボードのとおり書き写し、
実行したところ、「インデックスが有効範囲にありません」とのエラーがでました。
Forの前にReDim stHoliday(cm) As Stringを入れたら動きましたが、
If文の中のstHoliday = Range("H2").Offset(cnt).valueのところで
「型が一致しません。」とのエラーがでました。
stHoliday(idx)としてみたところ
元日から天皇誕生日までのすべての祝日を拾ってしまいました。

[Code]
Sub ccc()
Dim stHoliday() As String
Dim cnt As Long
Dim idx As Long
Dim cm As Long
cm = Range("H65536").End(xlUp).Row - 2
 ReDim stHoliday(cm) As String
For cnt = LBound(stHoliday) To UBound(stHoliday)
If Month(Range("I2").Offset(cnt).Value) >= 9 Then
ReDim Preserve stHoliday(idx)
stHoliday(idx)= Range("H2").Offset(cnt).Value
idx = idx + 1
End If
Next

For cnt = LBound(stHoliday) To UBound(stHoliday)
Range("L2").Offset(cnt).Value = stHoliday(cnt)
Next

End Sub
[/code]

そこで、上記のコードのIf Month(Range("I2").Offset(cnt).Value) >= 9 Then
をIf Month(Range("G2").Offset(cnt).Value) >= 9 Thenにしたところ、
エラーはでませんが、2009年と2010年の9月以降の祝日名が抽出されました。
問題の解答として合っていますでしょうか。

[ 続きを読む]  返信件数:2件  [ 動画を見る] 

[5138] モジュールレベル変数との使い分け

森 則彦さんからの投稿です。

 小川先生、お世話になっております。VBA上級コースの最後にある総合問題の問題5をやっとできました。
連想配列を関数にした引数として渡すのにちょっと苦労。結構、試行錯誤はしましたが、動いた時には超気持ちよかったです。
 外部連携講座を一通り受講しました。
知識がないままでしたので、ほとんど頭の中には残っていませんが、クラスとインスタンスの事が連想配列のCreateObject(”Scripting.Dictionary”)の
表現から何となくですが、感覚的にちょっとこんなものかな~と感じています。
 余談でしたが、話を元に戻します。
 データを全て取り込む Fuctionプロシージャ <データ取込> と、区名を調べ、種類とその数を連想配列使った  Fuctionプロシージャ <区名_取得>
とSubプロシージャ <レポート_区> という感じで作りました。
 オブジェクト変数は受け渡す度に Set 構文が必要かなという印象を受けました。まだ全てを経験したわけではないので確かなことは言えませんが。?
プロシージャの名前はあえて漢字にしました。引数の受け渡しが感覚的に目で見えるようにとの考えで。
下記にソースコードを載せておきますので、ご感想なりをお聞かせ願えるとありがたいです。
 追伸、
先生にお聞きしたいのですが、私個人の感想では、外部連携講座の基礎コースはさすがに敷居が高いので、
イベントとフォーム講座を先に勉強したほうが良かったかなという印象でおりますが、その辺はどうでしょうか?

code 
Function データ取込() As Variant()
Dim lIst() As Variant
Dim cR As Long, cL As Long, RMax As Long, LMax
Dim rG As Range
RMax = Range("a" & Rows.Count).End(xlUp).Row - 2
LMax = Cells(2, Columns.Count).End(xlToLeft).Column - 1
ReDim lIst(LMax, RMax)
Set rG = Range("a2")
For cR = 0 To RMax
For cL = 0 To LMax
lIst(cL, cR) = rG.Offset(cR, cL).Value
Next
Next
データ取込 = lIst
End Function


Sub レポート_区()
Dim kUrenn As Scripting.Dictionary
Set kUrenn = CreateObject("Scripting.Dictionary")
Dim aLllt() As Variant, kEylt() As Variant, cKen As Long, rKst() As String
Dim c1 As Long, c2 As Long, cNt As Long, rCnt As Long, kSt As String, kEnc As Long
Const rGsl As String = "i"
Const rGsr As Long = 2
aLllt = データ取込()
Set kUrenn = 区名_取得()
kEylt = kUrenn.Keys
With Range(rGsl & rGsr)
For c1 = LBound(kEylt) To UBound(kEylt)
kSt = kEylt(c1)
cKen = kUrenn.Item(kSt)
.Offset(cNt, 0).Value = kSt & "のマンションは" & cKen & "件ありました。"
.Offset(cNt, 0).Font.Bold = True
For c2 = LBound(aLllt, 2) To UBound(aLllt, 2)
kEnc = 0
If Not kEnc = cKen Then
If kEylt(c1) = aLllt(2, c2) Then
rKst = Split(aLllt(6, c2), "/")
.Offset(cNt + 1, 1).Value = aLllt(5, c2)
.Offset(cNt + 1, 2).Value = aLllt(3, c2)
.Offset(cNt + 1, 3).Value = aLllt(4, c2)
.Offset(cNt + 1, 4).Value = rKst(0)
.Offset(cNt + 1, 5).Value = rKst(1)
cNt = cNt + 1
kEnc = kEnc + 1
End If
End If
Next
cNt = cNt + 2
Next
End With
End Sub


Function 区名_取得() As Scripting.Dictionary
Dim kUlist As Scripting.Dictionary
Set kUlist = CreateObject("Scripting.Dictionary")
Dim RMax As Long, rG As Range, kUmei As String, rCnt As Long
RMax = Range("c" & Rows.Count).End(xlUp).Row - 2
Set rG = Range("c2")
For rCnt = 0 To RMax
kUmei = rG.Offset(rCnt).Value
If kUlist.Exists(kUmei) Then
kUlist.Item(kUmei) = kUlist.Item(kUmei) + 1
Else
kUlist.Add (kUmei), 1
End If
Next
Set 区名_取得 = kUlist
End Function
/code

[ 続きを読む]  返信件数:1件  [ 動画を見る] 

[5054] 式と戻り値_3

森 則彦さんからの投稿です。

Dim rg As Range, rg1 As Range
Set rg = Range("a1")
Set rg1 = Range("a2")
Range("c3") = rg + rg1

小川先生、お世話になっております。 森です
オブジェクトへの参照という概念は私なりに理解はしておりますが、上記のコードを走らせるとエラーもなく動きます。"a1" に 2 、"a2" に 3 を代入して動かすと"C3" に 5 という値が入ります。文字列型どうし、日付型どうしでも動きます。データ型が違う場合はエラーとなります。
これから推測するに、内部ではなるべく都合のいいように解釈しているのでしょうかね

[ 続きを読む]  返信件数:1件  [ 動画を見る] 


各講座ごとのメッセージを見る場合はこちら

まずはここから!スマホでも学べる無料動画講座

今なら先着30名限定で無料!定価4,800円の、初心者のためのエクセルマクロ動画講座。
  1. Excel 97~Excel 2016まですべて対応。動画本数20本、総再生時間2時間44分53秒
  2. PC, Mac, iPhone, iPad, Androidのお好みの環境で、いつでも好きなときに学べます。
2004年から10年間述べ3,000名以上に実施した研修の経験と実績を集約した講座です。
いますぐ無料で試してください。

トップへ