VBAでオブジェクト指向 クラスの中にクラス Rangeっぽいオブジェクト等を作りたい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 709
前提・実現したいこと
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」は上位階層を作る予定がないので出来ないがそれ以下であれば
上位のオブジェクトのプロパティを使って
'使う時
~~~~略~~~~
set MR as MyRng
print MR.Item(1,4).Borders(xlEdgeLeft).Weight
'MyRangeクラスの中
private Cell__ as MyCell
~~~~略~~~~
property Get Item(Byval RowIndex,byval ColumnIndex)as MyCell
Item=Cell__(RowIndex,ColumnIndex)
End Property
'MyCellクラスの中
~~~~略~~~~
Property Get Borders_() As MyBorders
Borders_ = Borders__
End Property
Property Get Borders_(byval Index as XlBordersIndex) As MyBorder
BorderS_ = Borders__.Item(Index)
End Property
みたいな感じで引数(インデクス)の有り無しで返すオブジェクトが
変更出来たらなぁ...
っと思ったのですがうまく行きませんでした.....。
補足情報(FW/ツールのバージョンなど)
Excel 2013以降
Win10 64bit Home と Pro
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
書かれているコードから、オーバーロードのようなことをしたいのだと思われます。
VBAではオーバーロードはできないですが、無理矢理やるとしたら以下のような感じでしょうか。
- 引数を省略可能・返り値の型をObject型にして、引数の有無で返すオブジェクトを変更する(例:Worksheet.OLEObjectsメソッド)
- 複数としても単数としても使えるクラスを作成する(例:Rangeオブジェクト)
Copy
をどのように使っているかわかりませんが、Range.Value(xlRangeValueXMLSpreadsheet)
で代用できないでしょうか?
RangeのValueプロパティは引数を指定できるプロパティで、xlRangeValueXMLSpreadsheet
を指定すると、セルの値、罫線、色などの基本的な情報を取得、設定することができます。
(条件付き書式などExcelに依存した機能はダメですが、単純な書式なら取得、設定できます)
Sub Sample()
'コピー元のセル
Dim srcRng As Excel.Range
Set srcRng = Range("A1")
'適当に書式設定
With srcRng
.Interior.Color = vbYellow
.Font.Color = vbRed
.BorderAround XlLineStyle.xlContinuous, xlThin
.Value() = "ABC"
End With
'貼り付け先のセル
Dim destRng As Excel.Range
Set destRng = srcRng.Offset(2)
'書式などコピー(要サイズ合わせ)
destRng.Value(xlRangeValueXMLSpreadsheet) = _
srcRng.Value(xlRangeValueXMLSpreadsheet)
'xlRangeValueXMLSpreadsheet
' = Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet
' = 11
End Sub
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/07/18 08:21
すばらしいです。
ありがとうございました。