dポイントプレゼントキャンペーン実施中!

下記マクロは、列を指定してサブプロシージャColumnTreatへ引数として渡し、処理するものです。処理内容は質問と関係ありません。起動したところ 、★位置で「ユーザ定義型は定義されてません」Columnはオブジェクトではないのですか?そういえば今まで見たことない??と思い質問しました。この形式は出来ないのですか?

Sub test()
 Call CleanUp(colmns("A"))
End Sub

Sub ColumnTreat(ByRef Tcol As Column)     ’★
 Dim c As Range
 With Tcol
  For Each c In Range(.Cells(1), .Cells(Rows.Count).End(xlUp))
   c.Value = 1 'セルごとの処理
  Loop
 End With
End Sub

列指定をLong (1)あるいはString ("A")で渡す方法もありますが、Worksheetを別途指定する必要があるので、出来れば避けたいです。何かいい方法はないでしょうか?

A 回答 (1件)

こんにちは。



Column というのは、Range オブジェクトのプロパティですね。
データ型は、Long型です。

一応、コードのミスを訂正しておきます。
'//
 Call CleanUp(colmns("A"))
   ↓
 Call ColumnTreat(Columns("A"))   '質問内容から、変更します。ただし、ここは、もうひとつ工夫が必要かもしれません。
 
''Range型で渡そうが、数値型で渡そうが、文字型で渡そうが、間違いがなければ、結果オーライだと思います。
''しかし、状況にも依存しますが、Rangeの変数(例:Rng) で渡すのが、ベターだと思います。Columns("A")のような、リテラルな方法ではなく、初心者の人がなにげに無茶する方法で、Sheet を含めたRange型変数が、実は、そこには結構テクニックがあって、何かと簡単にさせてくれます。悪い方法は、文字型のアドレスです。再度、Rangeを指定しなければならないから二度手間です。

'//
Sub ColumnTreat(ByRef Tcol As Column)     ’★
    ↓
Sub ColumnTreat(ByRef Tcol As Range)

'//
  For Each c In Range(.Cells(1), .Cells(Rows.Count).End(xlUp))
   c.Value = 1 'セルごとの処理
  Loop
      ↓
 For Each c In Range(.Cells(1), .Cells(Rows.Count).End(xlUp))
   c.Value = 1 'セルごとの処理
 Next c   'Loop ではなく、Next
'//
    • good
    • 1
この回答へのお礼

ありがとうございます。
Rangeを引数にして解決しました。

お礼日時:2015/07/31 19:54

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