上の表を下の表のようにしたいです
||A|B|C|D|E|F|G|
|:--|:--:|--:|
|1|||||100||||
|2|30|||20|||80
|3||10||40||60|
||A|B|C|D|E|F|G|
|:--|:--:|--:|
|1|0|0|0|0|100|100|100|
|2|30|30|30|20|20|20|80
|3|0|10|10|40|40|60|60
#条件
0. 所与の値は生かす
- a1から所与の値があるセルe1一つ前までを選択 (a1:d1)
- a1の値をコピー
- e1は生かす
- f1,最終列g1までe1をコピー
- 次の行へ
列は800程度、行は1600程度の数があるため、手動のオートフィルではなく、自動化できたらと思うのですが、所与の値を生かす論理式が思いつきません
ExcelでもGoogleスプレッドシート でもマクロでも何かしらでできたらと思います
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 08:50
回答4件
0
G2:SEF1600
という範囲です。大きすぎるのでしょうか。
ということは「約12,980」列ですね。
最初は「列は800程度、行は1600程度」と言ってませんでしたっけ?(汗;
こちらで、2000行分のデータを作ってやってみましたが、
とりあえず処理は完了しました。5分くらいかかりましたが・・・
デバッグすると
cur = rng.Value
でとまります
なるほど、そうでしたか。
それでは、プロシージャの冒頭部分のDim文の「Integer」をすべて「Long」に置き換えてみてください。
もしかしたら、たんに「rng.Value」の値が「Integer」を超えていただけかもしれません。
私の方はサンプルの値をタイル状にコピーしていたので気が付きませんでした。
なお、処理が長時間かかる場合には、
VBA
1 For ro = yStart To yEnd 2 Debug.Print ro ` 現在処理中の行番号 3 For co = xStart To xEnd
のようにしておけば、現在処理中の行番号を出力してくれます。
投稿2020/05/16 00:56
総合スコア335
0
ベストアンサー
ExcelVBA
1Sub test() 2 Dim a As Range 3 4 With ActiveSheet.UsedRange 5 .Columns(1).SpecialCells(xlCellTypeBlanks).Value = 0 6 .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC[-1]" 7 .Value = .Value 8 End With 9End Sub
こんな感じですかね。
量が多くて処理できないなら、
セル範囲を狭めて何回か繰り返してください。
投稿2020/05/16 08:10
総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
大変失礼しました。
オーバーフローですか、、、Range()で取得する範囲が大きすぎるのでしょうか?
ちょっと直してみました。
セルの取得には「Sheet1.Cells(ro, co)」を使っています。
これでどうでしょうか?
VBA
1Sub fill_test2() 2 Dim rng As Range 3 Dim cur As Integer 4 Dim ro As Integer, co As Integer 5 Dim xStart As Integer, xEnd As Integer 6 Dim yStart As Integer, yEnd As Integer 7 Dim init_val As Boolean 8 9 ' 指定された範囲の座標を取得する 10 With Sheet1.Range("A1:G4") 11 xStart = .Column 12 xEnd = xStart + .Columns.Count - 1 13 yStart = .Row 14 yEnd = yStart + .Rows.Count - 1 15 End With 16 17 For ro = yStart To yEnd 18 For co = xStart To xEnd 19 ' 行が変わったらフラグをクリアする 20 If co = xStart Then init_val = False 21 22 Set rng = Sheet1.Cells(ro, co) 23 24 If rng.Value = "" Then 25 If init_val Then 26 rng.Value = cur 27 Else 28 rng.Value = 0 29 End If 30 Else 31 cur = rng.Value 32 If init_val = False Then init_val = True 33 End If 34 Next co 35 Next ro 36End Sub
もし、これでもオーバーフローする場合には、
最初のWith文はカットして、
xStart, xEnd, yStart, yEndを手動でセットしてみてください。
それで動くかどうか・・・
投稿2020/05/15 05:23
総合スコア335
0
以下のようなコードで実現できると思います。
VBA
1Sub fill_test() 2 Dim rng As Range 3 Dim cur As Integer 4 Dim prev As Integer: prev = -1 5 Dim init_cur As Boolean 6 7 For Each rng In Sheet1.Range("A1:G4") 8 If rng.Column < prev Then init_cur = False 9 prev = rng.Column 10 11 If rng.Value = "" Then 12 If init_cur Then 13 rng.Value = cur 14 Else 15 rng.Value = 0 16 End If 17 Else 18 cur = rng.Value 19 If init_cur = False Then init_cur = True 20 End If 21 Next rng 22End Sub 23
↓ 上記のコードで以下のようになります。
投稿2020/05/14 07:14
総合スコア335
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 08:38
2020/05/15 05:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。