[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『If関数 の条件をみたしたら 行を挿入 は出来ますか?』(トラック)
エクセル で
発送先リスト
1A B C
2A社 雑誌 500部
3B社 雑誌 500部
4C社 雑誌 450部
5D社 雑誌 50部
6E社 雑誌 50部
7F社 雑誌 30部
と表があり
500 と量が多い所を 100 でわけて(450の時は100.100.100.150) あらかじめある行の下に 行 を挿入して
下記のような形にしたいのですが
発送部数
1 A B C 2A社 雑誌 100/500部 3A社 雑誌 100/500部 挿入された行 4A社 雑誌 100/500部 挿入された行 5A社 雑誌 100/500部 挿入された行 6A社 雑誌 100/500部 挿入された行 7B社 雑誌 100/500部 8B社 雑誌 100/500部 挿入された行 9B社 雑誌 100/500部 挿入された行 10B社 雑誌 100/500部 挿入された行 11B社 雑誌 100/500部 挿入された行 12C社 雑誌 100/450部 13C社 雑誌 100/450部 挿入された行 14C社 雑誌 100/450部 挿入された行 15C社 雑誌 150/450部 挿入された行 16D社 雑誌 50部 17E社 雑誌 50部 18F社 雑誌 30部
If関数でc2が 500以上のとき 行を挿入する しない
みたいのを思ったのですが…
条件になる箇所の数字が バラバラ なのと
行を挿入する関数が見つけられず
Range("3:6").insert とすると3行目〜6行目まで行が挿入出来る?
みたいのをみつけたのですが
関数と Rangeを組合せが出来なくて
何が上記出来る手立てはありますか??
かなりの初心者のため 出来ない事を聞いていたら
すみません。
よろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
Option Explicit
Sub test() Dim c As Range Dim s As String Dim n As Long Dim n2 As Long
Set c = Range("A4")
s = c.Offset(, 2).Value n = Val(s) \ 100 - 1 n2 = Val(s) Mod 100 + 100
If n > 0 Then c.Offset(1).Resize(n, 3).Insert xlShiftDown c.Resize(n + 1, 2).Value = c.Resize(, 2).Value c.Offset(, 2).Resize(n).Value = "100/" & s c.Offset(n, 2).Value = n2 & "/" & s End If
End Sub
(マナ) 2017/09/15(金) 23:23
(マナ) 2017/09/15(金) 23:35
本を調べながら
書いて頂いたコードを 理解しようとしています。
(また、試しておらず、すみません。会社のエクセルと自宅エクセルバージョンが大変古く異なるので)
本をみながら解釈しようとしていますが…
後編の※印があるあたりの文法の意味が本をみてもよくわからず
再度質問よろしくお願いします。
全く違う だったら すみません。
また、下からループです。 とは 何を行えば良いのでしょうか?
すみません。こちらについても教えてください。
Sub test()
Dim c As Range Cをえらぶ Dim s As string Sは文字型 Dim n As Long nは数字型 Dim n2 As Long n2は数字型 Set c=Range("A4") CはA4にセット S=c.Offset(,2).value SはcがあるA4のとなりのとなり ※n=val(s)\100-1 ※nはsに文字が含まれるとき数値型へかえて ??\100-1 n2=val(s)Mod 100+100 n2は s割る200の余り If n >0 Then もし、nが0以外だったら ※C.offset(1).Resize(n,3).Insert xlshift Down ※cはA4のとなりn行,3列を入れる?? ※C.Resize(n+1,2).value=c.Resize(,2).value ※cは?? だっらcのとなりのとなり ※C.Offset(,2).Resize(n).value="100/"&s ※cはとなりのとなり. 100/s と記入する ※C.Offset(n,2).value=n2&"/"&s ※cはnことなりのとなりに n/s と記入する
(トラック) 2017/09/16(土) 19:22
例えば、4行目のように450部とある場合は、 3行挿入し、4行にわけて表示する
という操作は、こうすればできますという一例です。
なので、同じように、
すべての行について繰り返し処理するとよいです。
という提案です。
>下からループです。 とは 何を行えば良いのでしょうか?
「 下から」というのは忘れてください。
今回は、上の行から順番に繰り返しでも可能です。 こんな感じです。 1)上から順番に調べていって 2)C列が200部以上であったら 3)行挿入し 4)100部(または最後は、端数+100)と複数行に分割表示 5)これを最後の行まで繰り返す
2)〜4)の部分が今回提示した部分です。 これに繰り返し処理を追加すると出来上がりです。 ただし、まずは現在のコードをもう少し理解してからのほうがよいかも。
'---------
>n = Val(s) \ 100 - 1
nは、何行挿入したらよいかを計算しています。
500部なら、4行挿入 450部なら、3行挿入 200部なら、1行挿入 170部なら、0行挿入
100で割ったろきの商から−1して求めています。
分割不要な200部未満の場合はn=0なので、
>If n > 0 Then
これで、200部以上(nが1以上)のときのみ、挿入しています。
> n2 = Val(s) Mod 100 + 100
n2は、分割表示したときの最後の行に表示する部数です。
500部なら、端数なく100部 450部なら、端数50なので150部 200部なら、端数なく100部 170部なら、そのまま170部
つまり、100で割った余りに+100で求められます。
ここまで、わかりますか。
'---------
>※印
どう説明したらよいか悩みます。
ちょっと待ってください。
(マナ) 2017/09/16(土) 21:14
ここまでわかりますか?
の所まで ようやく(説明を頂いて) わかりました‼
とても初心者に対して※部の説明を かみくだくのが
大変かと思いますが
お時間があるときにでよいので
よろしくお願いします。
本をみながら 1つ1つ offsetは offset(行,列)となる
のように調べている レベルなので
コード の 繋ぎ目(どこまでが、引数などになっているのか?) 、式の成り立ち が
わかっておらず 申し訳 ありません。
ここまでわかりますか?
に対して とても 勉強になります。
ありがとうございます。
(トラック) 2017/09/17(日) 12:37
Sub test2() Dim c As Range Dim n As Long
Set c = Range("A4")
n = 3
c.Select c.Offset(1).Select c.Offset(1).Resize(n, 3).Select
End Sub
(マナ) 2017/09/17(日) 12:45
この状態で、セルの挿入を実行してみてください。
3行分挿入されます。
これをマクロにすると
Sub test3() Dim c As Range Dim n As Long
Set c = Range("A4")
n = 3
c.Offset(1).Resize(n, 3).Insert xlShiftDown
End Sub
↑で、n=4に変更すると、4行挿入されます。
nは、 ↓で、求めているというのは、先に説明しましね。
>n = Val(s) \ 100 - 1
ここまで理解できますか。
(マナ) 2017/09/17(日) 13:07
(マナ) 2017/09/17(日) 13:13
A4を 基準? として
A4 のひとつ下 offset(1) A5
A4を 基準? として
n=3
A4の Resize(3.3) c7 範囲 が選択されている
感じになりました。
シフトdown 行がさがった感じ です
Offset Resize については
図をみても あやふや でした…(Resizeはoffsetで移動した分 範囲を広げる?的な感じな印章でした)
すみません。
また、当初のコードも エクセル2003ながら
入力し、F8で一行ずつ みてみようとしたのですが
\ この線が入力できず
動作を見ながら(コードの意味をみながらと思いましたが)
コードの 動作 を見ていこうと思いましたが
つまづいてしまいました。
奥が深くて難しいですね…
(トラック) 2017/09/17(日) 17:23
この行を、4行に分割表示するとします。
まず、行を挿入し、場所を確保する必要があります。
1)A5;C7を選択し
2)セルの挿入
これで、分割表示する場所が準備できます。
マクロでは、
Range("A5:C7").Insert xlshift Down
という記述になります。
これをOffset, Resizeを使って表現すると
Range("A4").Offset(1).Resize(3, 3).Insert xlshift Down
ここは、わかりますか。
で、
Set c = Range("A4") n = 3
ならば、
c.Offset(1).Resize(n, 3).Insert xlshift Down
となります。
(マナ) 2017/09/17(日) 18:23
エクセル2003でも、問題なく使えます。
"\ "(バックスラッシュ)は、
わたしのキーボードではシフトキーの横にあります。
(マナ) 2017/09/17(日) 18:30
>当初のコードも エクセル2003ながら >入力し、F8で一行ずつ みてみようとしたのですが >\ この線が入力できず
もし半角のバックスラッシュのことを指しているなら、 円マーク で良いはずです (見た目が違っても中身は同じものであり、「フォント」の設定で見え方が違う)
全角のバックスラッシュが入力できないなら、 日本語入力をオンにして シフトキーの横の\キーまたは バックスペースの横の¥キーを押して、 変換すれば出るはずです。
VBAエディタのツール→オプション→エディタの設定だかどこかでフォントは変えられたはず
(tata) 2017/09/17(日) 18:35
\ は ¥ マークでも OKなのですね!
日本語入力、半角入力 をえらんだりしましたが
ひらがなの ろ のボタンに\ が書いてあり
入力をこころみて ¥ または アンダーバー にしか
入力が出来ず
¥マークでOKとのことなので
またやってみます。
ありがとうございます。
(トラック) 2017/09/17(日) 18:51
この掲示板の文字、 7 \ 3 ↑私の環境だと、 PCから見ると半角の¥で、 スマホから見ると半角の\に見えてます。
意味は、割り算の商(整数部分)であり、 7 ÷ 3 は 2 余り 1 なので、 7 \ 3 は 2 です。 (tata) 2017/09/17(日) 19:22
マクロでは、 Range("A5:C7").Insert xlshift Down ※ という記述になります。 これをOffset, Resizeを使って表現すると Range("A4").Offset(1).Resize(3, 3).Insert xlshift Down ▼
上記 同じ事をいっている(同じ事をしている)理解出来ました。
初歩的質問ですみません。
※のコード ▼のコード 同じ処理を指定していますが
初心者的には ※のコードの方が(文が短めになるため)簡単に感じられますが
変数(範囲を予め決められない)が入るであろう処理をするために
▼コードがあるとの解釈であっていますか?
(トラック) 2017/09/18(月) 11:27
あってます。
(マナ) 2017/09/18(月) 11:55
1)セルA4を変数cに代入
2)C列の値(450部)を変数sに代入
3)挿入する行数を計算し、変数nに代入 n=3
4)最終行に表示する部数を計算し、変数n2に代入 n2=150
5)n>0なので、以下を実行
6)A4の下に、n=3だから3行挿入
7)A、B列(A4:B7)は、A4:B4と同じ値とする
8)C列(C4:C7)に、100/450部を入力
9)C列の最後の行(C7)に、n2=150だから150/450部を入力
7)〜9)は、理解できますか。
ステップイン(F8)で確認してみてください。
(マナ) 2017/09/18(月) 11:58
7)〜9 までも わかりました。
ループについて
Sub
for
Next End sub
となる 練習問題の 答えをみながら 理解してきました。
for each next の each についても
教えて頂けると 嬉しいです。
すみません。よろしくお願いします。
(トラック) 2017/09/18(月) 18:56
Option Explicit
Sub test4() Dim c As Range Dim n As Long
For Each c In Range("a3:a10") n = n + 1 c.Value = n Next
End Sub
Sub test5() Dim c As Range
For Each c In Range("a1", Range("a" & Rows.Count).End(xlup)) c.Offset(, 2).Value = c.Value + 1 Next
End Sub
(マナ) 2017/09/18(月) 19:37
(マナ) 2017/09/18(月) 20:09
テスト5 を入力してみたら
A列に ランダムに数字 途中空欄を交えたら
C列に ランダム数字 + 1 の数字が入りました。
for Next では 予め決められた範囲を
for each Next では 変数 入り の
ループを行うもの‼ との解釈になりました。
⬆あっていますか??
(トラック) 2017/09/19(火) 14:40
ちょっと意味がわかりません。
今は、どっちを使えばよいかはわからなくても、
数をこなせば、自然とみについてくるはずです。
実際は、どちらを使っても問題ない場合も多いです。
なので、使いやすいほうで試して、
だめならまた質問するというのでもよいと思います。
Sub test6() Dim 行 As Long
For 行 = 3 To 10 Cells(行, "A").Interior.Color = vbRed Next
End Sub
これを、For each〜Nextだと
こんな感じです。
Sub test7() Dim セル As Range
For Each セル In Range("A3:A10") セル.Interior.Color = vbGreen Next
End Sub
セル範囲 Range("A3:A10")から、
1セルずつ取り出して処理する
ということです。
今回は、For each〜Nextを使うと
ここまでのコードがそのまま使えます。
考えてみてください。
(マナ) 2017/09/19(火) 19:59
for スタート場所 to 終わり場所
⬆ ⬆ 指定が 数字で決められている 数字で指定する
NEXT
For each in セルスタート場所 最終行まで
⬆ データにより最終行の位置がかわる(変数 扱い) NEXT
と 思っていました…
どちらを使っても 良い
まだ、まだ、使い分けはわかりませんし
自分で行いたいコードを記入すること
コードの命令文(例:色を塗るなど)をすぐに内容を理解する のが難しいですが
テスト6 テスト7
で記入してもらった コードは なんとなくながら
こう動くんだろうな〜と 他の方が 簡単に(短め)書いてくれる
コードが 読める?(実際に記入実行したら違う場合もありましたが)
ようになりました‼
ありがとうございました!!
途中 tataさん も ありがとうございました!!
(トラック) 2017/09/19(火) 21:51
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.