アプリ版:「スタンプのみでお礼する」機能のリリースについて

1.AI8:AI71の範囲に記入してある文字【有】を全検索する
※該当範囲には,数式で【有】or【無】or【(空白)】が記入されています。
2.該当セルの列番号を取得し,配列arrBufに格納する
3.arrBufのデータの内,連番毎に新たな配列に格納したい
※r.rowの値が33~40,55~64となった際に,それぞれを別の配列に格納したい

上記,3がしたくて頭を悩ませています。
もしくは,arrBufに格納する際に,連番毎に配列を作成することはできるのでしょうか。

以下コード抜粋
With wsImput

Dim FoundCell As Range, FirstCell As Range, Target As Range
Set FoundCell = .Range("AI8:AI71").Find(what:="有", LookIn:=xlValues, LookAt:=xlWhole)

If FoundCell Is Nothing Then GoTo ErrLabel
Set FirstCell = FoundCell
Set Target = FoundCell
Do
Set FoundCell = .Range("AI8:AI71").FindNext(FoundCell)
If FoundCell.Address = FirstCell.Address Then
Exit Do
Else
Set Target = Union(Target, FoundCell)
End If
Loop

Dim i As Integer: i = 1
Dim arrBuf As Variant
ReDim arrBuf(i To Target.Count, 0)
Dim r As Range
For Each r In Target.Rows
arrBuf(i, 0) = r.Row
i = i + 1
Next r

宜しくお願いします。

質問者からの補足コメント

  • HAPPY

    ご回答ありがとうございます!

    33~40が取得された場合,Range("A30:CR40").valueを配列に格納します。
    配列のサイズは(1 to 8,1 to 90)になります。

    その後,配列内の必要な値を別シートに転記しようと考えています。

    また,連続が一つのみであれば要素数1の配列として
    Range("A33:CR33").valueを配列に格納したいです。

    Findメソッドの開始について
    After:.Range("AI8")を追加しました!
    ありがとうございます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/03/11 13:46

A 回答 (4件)

No.3です。


個人的には、こんな書き方が分かり易いと思います。

Dim r As Range
For Each r In Target.Areas
Debug.Print r.EntireRow.Columns("A:CR").Address
Next
    • good
    • 0

直接の回答でなくて申し訳ないのですが、次のコードの意味、分かりますか? 肝は、Areas プロパティです。

まぁ、やってみれば分かると思いますが・・・。

Dim r As Range
For Each r In Target.Areas
Debug.Print r.Address
Next
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます!
頂いたコードを確認したところ,
$AI$33:$AI$40
$AI$55:$AI$64
の2つがイミディエイトウインドウに表示されました。
この範囲を
$A$33:$CR$40
$A$55:$CR$64
へ変更したのち,配列に格納するにはどのように記述すれば良いのでしょうか?
Target.Resize(行,列).selectで選択範囲を拡張しようと思ったのですが,
「型が一致しません」となります。

お礼日時:2022/03/14 09:31

No1です



>33~40が取得された場合,Range("A30:CR40").valueを配列に格納します
ますますわからないけれど、Range("A33:CR40").Value じゃないの?

>配列のサイズは(1 to 8,1 to 90)になります。
A列からCR列迄は96列あります。なんで「90」なのかわからない。


Value値をとると、それだけの要素数の配列になるので、全体の要素数はかなりのものになりますがそれでも良いのでしょうか?
とりあえずそのままとしてありますが、通常 Range の Value値をとると2次元配列になりますので、結果的にarrBufは疑似的な3次元配列となります。
(要素を「サイズ不定の2次元配列」とする、1次元配列になる)

Sub Q12844661()
Dim n As Long, i As Long, startR As Long
Dim v, arrBuf()

v = Range("AI1:AI72").Value
v(72, 1) = 0
startR = 0
n = 1

For i = 8 To 72
If v(i, 1) = "有" Then
If startR = 0 Then startR = i
Else
If startR > 0 Then
ReDim Preserve arrBuf(1 To n)
arrBuf(n) = Range(Cells(startR, 1), Cells(i - 1, 96)).Value
n = n + 1
startR = 0
End If
End If
Next i

End Sub

※ 個人的にはarrBufは、"$A$33:$CR$40" 等のセル範囲を要素に持つ1次元配列にしておいた方が扱い易そうな気がしますけれど・・・
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。
おっしゃるとおり
【正】Range("A33:CR40").Value
【誤】Range("A30:CR40").value
【正】配列のサイズは(1 to 8,1 to 96)
【誤】配列のサイズは(1 to 8,1 to 90)
でした・・・。申し訳ありません。

いただいたコードの中身を理解し,擬似的な3次元配列となる理由を考えてみます!
ありがとうございました。

お礼日時:2022/03/14 08:22

こんにちは



最終形をどうなさりたいのか、よくわかりません。

例えば、33~40が一つの連続とした場合に、配列の対応要素を
 Array(33,40)
としたいのか、
 Array(33,34,35,36,37,38,39,40)
あるいは、その他なのかなど。

また、連続が1つのみの場合に、
前者なら、
 Array(33,33)
後者なら、
 Array(33) 
なのか、単体の数値の
 33
なのかなど。

※ ちなみにFindメソッドではスタートを指定しないと、2番目の要素からチェックしますので、最初の要素がヒットする場合には一番最後にピックアップされることになります。
この回答への補足あり
    • good
    • 0

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