プロが教えるわが家の防犯対策術!

クラスモジュール

Public 売上日 As Variant
Public 商品コード As String
Public 商品名 As String
Public 担当者名 As String
Public 金額 As Long

Public Property Get Self() As sale

Set Self = Me
End Property

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
標準モジュール

Enum 列
売上日 = 1
商品コード = 2
商品名 = 3
担当者名 = 4
金額 = 5
End Enum

Sub 出力②()
Dim TableRange As Range
Dim TableValue As Variant
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Sheet1")


'表のデータを取得する
With ThisWorkbook.Worksheets("Sheet1").Range("A1").CurrentRegion
Set TableRange = .Resize(.Rows.Count - 1).Offset(1)
End With
'表のデータを配列に取得する
TableValue = TableRange.Value

Dim sale As New Collection

Dim i As Long
maxrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To maxrow
With New sale

.売上日 = sh.Cells(i, 列.売上日)
.商品コード = sh.Cells(i, 列.商品コード)
.商品名 = sh.Cells(i, 列.商品名)
.担当者名 = sh.Cells(i, 列.担当者名)
.金額 = sh.Cells(i, 列.金額)

sale.Add .Self
End With
Next

Dim p As sale

For Each p In sale

If p.金額 >= 600000 Then
Debug.Print p.担当者名; p.商品名; p.売上日; p.商品コード
End If

Next
End Sub

このコードを書籍とNETの情報で作成しました。
作動します。


ーーーーーーーーーーーーーーーーーー
If p.金額 >= 600000 Then
Debug.Print p.担当者名; p.商品名; p.売上日; p.商品コード
End If
ーーーーーーーーーーーーーーーーーー


この部分をセルに転記したいのです。

試したこと

Cells(i, 1) = p.商品名(i)

エラー 引数の数が一致しません。


For j = 0 To Ublond(TableValue)
Cells(j + 20, 1) = TableValue(j)

エラー sub または、functionが定義されていません


上記のコードで私の認識では、すでに配列に格納されているとおもうのですが、
どのように転記したらいいのでしょうか?

お手数ですが、ご教示をお願いします。

A 回答 (3件)

No.2です。



殆ど被っちゃいましたね。

クラスモジュールを弄ってみたいならVBAよりVBやVC#の方がまだ扱えたと感じますよ。
Excelは独自の機能がありすぎて混乱(不要に感じる?)しましたし。
敢えて言えばユーザーフォームで同じコントロールを複数配置した際の使い分けとかですかね。
    • good
    • 0

変数:TableValue は2次元配列である事とセル範囲に0行や0列がない点で、For j = の最初は1である。


Ublondについては綴りミスで UBound(TableValue, 1)が正解かと。

ちなみに初級レベルなのでクラスモジュールは???ですが、見た感じクラス名を標準モジュール内で宣言されてないようにも思えましたが、私の老眼が原因なのかな?

>Debug.Print p.担当者名; p.商品名; p.売上日; p.商品コード

ここはクラスモジュールでも個々に宣言しているので、

>p.商品名(i)

配列などと同じようにインデックスはないようにも思えますが・・・(自信なし!!!!!!)

>For j = 0 To Ublond(TableValue)
>Cells(j + 20, 1) = TableValue(j)

For j = 1 To UBond(TableValue, 1)
Cells(j + 19, 1) = TableValue(j, 1)

になるのかな?
    • good
    • 0
この回答へのお礼

返信おくれまして、申し訳ありません。
めぐみん様
いつもありがとうございます。
やってみます。

お礼日時:2020/07/10 15:29

こんにちは



>この部分をセルに転記したいのです。
セルから読み込んでいるだけなので、すでにシートに記入されているものと同じですけれど・・・?

ざっと見た限り、エクセルの機能のフィルタをかければ一発ではないでしょうか?
(抽出したいのであれば、その状態でコピペ)
あるいは条件付き書式で、強調表示になるようにしておくとか。(これならマクロ不要)


そもそも、なぜご提示のような回りくどい記述になっているのかが不明です。
クラスと配列の二重で表をコピーしていて、しかも配列の方は使っていないみたいだし・・・
処理内容からすれば、わざわざクラスや配列に取り込む必要も無いようにも思えますが…
(データ数が多くて処理速度を上げるためにメモリ内で処理したいのなら、むしろ配列でまとめて読み書きするなどにしないと意味がありません。)

>Cells(i, 1) = p.商品名(i)
左辺に関しては、変数i の値をどのように制御しているのでしょうか?
右辺に関しては、p.商品名は配列になってはいません。(ご自分で定義しているはず)

>For j = 0 To Ublond(TableValue)
>Cells(j + 20, 1) = TableValue(j)
「Ublond」は(多分)「UBound」の間違え
TableValueは二次元配列になっているはずです。
    • good
    • 0
この回答へのお礼

クラスモジュールを理解したくて勉強していました。
回答ありがとうございました。

お礼日時:2020/07/09 10:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!