オンライン講座 質問と回答

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

12>

[11441]静的配列

2019-06-06 05:43:30 受講生さんからの投稿です。

 Sub GetZangyoList_Array_GetList()
    Worksheets("残業3").Activate
    
    Dim stAry(5) As String
    Dim cnt As Long
    For cnt = 0 To 5
        stAry(cnt) = Range("I2").Offset(cnt).Value
    Next
    
    Dim st As String
    For cnt = 0 To 5
        st = stAry(cnt)
        Range("B1").Offset(, cnt).Value = st
        Range("B2:B14").Offset(, cnt).Value = Worksheets(st).Range("C3:C15").Value
    Next
End Sub


について
st = stAry(cnt)と一度変数stに置き換えてから書きだしていますが、
For cnt = 0 To 5
Range(“B1”).Offset(, cnt).Value = stAry(cnt)
Range(“B2:B14”).Offset(, cnt).Value = Worksheets(stAry(cnt)).Range(“C3:C15”).Value
Next
にしてもうまく実行されます。
変数に置き換えるメリットがあれば教えてほしいです。

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

[11439]静的配列

2019-06-05 14:20:46 受講生さんからの投稿です。

小川先生

勘定科目のデータを配列motoに格納して、一列目にある勘定科目をキーにし、情報(科目名や他システムでの科目名)を、任意のセル(他シートを含み、科目名表記が始まるところをActivecellにしてマクロを実行すると、リスト(moto)の何列目の情報を勘定科目から見て何列目に表示したいかをInputboxで変数として格納し、出力をする

というコーディングをしているのですが、motoに格納したデータのあるシート内は成功するのですが他シートだとうまくいきません。

どのコードが原因なのかお教えいただけますでしょうか
よろしくお願いいたします。

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

[11398]補講9-たった1行のコードでセルのデータを配列に投入する

2019-05-11 17:08:57 田中 宏明さんからの投稿です。

配列を研究し、「二次元配列の縦横入替」を知りました。
Excel自体のTranspose関数を呼び出すことで実現。Debug.Printで結果が同じになるので、うまくいっているようです。

実務で活用できそうな事例が思い当たりませんが、第一引数の行番号をRedim Preserveできない場合、縦横入替で 第二引数の行番号をRedim Preserveできることくらいでしょうか。

Sub Sample9_Transpose()
    Dim vList As Variant
    vList = Range("B4").CurrentRegion
    
    Dim c As Long
    'インデックスは1から!
    '第一引数が行番号!
    '表ではタイトルも含まれてしまうのでので注意!
    For c = LBound(vList, 1) To UBound(vList, 1)
        Debug.Print vList(c, 1), vList(c, 2), vList(c, 7)
    Next
    
    Debug.Print vbNewLine
    Dim v2List As Variant
    '二次元配列の縦横を入れ替え
    'インデックスは1から!
    '第一引数が行番号から列番号に変更される!
    v2List = Application.WorksheetFunction.Transpose(vList)
    For c = LBound(v2List, 2) To UBound(v2List, 2)
        Debug.Print v2List(1, c), v2List(2, c), v2List(7, c)
    Next
End Sub

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

[11382]動的配列1-動的配列の基本

2019-05-02 17:19:36 桜井さんからの投稿です。

小川先生

GWに巣ごもりでオンライン講座受講、配列をマスターしたら業務の汎用性が高く実務落とし込みに気合を入れております。

配列に格納したデータをシートに記入する際、
格納したデータの値の小さいものから順に行いたいというのは可能でしょうか。それとも記入したあとセル範囲内をソートすべきでしょうか。

宜しくお願いいたします。

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

[11095]連想配列3-Microsoft Scripting Runtimeのへの参照設定

2019-02-09 23:05:58 牧野千秋さんからの投稿です。

1つめ
Dim LIST As Scripting.Dictionary
Set LIST = CreateObject(“Scripting.Dictionary”)

このとき、”Scripting.Dictionary”に””がつくのはなぜ?
当然小文字で入力しても大文字にならない

2つめ
テキスト通りに書いたのですが
dic.Item(KEY) = dic.Item(KEY) + 1
で型が一致しません、と出ます。
ここは「すでにキーにあるから、配列を1段下げるよ」という意味ではないのでしょうか。

Sub ディクショナリ()
    Dim dic As Scripting.Dictionary
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim MR As Long
    Dim i As Long
    Dim KEY As String
    Dim NAM As String
    
    MR = Sheets("基礎データ").Range("A" & Rows.Count).Row
        For i = 2 To MR
            KEY = Sheets("基礎データ").Range("A" & i).Value
            NAM = Sheets("基礎データ").Range("B" & i).Value
            
            If dic.Exists(KEY) Then
                dic.Item(KEY) = dic.Item(KEY) + 1
            Else
                dic.Add (KEY), (NAM)
            End If
        Next
    
    Dim VKEYS As Variant
    VKEYS = dic.Keys
        For i = LBound(VKEYS) To UBound(VKEYS)
            Sheets("出力").Range("A1").Offset(i).Value = VKEYS(i)
            Sheets("出力").Range("B1").Offset(i).Value = VKEYS(i)
        Next
    
End Sub

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

[11090]動的配列1-動的配列の基本

2019-02-09 17:34:26 受講生さんからの投稿です。

講座を再度見直して理解を深めようとしています。見直すと「あっ!忘れかけてた」と思わせる内容が時々出てきます。復習しやすいオンライン講座の魅力だと感じています。

講義の内容からかなり脱線したことなのですが発展編2動的配列を復習中に感じたことです。塾長は受講者の質問を聞くとき集中して聞き取っているように感じます。自分は人の話を違う形で受け取ってしまうことや、何を言わんとしているか感じ取って先走って言葉を返してしまうこと多々あります。ダメなことだと思っているがやってしまいます…。塾長は人の話を聞く際、意識していることはありますか?
講座の内容とずれた質問なのでご教授いただければで…。

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

[10861]多次元配列のサイズを調べる

2018-12-29 11:21:27 ふんわりさんからの投稿です。

とても分かりやすく何度もいろんなコードで試しています。
一つ教えて頂きたいのですが、多次元動的配列で、最後のインデックス
しか変更できないという事ですが、最後のインデックス、最終行
は変動する為、変数にする事は可能でしょうか?
多次元動的配列で最終行が常に変動する場合、ないかもしれませんが、
もしやり方があるならば簡単な例を教えて頂けるとありがたいです。

例 Dim 数字() As Variant
Dim i As Long
i=Cells(Rows.Count,”A”).End(xlup).Row
Redim 数字(1, i )
変数に変数を重ねてる為、これは、もちろんうまくいきませんでした。
  

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

[10859] 配列操作の便利関数、オプション、その他

2018-12-28 21:21:18 ふんわりさんからの投稿です。

すみません、配列の内容とは少しそれてしまうかもしれませんが、
Chap02-61のコードですが、「Call」を付けずに他のサブプロシージャ―「Sub ExeKensaku()」を呼び出す事が出来るのは画期的でした。
それならば、「Call」を付ける時とそうでない時の違い、使い分けというのはあるのでしょうか?ただ単に、どちらでも可能という事でしょうか?

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

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

2018-12-27 05:27:11 わかやまさんからの投稿です。

小川様

お返事ありがとうございます。
メールのリンクから、アンケートフォームの入力いたしました。
どうぞよろしくお願いします。

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

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

2018-12-26 15:28:35 わかやまさんからの投稿です。

小川様

いつもありがとうございます。
演習問題の模範解答の有無についての質問です。
ダウンロードしたデータのhatten2、SampleData、Enshuの中にあるexecise-sogo3以降の模範解答はどこかにございますでしょうか?
どうぞよろしくお願いします。

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

[10806]動的配列3-演習

2018-12-18 22:40:54 こんちゃんさんからの投稿です。

最近業務で二次元配列を使用しました。悩みどころは投稿されてる方々と同じでしたので自己解決しました笑。わかりやすい二次元配列の解説ありがとうございました。勉強になりました!

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

[10712] 式と戻り値3-「式」と「戻り値のデータ型」

2018-11-30 03:46:51 わかやまさんからの投稿です。

小川様

いつもありがとうございます。
以下のコードですが、セルA1には3という数値が入っている状態で実行するとイミディエイトウインドウで3と表示されます。
Sub hairetu()
Dim ary(0) As Range
Set ary(0) = Range(“A1”)
Debug.Print ary(0)
End Sub
上記のコードでは、ary(0)にrange(“A1”)への参照を返していることになるとおもうのですが、なぜセルの値を返すのでしょうか?
range(“A1”)はオブジェクトなので、その参照ということはセルの値を取得するという意味なのでしょうか?

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

[10685] 式と戻り値6-戻り値を返す式、戻り値を返さない式

2018-11-09 07:09:10 わかやまさんからの投稿です。

小川様

いつもありがとうございます。
他言語で申し訳ないのですが、、、pythonだと関数を定義するときに
returnのあるなしで値がかえったりかえらなかったりします。
def func1(a,b):
c=a+b
func(2,200)

def func2(a,b):
c=a+b
return c
func2(2,200)

func2の場合は202という出力があります。func1の場合はa+bの計算のみ実行するが、結果を表示しないということで、今回のテーマと似ていると感じたので、投稿させていただきました。

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

[10366]連想配列2-Dictionaryオブジェクトの使用例

2018-08-09 23:09:25 mokoさんからの投稿です。

>戻り値は、「Variant()」でしたよね。
つまり、戻り値は、「Variant型」でなく、「Variant型の配列」です。こういうところ、しっかり詰めてください。

型を調べたときにVariantにカッコがついているのが不思議だったのですが、配列という意味だったのですね。
理解しました。ありがとうございます。

>要は、「そういう言語の仕様だ」ということです。(*)

redimについても疑問もすっきりしました(^^♪
そっちのほうが都合がよいということですね。

配列はまだ全然慣れていなくて、どういうときに使うとよいのか?とさぐりさぐりテストしている段階です。
自信をもって使えるようになるまで、まだ時間がかかりそうですがおもしろがりつつ頑張ります!


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

[10334]動的配列3-演習

2018-08-07 05:09:05 みねさんからの投稿です。

とても良く理解出来ました。
ありがとうございます。

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

[10332]連想配列2-Dictionaryオブジェクトの使用例

2018-08-07 00:03:07 mokoさんからの投稿です。

小川先生
ヒントのコード、ありがとうございます。

変数にも配列を入れられるとは思っていなかったので、とても驚きました。
配列は静的配列か動的配列かで宣言するものだと思いこんでました。
今回のようにdic.Keysやdic.Itemsで作った配列をそのままいれるのであれば、配列よりも変数で宣言したほうがシンプルでわかりやすいと思いました。
・・・が、疑問1と疑問2の動的配列で宣言してもエラーがでないまま動いたことについては未だに理解できていません。((+_+))

疑問3は理解しました。
dic.Keysもdic.ItemsもTypeNameで型を調べてみたらどちらもVariantでした。だから他の型で宣言するとエラーがでたんですね。
型が違うというエラーがでたらTypeNameで調べて修正していきます。

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

[10330]動的配列3-演習

2018-08-06 14:58:22 みねさんからの投稿です。

早速の返信ありがとうございます。
最小値の説明はわかりました。
最大値が↓の2つで何故違うのかがわかりません。

UBound(vList, 1) → 1

UBound(vList, 2) → 31

35ページの
点線の2列とも最大値は31番目だと思うのですが

UBound(vList, 1) → 1

になってしまう理由がわかりません。
よろしくおねがいします。

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

[10324]動的配列3-演習

2018-08-06 05:41:47 みねさんからの投稿です。

テキスト35ページの

LBound関数やUnbound関数の第二引数は、「配列の、左から数えて何次元目のところの最小値、最大値を求めるか」を指定するための引数です。
なので、この例の場合だと、計算結果の例は、以下のようになります。
LBound(vList, 1) → 0
UBound(vList, 1) → 1
LBound(vList, 2) → 0
UBound(vList, 2) → 31

というのが理解不能です。
二次元だと

1列目2列目ともにの最小の値が1 最大が31
だと思うのですが

なぜ
LBound(vList, 1) → 0
UBound(vList, 1) → 1
LBound(vList, 2) → 0
UBound(vList, 2) → 31

こうなってしまうのかわかりません。
具体的に35ページの青い点線でいう
どこからどこまでの範囲を 1とした場合と2とした場合で
指すのかおしえていただけるとありがたいです。
よろしくお願いします。

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

[10307]連想配列2-Dictionaryオブジェクトの使用例

2018-08-02 18:07:23 mokoさんからの投稿です。

小川先生
いつもお世話になっています。

KeysメソッドとItemメソッドも配列を返すのに、変数で宣言するのがしっくりきていません。
配列を返すのなら配列を宣言するのでは?と思い、試しにやってみたらうまく動いたのですが、動いたら動いたでredimしてないのに?とか
配列の型は?とかいろいろ疑問が出てきました。

連想配列は通常の配列とは違うから・・・という風に思っておけばいいのでしょうか?

Sub test()
    Dim dic As Scripting.Dictionary
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim c As Long
    Dim cMx As Long
    Dim st As String
    cMx = Range("A" & Rows.Count).End(xlUp).Row
    
    For c = 1 To cMx
        st = Range("A" & c).Value
        If dic.Exists(st) Then
            dic.Item(st) = dic.Item(st) + 1
        Else
            dic.Add (st), 1
        End If
    Next
    
    '★疑問1 vKeysとvItmsを動的配列で宣言しても同じ結果になった
    '★疑問2 配列のサイズがわからなかったのでredimしていないがエラーが出なかった
    '★疑問3 vKeysの型をstring,vItmsの型をlongにしたら『型が一致しません』エラーになる
    Dim vKeys() As Variant
    Dim vItms() As Variant
    
    vKeys() = dic.Keys
    vItms() = dic.Items
    
    For c = LBound(vKeys) To UBound(vKeys)
        Range("C1").Offset(c).Value = vKeys(c)
        Range("D1").Offset(c).Value = vItms(c)
    Next
End Sub

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

[10293]補講1-ディクショナリーオブジェクトのさらなる活用

2018-07-28 06:50:20 田中 宏明さんからの投稿です。

連想配列で共通キーに対する複数データの合計値を算出するために連想配列の配列を定義してみました。
もっと良いやり方があるとは思いますが、うまく動いたのでご報告します。

Public Sub Dic_Closs_Shukei()

    Dim Dic(2) As Object  '連想配列の配列を定義
    Set Dic(0) = CreateObject("Scripting.Dictionary")
    Set Dic(1) = CreateObject("Scripting.Dictionary")
    Set Dic(2) = CreateObject("Scripting.Dictionary")

    Dim Product As String '連想配列の配列共通キー
    Dim Cnt As Long       '連想配列カウンター
    
    With Worksheets("抽出データ")
        For Cnt = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
            Product = Trim(Left$(.Cells(Cnt, "A").Value, 7))
            'ブランク以外で、データフォーマット条件に合致するキーのデータを各配列に入れる
            If Product <> "" And Mid$(Product, 4, 1) = "-" Then
                If Dic(0).Exists(Product) Then
                    '2回目以降に見つかった場合
                    Dic(0).Item(Product) = Dic(0).Item(Product) + .Range("G" & Cnt).Value
                    Dic(1).Item(Product) = Dic(1).Item(Product) + .Range("C" & Cnt).Value
                    Dic(2).Item(Product) = Dic(2).Item(Product) + .Range("D" & Cnt).Value
                Else
                    '最初に見つかった場合
                    Dic(0).Add (Product), .Range("G" & Cnt).Value
                    Dic(1).Add (Product), .Range("C" & Cnt).Value
                    Dic(2).Add (Product), .Range("D" & Cnt).Value
                End If
            End If
        Next Cnt
    End With
    
    Dim Vkeys As Variant
    Vkeys = Dic(0).keys

    Dim CntforDic As Long '連想配列カウンター
    For CntforDic = LBound(Vkeys) To UBound(Vkeys)
        Range("A" & 4 + CntforDic).Value = Vkeys(CntforDic)
        Range("B" & 4 + CntforDic).Value = Dic(0).Item(Vkeys(CntforDic))
        Range("C" & 4 + CntforDic).Value = Dic(1).Item(Vkeys(CntforDic))
        Range("D" & 4 + CntforDic).Value = Dic(2).Item(Vkeys(CntforDic))
    Next CntforDic
    
    Set Dic(0) = Nothing
    Set Dic(1) = Nothing
    Set Dic(2) = Nothing

End Sub

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

[10193]補講7-ウォッチ式の活用

2018-07-01 17:00:27 田中 宏明さんからの投稿です。

初めてウオッチ式「式の内容が変化したときに中断」を使い、デバックで役に立つことを実感できました。

いつもは、マクロテスト段階で、直感的に正しい結果が得られた場合、少し不安に思ってもスルーする場合がありますが、重要な変数に着目し、中断したときの値を確認してみると、想定通りに動いていることが確認できました。

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

[10153]補講7-ウォッチ式の活用

2018-06-24 06:23:50 田中 宏明さんからの投稿です。

ウォッチ式がオブジェクト型変数でも使えるとは驚きました。
for each 構文でステップ実行する場合のデバック効率が格段に
良くなりそうです。

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

[10074]連想配列2-Dictionaryオブジェクトの使用例

2018-06-05 22:46:42 近藤さんからの投稿です。

最初すごさがピンときませんでしたが、
理解すると驚き!めちゃめちゃ強力な技ですね!!!

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

[9956]多次元配列のサイズを調べる

2018-05-12 21:06:16 こんちゃんさんからの投稿です。

動画を見ていったら解決しました笑
わかりやすかったです!

連投失礼しました。

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

[9944]多次元配列のサイズを調べる

2018-05-09 13:22:27 こんちゃんさんからの投稿です。

こんにちは

こちらの動画では2列のデータを二次元に格納しておりますが、3列目、四列目を配列に格納したい場合は次元を増やすのでしょうか。

実務で3列目、四列目の値を格納したいシーンがあります。
自分でちょろちょろやってみましたがどうにもうまくいきません。
二次元配列でも3列目、四列目のデータを格納できるでしょうか。

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

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

2018-05-07 18:46:45 受講生さんからの投稿です。

小川先生
今回は、コース末の課題の先生の見本回答(下に添付)でのredimの使いかたの質問です。これは、テキストで習った書き方と違います。記述の量もそこそこありますが、この書き方のメリットは、(テキストの方式対比で)どういうところなのでしょうか?両方の方式を学んで置くべきなのでしょうか?
ReDim var(2, 0)
For c = 2 To Range(“F65536”).End(xlUp).Row
var(0, UBound(var, 2)) = Range(“E” & c).Value
var(1, UBound(var, 2)) = Range(“F” & c).Value
var(2, UBound(var, 2)) = Range(“G” & c).Value
ReDim Preserve var(2, UBound(var, 2) + 1)

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

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

2018-05-03 10:48:06 田中 宏明さんからの投稿です。

たくさんマクロを書いていると、モジュールレベル変数を使うことのデメリット(修正時に対応範囲が広くなる)を実感できるようになりました。

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

[9880]多次元配列の基本

2018-04-30 23:19:14 受講生さんからの投稿です。

二次元配列の説明に関してですが、
ホワイトボードでの手書きの説明が、
縦方向に33、という書き方をしているので、
コードの書き方もvlist(33,1)としたほうが、
頭の整理がしやすいと思ったのですが、
いかがでしょうか。

ただ、vlist(0,cnt)=という部分で値の設定をしているので、
配列というのは、
実際の表が縦方向に伸びているのか、横方向に伸びているのかは関係なく、
コードの通りに配列ができるのだな、ということを認識できましたが、
そのような理解で合ってますでしょうか?

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

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

2018-04-30 22:48:02 受講生さんからの投稿です。

モジュールレベル変数というのは、個人的には初めて見た変数なのですが、
どこで出てきたお話でしょうか?
出てきてたのに見逃してたかなと思いまして。

また、メンテナンスをするときに、
モジュールレベル変数は変更箇所が多い、というお話ですが、
Module2のほうも、(動画では触れられていませんが)
一番下のsub soujiirai2の部分も変更しなければならないと思うので
結局、変更箇所は同数になるような気がするのですが
違いますでしょうか?

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

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

2018-04-29 23:56:09 受講生さんからの投稿です。

小川先生
毎回お世話になります。発展編2の巻末の演習やってみました。添削、コメントよろしくお願いします。ファイルひとつずつしか貼れないみたいですので、4回に分けて送らせていただきます。

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

12>

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

 

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

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

トップへ