[[20170915215037]] 『If関数 の条件をみたしたら 行を挿入 は出来ま』(トラック) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


For each〜Nextなら、下からでなくてもよかったです。

(マナ) 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


発送先リストが最初に提示いただいたものだとして
以下のマクロをステップイン(F8)で1行づつ実行してみてください。
Offsetとか、resizeの意味が理解できると思います。

 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


↑のマクロを実行すると
A5:C7の範囲が選択されます。

この状態で、セルの挿入を実行してみてください。
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


Offset とResizeについては、図を使った説明があるところを探すとよいです。
https://kosapi.com/post-1281/

(マナ) 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


>4C社 雑誌 450部

この行を、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ながら
>入力し、F8で一行ずつ みてみようとしたのですが
>\ この線が入力できず

エクセル2003でも、問題なく使えます。

"\ "(バックスラッシュ)は、
わたしのキーボードではシフトキーの横にあります。

(マナ) 2017/09/17(日) 18:30


 >当初のコードも エクセル2003ながら 
 >入力し、F8で一行ずつ みてみようとしたのですが 
 >\ この線が入力できず 

 もし半角のバックスラッシュのことを指しているなら、
 円マーク で良いはずです
 (見た目が違っても中身は同じものであり、「フォント」の設定で見え方が違う)

 全角のバックスラッシュが入力できないなら、
 日本語入力をオンにして
 シフトキーの横の\キーまたは
 バックスペースの横の¥キーを押して、
 変換すれば出るはずです。

 VBAエディタのツール→オプション→エディタの設定だかどこかでフォントは変えられたはず

(tata) 2017/09/17(日) 18:35


マナさん tataさん ありがとうございます。

\ は ¥ マークでも 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


マクロの流れは、↓こんな感じで、6)まで説明してきました。

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


>for Next では 予め決められた範囲を
>for each Next では 変数 入り の

ちょっと意味がわかりません。

今は、どっちを使えばよいかはわからなくても、
数をこなせば、自然とみについてくるはずです。

実際は、どちらを使っても問題ない場合も多いです。
なので、使いやすいほうで試して、
だめならまた質問するというのでもよいと思います。

 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


マナさん ありがとうございます。
テスト5

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.