Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11334 / 13646 ツリー ←次へ | 前へ→

【16672】セル範囲を変数で表したいのですが・・・ Rika☆ 04/8/5(木) 15:47 質問[未読]
【16673】Re:セル範囲を変数で表したいのですが・・・ IROC 04/8/5(木) 15:52 回答[未読]
【16677】Re:セル範囲を変数で表したいのですが・・・ Rika☆ 04/8/5(木) 17:31 お礼[未読]
【16675】Re:セル範囲を変数で表したいのですが・・・ Asaki 04/8/5(木) 15:58 回答[未読]
【16678】Re:セル範囲を変数で表したいのですが・・・ Rika☆ 04/8/5(木) 17:33 お礼[未読]
【16679】Re:セル範囲を変数で表したいのですが・・・ Asaki 04/8/5(木) 20:26 発言[未読]

【16672】セル範囲を変数で表したいのですが・・・
質問  Rika☆  - 04/8/5(木) 15:47 -

引用なし
パスワード
   はじめまして。VBAはじめて半年ほどの者です。
今回、以下のようなマクロを組みました。
セル範囲Range("A19:D40")の中のデータで、
別テーブル内、Aの列のデータがあれば、Bの列のデータに置き換える、というマクロです。
以下のコードで、正常に動作しました!


Sub 範囲内で置き換え()
  Dim mr As Range
  Dim A(13) As String
  Dim B(13) As String
  Dim i As Integer
   
  
For i = 0 To 13
  A(i) = Cells(i + 2, 3)
  B(i) = Cells(i + 2, 4)
  
  For Each mr In ActiveSheet.Range("A19:D40")
    If mr.Value = A(i) Then
      mr.Value = B(i)
    End If
  
  Next
Next
End Sub


これは、静的配列なのですが、動的配列にしたくて、変数iを、
そのときのテーブルの行数によって変わるように、

Selection.CurrentRegion.Select
Selection.End(xlDown).Activate

i = ActiveCell.Row

とすると、テーブルの行数が変わっても動作するようになりました。

私がしたいのはこれからです。

セル範囲、Range("A19:D40")が、そのときによって範囲(行数)が変わるばあい、
Range(Cells(19, 1), Cells(4, i))・・・iは上記のように、行数を取得したいのですが、
エラーがでてうまく動きません。
このように、セル範囲の行数がそのときによって変わる場合はどのようにしたらよいのでしょうか?
すみませんが、助言いただければと思います。よろしくお願いいたします!

【16673】Re:セル範囲を変数で表したいのですが・...
回答  IROC  - 04/8/5(木) 15:52 -

引用なし
パスワード
   >Range(Cells(19, 1), Cells(4, i))・・・iは上記のように、
>行数を取得したいのですが、
>エラーがでてうまく動きません。

何エラーでしょうか?

ちなみに
Range(Cells(19, 1), Cells(4, i)) のときは、
    ↑      ↑
これらのCellsもシートを指定する必要があります。
指定しないと、アクティブシートが対象になりますが、
その点は問題ないですか?

【16675】Re:セル範囲を変数で表したいのですが・...
回答  Asaki  - 04/8/5(木) 15:58 -

引用なし
パスワード
   こんにちは。

>Range(Cells(19, 1), Cells(4, i))
だと、Cells(19, 1) は A19 ですが、Cells(4, i) は i列の4行目になりますよ。
i にデータ最終行番号が入っているとして、
Range(Cells(19, 1), Cells(i, 4))
Range("A19:D"&i)
のいずれかになるかと思いますが、多分
i = ActiveCell.Row + Selection.Rows.Count -1
ではないかと。

【16677】Re:セル範囲を変数で表したいのですが・...
お礼  Rika☆  - 04/8/5(木) 17:31 -

引用なし
パスワード
   ▼IROC さん:
お答えいただきありがとうございます(^∀^)

>何エラーでしょうか?
実行時エラー、
アプリケーション定義またはオブジェクト定義のエラーです

と出ます。。。


>ちなみに
>Range(Cells(19, 1), Cells(4, i)) のときは、
>    ↑      ↑
>これらのCellsもシートを指定する必要があります。
>指定しないと、アクティブシートが対象になりますが、
>その点は問題ないですか?

はい、このシートをアクティブにするように、記述しています。

しかし・・・・・実はすごく初歩的な間違いに気づきました!!
Range(Cells(19, 1), Cells(4, i)) の、行と列を逆に考えていたのです(^^;)
いろいろ悩んでて気づきました(>〜<)
お力を貸していただいたこと、感謝いたします!

【16678】Re:セル範囲を変数で表したいのですが・...
お礼  Rika☆  - 04/8/5(木) 17:33 -

引用なし
パスワード
   ▼Asaki さん:
お答えいただき、ありがとうございます!(^∀^)

>>Range(Cells(19, 1), Cells(4, i))
>だと、Cells(19, 1) は A19 ですが、Cells(4, i) は i列の4行目になりますよ。

はっ!(`д´;)そうなのです、、、いろいろ考えていて気づきました。
列と行を逆に書いていました!

>i にデータ最終行番号が入っているとして、
>Range(Cells(19, 1), Cells(i, 4))
>Range("A19:D"&i)
>のいずれかになるかと思いますが、多分
>i = ActiveCell.Row + Selection.Rows.Count -1
>ではないかと。

ハイ、そのように記述すれば、うまくいきました!
お力を貸していただけたこと、感謝しております☆ありがとうございました!

【16679】Re:セル範囲を変数で表したいのですが・...
発言  Asaki  - 04/8/5(木) 20:26 -

引用なし
パスワード
   解決されたようで、もう見ていらっしゃらないかもしれませんが。

>Selection.CurrentRegion.Select
>Selection.End(xlDown).Activate
>i = ActiveCell.Row
だと、正しく最終行がとれますね。

>i = ActiveCell.Row + Selection.Rows.Count -1
は間違ってます。
失礼しました。m(_ _)m

お詫びに、違う書き方で書いてみます。
ちょっと良く解らないところがあるので、そこは想像ですが。

Sub 範囲内で置き換え2()
  Dim mr As Range
  Dim i  As Long
  Dim v  As Variant
  Dim c  As Range

  v = Cells(2, 3).Resize(14, 2).Value
  Set c = Cells(19, 1).CurrentRegion

  For i = 1 To 14
    For Each mr In c
      If mr.Value = v(i, 1) Then mr.Value = v(i, 2)
    Next mr
  Next i

  Erase v
  Set c = Nothing
End Sub

ループカウンタはLong型の方が速いそうです。

11334 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free