質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

1回答

776閲覧

VBAでオブジェクト指向 クラスの中にクラス Rangeっぽいオブジェクト等を作りたい

kamikazelight

総合スコア305

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2018/07/17 11:26

前提・実現したいこと

Rnageっぽいクラスを作り書式や値のコピーに
対応させたい
--以降「っぽい」は省略--

理由(蛇足)

Excel VBA で帳票のシステムを作成していて
大体出来上がったところで
上司「クリップボード(Excelの機能で履歴として見れる)に変なもの(システムで行のコピーなどをした履歴)が出ていて邪魔だから出ないようにして」っと言われてしまい
Copyコマンドが使えなくなってしまいました。

今後もCopyコマンドが使えなさそうなので
疑似的なRangeっぽいクラス等を作りたいです

発生している問題

とりあえずRangeはCellの塊として考えて
作ろうとしたのですが
「Range(1,4)」の様に使えるように
単純にRangeはCellの配列を返すようにしようとしたところで
Range.count等のRangeのプロパティーが
使えないことに気づきました
Itemプロパティーを作り
「Range.Item(1,4)」の様にしようかと思ったのですが
Rangeの下層にあるクラスも全く同じ様になってしまい
Itemまみれになってしまうので
出来ることなら避けたいです。

何か手段はないでしょうか?

あがいたけどダメだった策

「Range」は上位階層を作る予定がないので出来ないがそれ以下であれば
上位のオブジェクトのプロパティを使って

vba

1'使う時 2~~~~略~~~~ 3set MR as MyRng 4 5print MR.Item(1,4).Borders(xlEdgeLeft).Weight 6 7'MyRangeクラスの中 8private Cell__ as MyCell 9~~~~略~~~~ 10property Get Item(Byval RowIndex,byval ColumnIndex)as MyCell 11 12 Item=Cell__(RowIndex,ColumnIndex) 13End Property 14 15'MyCellクラスの中 16~~~~略~~~~ 17Property Get Borders_() As MyBorders 18 Borders_ = Borders__ 19End Property 20 21Property Get Borders_(byval Index as XlBordersIndex) As MyBorder 22 BorderS_ = Borders__.Item(Index) 23End Property 24

みたいな感じで引数(インデクス)の有り無しで返すオブジェクトが
変更出来たらなぁ...
っと思ったのですがうまく行きませんでした.....。

補足情報(FW/ツールのバージョンなど)

Excel 2013以降
Win10 64bit Home と Pro

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

書かれているコードから、オーバーロードのようなことをしたいのだと思われます。
VBAではオーバーロードはできないですが、無理矢理やるとしたら以下のような感じでしょうか。

  • 引数を省略可能・返り値の型をObject型にして、引数の有無で返すオブジェクトを変更する(例:Worksheet.OLEObjectsメソッド)
  • 複数としても単数としても使えるクラスを作成する(例:Rangeオブジェクト)

Copyをどのように使っているかわかりませんが、Range.Value(xlRangeValueXMLSpreadsheet)で代用できないでしょうか?

RangeのValueプロパティは引数を指定できるプロパティで、xlRangeValueXMLSpreadsheetを指定すると、セルの値、罫線、色などの基本的な情報を取得、設定することができます。
(条件付き書式などExcelに依存した機能はダメですが、単純な書式なら取得、設定できます)

vba

1Sub Sample() 2 3 'コピー元のセル 4 Dim srcRng As Excel.Range 5 Set srcRng = Range("A1") 6 7 '適当に書式設定 8 With srcRng 9 .Interior.Color = vbYellow 10 .Font.Color = vbRed 11 .BorderAround XlLineStyle.xlContinuous, xlThin 12 .Value() = "ABC" 13 End With 14 15 '貼り付け先のセル 16 Dim destRng As Excel.Range 17 Set destRng = srcRng.Offset(2) 18 19 '書式などコピー(要サイズ合わせ) 20 destRng.Value(xlRangeValueXMLSpreadsheet) = _ 21 srcRng.Value(xlRangeValueXMLSpreadsheet) 22 23 'xlRangeValueXMLSpreadsheet 24 ' = Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet 25 ' = 11 26 27End Sub

投稿2018/07/17 12:18

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/07/17 23:21

朝一番で試させてもらいました。 すばらしいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問