いつもお世話になっております。
下記のコードでおしえてくれませんでしょうか
下記のコードはCells(i, 3).Value <> ""
G1に空白でないデータを書き込むコードです。
If Cells(i, 3).Value <> "" Then これを
If Cells(i, 3).Value = "東京" Then
にするとエラーになります。
Dim WC() As Variant
Dim i As Long
Dim n As Long
Dim x As Long
Dim R As Range
Set R = Range("C10").CurrentRegion
With R
For i = 1 To .Rows.Count
If Cells(i, 3).Value <> "" Then
ReDim Preserve WC(n)
WC(n) = .Rows(i).Resize(, 3)
n = n + 1
End If
Next
End With
Dim wf As Object
Set wf = WorksheetFunction
Range("g1").Resize(UBound(WC), 3).Value = _
wf.Transpose(wf.Transpose(WC))
No.4ベストアンサー
- 回答日時:
こんばんは、
すみません。もう一つの問題点に気が付きませんでした。
迷路に入ってしまったのは、配列にセル範囲を代入したせいですかね
下のコードサンプルで検証します。
どのような結果が望まれているのか、分かりませんが、配列にセル範囲を代入するとSwは
Sw Variant(0 to 0)
Sw(0) Variant/Variant(1 to 1, 1 to 3)
Sw(0)(1) Variant(1 to 3)
Sw(0)(1,1) Variant/String 値 "東京"
Sw(0)(1,2) Variant/String 値 "Test"
Sw(0)(1,3) Variant/String 値 "Test"
となります。
従って、下のコードで出力する場合は、Range("G1")の範囲をResizeして
Sw(0)を代入すれば良いと思います。
複数ある場合を想定するとSw(i)などでの出力が必要かと・・
複雑になってしまうので、ロジック自体を変えた方が良いように思います。
エラー対策の為、#1#3の処理を加えた方が良いと思います。
Sub a()
Dim i As Long, Sw()
i = 0
Dim R As Range
For Each R In Range("C8", Cells(Rows.Count, "C").End(xlUp))
If R.Value = "東京" Then
ReDim Preserve Sw(i)
Sw(i) = R.Resize(, 3).Value
i = i + 1
End If
Next
Range("G1").Resize(, 3).Value = Sw(0)
End Sub
ご自身でデバッグするヒント
変数の値や型などの変化を把握する為に ステップ実行しながら
ローカルウインドウを活用します。
配列の構造や値が把握できますので試してみてください。
取り敢えず。
No.5
- 回答日時:
>Range("g2").Resize(UBound(Sw) + 1, 3).Value = Sw(0)
これは、Sw(0)の値を3つに増やした範囲で出力しているだけです。
Swを再加工するとか、出力をループさせるとかになります。
Sw(0) Sw(1) Sw(2)、、しっかり説明する自信がなく、、
わかり易く良い解説サイトを少し探しましたが見つからなかったので、、
取り敢えず
少しロジックを変えた方法で(代入段階れ2次配列に入れる方法)
Dim i As Long, j As Integer
Dim Sw()
i = 0
Dim R As Range
For Each R In Range("C8", Cells(Rows.Count, "C").End(xlUp))
If R.Value = "東京" Then
ReDim Preserve Sw(i, 2)
For j = 0 To 2
Sw(i, j) = R.Offset(, j).Value
Next
i = i + 1
End If
Next
If Not IsEmpty(Sw) Then
Range("G1").Resize(, 3).Value = Sw
End If
多分 期待通りの結果になると思います。
No.3
- 回答日時:
#1です。
気付きはありましたでしょうか、、他の部分も懸念されるので追記します。
配列は出力(書き出し)を考える(考えなくとも)と要素番号を0から始める事が多くあると思います。
(0から順番に代入した場合)配列に値を代入した時、要素番号0で要素数1になりますので、出力先でRange("g1").Resize(UBound(WC)+1, 3).Value =
などとして要素番号から要素数に変える
(変えているわけでないので表現は正しくないかも)必要があります。
また、空の配列に対してUBound関数を実行するとエラーが返ります。
なので、条件などで配列に値の代入がされないケースがある(想定できる)場合は、必ず(私的には)下記のように配列を調べるコードを入れます。
If Not IsEmpty(WC) Then '配列要素があれば
Range("g1").Resize(UBound(WC) + 1, 3).Value = WC
などと書きます。
Transposeを重複させるとどうなるのかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リストボックスに縦スクロール...
-
二次元配列のインデックスについて
-
Strawberry Perl for Windows ...
-
DBIを使ってSelect文 複数のカ...
-
Generic.List・ArrayList・配列...
-
クラスに配列を渡す方法
-
Perlの数値・文字列操作
-
組み合わせについての質問です...
-
do-while文での無限ループ?
-
エクセルVBAでTransposeの不思議
-
csv形式のデータの一部を削除し...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
ハッシュ検索はなぜ速い
-
Can't use string ("0") as an ...
-
文字列を変数名として扱う方法
-
GIFアニメをループさせたくない
-
範囲指定したセルを1つずつ飛...
-
プログラミングについて。 1つ...
-
VBAでの一時停止と再開の方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
リストボックスに縦スクロール...
-
Excel VBA ユーザーフォームの...
-
マクロ Publicでの配列定義
-
エクセルVBAでTransposeの不思議
-
Strawberry Perl for Windows ...
-
二次元配列における要素数のは...
-
perlで2次元配列をサブルーチ...
-
クラスに配列を渡す方法
-
Dim flag(4) as boolean で配列...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
jcode->jfold で禁則処理
-
VB6で配列の最大値を簡単に求め...
-
perl 配列の要素数について
-
ファイル名に日付・時刻を付与...
-
チェックボックスのperlでの値...
-
組み合わせについての質問です...
-
配列を初期化する時ってどうす...
おすすめ情報
ご返事遅れて申し訳ありません
空白を全角文字にしてるのは手打ちしたからですか?
手打ちです
すみませんです。
ご返事遅れてすみませんです。
Dim WC() As Variant
Dim i As Long
Dim n As Long
Dim x As Long
Dim R As Range
Set R = Range("C8").CurrentRegion
With R
For i = 1 To .Rows.Count
If Cells(i, 3).Value = "東京" Then
ReDim Preserve WC(n)
WC(n) = .Rows(i).Resize(, 3)
n = n + 1
End If
Next
End With
Dim wf As Object
Set wf = WorksheetFunction
If Not IsEmpty(WC) Then
Range("A1").Resize(UBound(WC) + 1, 3).Value = WC
End If
文字数の制限のため2回にわけました。
上手くいきませんでした。
申し訳ございません
Dim i As Long, Sw()
i = 0
Dim R As Range
For Each R In Range("C2", Cells(Rows.Count, "C").End(xlUp))
If R.Value = "東京" Then
ReDim Preserve Sw(i)
Sw(i) = R.Resize(, 3).Value
i = i + 1
End If
Next
Range("G1").Value = Sw
これもだめてすね
下記のコード実行すると
添付ファイルのように書き出されます。
2回にわけます。
Sub a()
Dim i As Long, Sw()
i = 0
Dim R As Range
For Each R In Range("C3", Cells(Rows.Count, "C").End(xlUp))
If R.Value = "東京" Then
ReDim Preserve Sw(i)
Sw(i) = R.Resize(, 3).Value
i = i + 1
End If
Next
If Not IsEmpty(Sw) Then
Range("g2").Resize(UBound(Sw) + 1, 3).Value = Sw(0)
End If
Stop
End Sub
東京 1 456
東京 1 456
東京 123 456
という風になるはずなんですが、
この添付 画像ではうまくできているのですが。
ReDim Preserve Sw(i, 2)で黄色反転になってしまいます。