Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3473 / 13646 ツリー ←次へ | 前へ→

【61954】行の挿入について mori 09/6/14(日) 18:59 質問[未読]
【61955】Re:行の挿入について かみちゃん 09/6/14(日) 19:14 発言[未読]
【61956】Re:行の挿入について mori 09/6/14(日) 19:34 発言[未読]
【61957】Re:行の挿入について かみちゃん 09/6/14(日) 19:46 発言[未読]
【61958】Re:行の挿入について mori 09/6/14(日) 20:02 発言[未読]
【61959】Re:行の挿入について かみちゃん 09/6/14(日) 20:13 発言[未読]
【61960】Re:行の挿入について mori 09/6/14(日) 20:37 発言[未読]
【61961】Re:行の挿入について かみちゃん 09/6/14(日) 21:00 発言[未読]
【61962】Re:行の挿入について mori 09/6/15(月) 9:48 発言[未読]
【61964】Re:行の挿入について かみちゃん 09/6/15(月) 12:42 発言[未読]
【61967】Re:行の挿入について mori 09/6/15(月) 14:44 発言[未読]
【61970】Re:行の挿入について kanabun 09/6/15(月) 15:09 発言[未読]
【61974】Re:行の挿入について mori 09/6/15(月) 15:32 お礼[未読]
【61996】Re:行の挿入について mori 09/6/16(火) 14:30 質問[未読]
【61998】Re:行の挿入について kanabun 09/6/16(火) 15:17 発言[未読]
【62001】Re:行の挿入について mori 09/6/16(火) 15:44 発言[未読]
【62005】Re:行の挿入について kanabun 09/6/16(火) 16:13 発言[未読]
【62008】Re:行の挿入について mori 09/6/16(火) 17:03 発言[未読]
【62009】Re:行の挿入について kanabun 09/6/16(火) 17:42 発言[未読]
【62013】Re:行の挿入について kanabun 09/6/17(水) 0:38 発言[未読]
【62016】Re:行の挿入について mori 09/6/17(水) 10:00 発言[未読]
【62017】Re:行の挿入について kanabun 09/6/17(水) 11:12 発言[未読]
【62019】Re:行の挿入について kanabun 09/6/17(水) 11:30 発言[未読]
【62021】Re:行の挿入について mori 09/6/17(水) 13:02 発言[未読]
【61971】Re:行の挿入について Yuki 09/6/15(月) 15:13 発言[未読]
【61976】Re:行の挿入について mori 09/6/15(月) 15:36 発言[未読]
【62015】Re:行の挿入について Yuki 09/6/17(水) 8:29 発言[未読]
【62026】Re:行の挿入について mori 09/6/17(水) 13:48 お礼[未読]
【61973】Re:行の挿入について かみちゃん 09/6/15(月) 15:32 発言[未読]
【61977】Re:行の挿入について mori 09/6/15(月) 15:52 お礼[未読]
【62012】Re:行の挿入について かみちゃん 09/6/16(火) 23:30 発言[未読]
【62025】Re:行の挿入について mori 09/6/17(水) 13:43 お礼[未読]

【61954】行の挿入について
質問  mori  - 09/6/14(日) 18:59 -

引用なし
パスワード
   VBA初心者です。
ご教授ください。

「合計」と記入されている行の下に1行挿入したいのですが、
Rangeの後ろにどのような文を入れたらよいのか困っております。
(合計と記入される行はランダムで範囲の指定ができない)

If koumoku="合計" then
 Range ← ここから先がわからず

いろいろなサイト、本などで探したのですが、どうしてもわからず
困っております。

どうぞご教授ください。
よろしくお願いいたします。

【61955】Re:行の挿入について
発言  かみちゃん  - 09/6/14(日) 19:14 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>「合計」と記入されている行の下に1行挿入したいのですが、
>いろいろなサイト、本などで探したのですが、どうしてもわからず

一般操作で特定の行に行挿入はできますか?
できるならば、その操作を「マクロの記録」で記録すれば、ある程度わかると思います。

サイトや本もいいですが、「マクロの記録」と「ヘルプ」も結構役に立ちますよ。

【61956】Re:行の挿入について
発言  mori  - 09/6/14(日) 19:34 -

引用なし
パスワード
   かみちゃん さん

早速のコメントをありがとうございます。

>一般操作で特定の行に行挿入はできますか?
できます。

>できるならば、その操作を「マクロの記録」で記録すれば、ある程度わかると思います。
記録をしたのですが、それではどうしても特定の行にしか挿入ができずに
います・・・

If koumoku="合計" then
 Rows("  ").Select
 Selection.Insert Shift:=xlDown

この中身を何に設定すればいいのかがわからず・・・です。

【61957】Re:行の挿入について
発言  かみちゃん  - 09/6/14(日) 19:46 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>記録をしたのですが、それではどうしても特定の行にしか挿入ができずに
>います・・・
>
>If koumoku="合計" then
> Rows("  ").Select
> Selection.Insert Shift:=xlDown

変数koumokuは、どのようにして代入しているのでしょうか?
セル位置などが特定できているように思うのですが・・・

【61958】Re:行の挿入について
発言  mori  - 09/6/14(日) 20:02 -

引用なし
パスワード
   かみちゃん さん

早々のお返事をありがとうございます。

>変数koumokuは、どのようにして代入しているのでしょうか?
>セル位置などが特定できているように思うのですが・・・
変数はCSVファイルを読み込んだとき、その列に代入されるように
してあります。
列は変わらないのですが、行が毎回変わり、更にいくつも現れるような
ファイルになっているので、特定ができません。
Rowsの範囲をどのように設定すればいいのかがわからずです・・・

【61959】Re:行の挿入について
発言  かみちゃん  - 09/6/14(日) 20:13 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>変数koumokuは、どのようにして代入しているのでしょうか?
>>セル位置などが特定できているように思うのですが・・・
>変数はCSVファイルを読み込んだとき、その列に代入されるように
>してあります。

コードの全体がどうなっているのかよくわかりません。
全体を提示していただくことはできませんか?
「合計」の行がどこにあるかは判定できているのではないでしょうか?

【61960】Re:行の挿入について
発言  mori  - 09/6/14(日) 20:37 -

引用なし
パスワード
   かみちゃん さん

早々のお返事をありがとうございます。

>コードの全体がどうなっているのかよくわかりません。
>全体を提示していただくことはできませんか?
>「合計」の行がどこにあるかは判定できているのではないでしょうか?
明日、ここに提示させていただきますので、一度お目を通して頂けると
幸いです。

「合計」の行がどこにあるか判定できているのですが・・・
どうしても1行挿入すると言う事ができずにいます。。。

【61961】Re:行の挿入について
発言  かみちゃん  - 09/6/14(日) 21:00 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>「合計」の行がどこにあるか判定できているのですが・・・
>どうしても1行挿入すると言う事ができずにいます。。。

どのように判定できているのかわかりませんし、シートレイアウトがどうなっているのかの説明もないので
答えにくいのですが、

A列が「合計」となっている行の次の行に行挿入するなら、以下のような感じです。
また、この例では、「合計」となっているセルは、1箇所しかないものとしています。

行の判定ができているなら、その値(以下の例だとlngRow)に1加算した行になります。

Sub Sample()
 Dim lngRow As Long
 Dim lngRowMax As Long
 
 lngRowMax = Range("A" & Rows.Count).End(xlUp).Row
 For lngRow = lngRowMax To 1 Step -1
  If lngRow <= Rows.Count - 2 And Cells(lngRow, 1).Value = "合計" Then
   Rows(lngRow + 1).Insert Shift:=xlDown
   Exit For
  End If
 Next
End Sub

【61962】Re:行の挿入について
発言  mori  - 09/6/15(月) 9:48 -

引用なし
パスワード
   かみちゃん さん

何度も何度もありがとうございます。
取り急ぎ、全体を提示します。

Sub CreateMitsumori()

 Dim i          As Long
 Dim j          As Long
 Dim k          As Long
 Dim l          As Long
 Dim m          As Long
 Dim n          As Long
 Dim lngMaxRow      As Long
 Dim lngRow       As Long
 Dim blnFlag       As Boolean
 Dim lngCount      As Long
 Dim strName       As String
 Dim lngPresentRowIndex  As Long
 Dim lngRowX       As Long
 Dim lngRowY       As Long
 Dim strRangeValue    As String
 Dim lngFooterRowIndex  As Long

 
 Dim strGyoNO As String
 Dim strTekiyo As String
 Dim strSuryo As String
 Dim strTani As String
 Dim strTanka As String
 Dim strKingaku As String
 Dim strSyokei As String
 
 Dim strKakkoGyoNO As String
 Dim strKakkoKingaku As String
 Dim strTrimedTekiyo As String 'トリミング後
 Dim lngLength As Long
 Dim lngTekiyoLength As Long
 

 On Error GoTo Error_CreateMitsumori
  
 With Worksheets(3)
  '一時シートから行数を取得
  lngMaxRow = Worksheets("TMP1").Range("A1").SpecialCells(xlLastCell).Row
  blnFlag = False
  j = 1
  For i = 31 To lngMaxRow  
   If j = 1 Then
   ElseIf j Mod 29 = 1 Then
    .Range("A4:U32").Copy
    lngRowY = j + 3
    lngRowX = j + 31
    strRangeValue = "A" & lngRowY & ":" & "U" & lngRowX
    .Range(strRangeValue).PasteSpecial xlPasteAll
    .Range(strRangeValue).RowHeight = 27
    .PageSetup.PrintArea = .Range(strRangeValue)
   End If
   j = j + 1
  Next
  
  lngPresentRowIndex = 4
  For lngRow = 31 To lngMaxRow
   strGyoNO = Worksheets("TMP1").Cells(lngRow, 1).Value  
   strTekiyo = Worksheets("TMP1").Cells(lngRow, 2).Value 
   strSuryo = Worksheets("TMP1").Cells(lngRow, 3).Value  
   strTani = Worksheets("TMP1").Cells(lngRow, 4).Value  
   strTanka = Worksheets("TMP1").Cells(lngRow, 5).Value  
   strKingaku = Worksheets("TMP1").Cells(lngRow, 6).Value 
   strSyokei = Worksheets("TMP1").Cells(lngRow, 6).Value 
   
   '()付行番号はCSV取込みすると−として認識されるので−を取り除きます
   If Left(strGyoNO, 1) = "-" Then
    lngLength = Len(strGyoNO)
    strKakkoGyoNO = Mid(strGyoNO, 2, lngLength - 1)
    strKakkoGyoNO = "'(" & strKakkoGyoNO & ")"         
    .Cells(lngPresentRowIndex, 1).Value = strKakkoGyoNO    
   Else
    .Cells(lngPresentRowIndex, 1).Value = strGyoNO             End If
   
   '文字列チェック
   strTrimedTekiyo = strTekiyo
   strTrimedTekiyo = StrConv(strTrimedTekiyo, 4)          '半角スペースがあった場合全角にします
   strTrimedTekiyo = Replace(strTrimedTekiyo, " ", "")      'トリミングします
   lngTekiyoLength = InStr(strTrimedTekiyo, "値引")        '文字列"値引"の検索をし、文字位置を返します。無かった場合0を返します
   If lngTekiyoLength > 0 Then
    strTrimedTekiyo = Mid(strTrimedTekiyo, lngTekiyoLength, 2)  '値引を抜き出します
   End If
   
   If strTrimedTekiyo = "合計" Then                '合計がある場合、小計欄のみに金額を挿入
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku
   ElseIf strTrimedTekiyo = "値引" Then
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku
   Else
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 3).Value = strSuryo
    .Cells(lngPresentRowIndex, 4).Value = strTani
    
   lngPresentRowIndex = lngPresentRowIndex + 1 'インデックスを加算

  Next
 
  End With
    
Exit_CreateMitsumori:
  Exit Sub

【61964】Re:行の挿入について
発言  かみちゃん  - 09/6/15(月) 12:42 -

引用なし
パスワード
   >何度も何度もありがとうございます。
>取り急ぎ、全体を提示します。

 If strTrimedTekiyo = "合計" Then
の中で、行挿入したいわけですね。
それであれば、
変数strTrimedTekiyo
は、
 strTrimedTekiyo = strTekiyo
で代入されており、ここで使われている
変数strTekiyo
は、
 strTekiyo = Worksheets("TMP1").Cells(lngRow, 2).Value 
で代入されているので、
 If strTrimedTekiyo = "合計" Then
の行番号は、
変数lngRowなのではないでしょうか?

そういうことであれば、
[61961]でも書いたとおり、
 Rows(lngRow + 1).Insert Shift:=xlDown
となります。

また、行挿入を繰り返すようですので、
 For lngRow = 31 To lngMaxRow
は、
 For lngRow = lngMaxRow To 31 Step -1
として、下方向から繰り返し処理したほうがいいと思います。

【61967】Re:行の挿入について
発言  mori  - 09/6/15(月) 14:44 -

引用なし
パスワード
   かみちゃん さん:

何度も何度もありがとうございます。

> If strTrimedTekiyo = "合計" Then
>の行番号は、
>変数lngRowなのではないでしょうか?
私もそういう受け取り方をしています。

しかしながら、
> Rows(lngRow + 1).Insert Shift:=xlDown
を挿入しましたが、行挿入はできませんでした。
何も変わらずでした。
手を加えたりしたのですが、行挿入どころか「合計」が
消えてしまったり、行挿入はできなかったりという状況です。

> For lngRow = lngMaxRow To 31 Step -1
>として、下方向から繰り返し処理したほうがいいと思います。
下方向からの繰り返しという処理はわかったのですが、この処理を
するとCSVファイルから逆(最下部)から拾ってくるのではない
でしょうか?
現に実行してみたら、CSVファイルの最下部がマクロが入っている
シートの最上部に現れ、逆方向に挿入されていました。

何度もお手を煩わせてしまって、申し訳ありません。

【61970】Re:行の挿入について
発言  kanabun  - 09/6/15(月) 15:09 -

引用なし
パスワード
   ▼mori さん:
横から失礼します。

>手を加えたりしたのですが、行挿入どころか「合計」が
>消えてしまったり、行挿入はできなかったりという状況です。
>
>> For lngRow = lngMaxRow To 31 Step -1
>>として、下方向から繰り返し処理したほうがいいと思います。
>下方向からの繰り返しという処理はわかったのですが、この処理を
>するとCSVファイルから逆(最下部)から拾ってくるのではない
>でしょうか?

そういうことでしたら、
整数変数をひとつ追加して、それに 行を挿入するとき 1 を代入するようにして
ループの終わりで lngPresentRowIndex を+1するところに、さらに行挿入の
とき+1するようにコードを 追加したらどうでしょう?

 Dim InsertLine As Long '◆ 追加

>  lngPresentRowIndex = 4
>  For lngRow = 31 To lngMaxRow
   
   (途中省略)
   InsertLine = 0 '◆ 追加
>   If strTrimedTekiyo = "合計" Then
>    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
>    .Cells(lngPresentRowIndex, 6).Value = strKingaku
    InsertLine = 1  '◆ 追加
>   ElseIf strTrimedTekiyo = "値引" Then
>    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
>    .Cells(lngPresentRowIndex, 6).Value = strKingaku
>   Else
>    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
>    .Cells(lngPresentRowIndex, 3).Value = strSuryo
>    .Cells(lngPresentRowIndex, 4).Value = strTani
>   End If
   lngPresentRowIndex = lngPresentRowIndex + 1 + InsertLine
                    'インデックスを加算 ◆変更
>  Next

試してないのですが。。

【61971】Re:行の挿入について
発言  Yuki  - 09/6/15(月) 15:13 -

引用なし
パスワード
   ▼mori さん:

横から失礼します。

If strTrimedTekiyo = "合計" Then
  .Rows(lngRow + 1).Insert 追加
  ↑を忘れないように
>
> For lngRow = lngMaxRow To 31 Step -1
>シートの最上部に現れ、逆方向に挿入されていました。

lngPresentRowIndex = 4 + (lngMaxRow - 31)  変更
For lngRow = lngMaxRow To 31 Step -1    変更 


lngPresentRowIndex = lngPresentRowIndex - 1 変更で
どうでしょう。

【61973】Re:行の挿入について
発言  かみちゃん  - 09/6/15(月) 15:32 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>> Rows(lngRow + 1).Insert Shift:=xlDown
> を挿入しましたが、行挿入はできませんでした。
> 何も変わらずでした。

もしかして、
 If strTrimedTekiyo = "合計" Then
は、判定できているのでしょうか?

 If strTrimedTekiyo = "合計" Then
  MsgBox "合計行です" & lngRow
  .Rows(lngRow + 1).Insert 追加
  ' ↑を忘れないように

としてみたらいかがですか?
たしかにYukiさんのおっしゃるとおり、
Rows
ではなく
.Rows
かもしれません。

> 手を加えたりしたのですが、行挿入どころか「合計」が
> 消えてしまったり、行挿入はできなかったりという状況です。
>
>> For lngRow = lngMaxRow To 31 Step -1
>>として、下方向から繰り返し処理したほうがいいと思います。
>下方向からの繰り返しという処理はわかったのですが、この処理を
>するとCSVファイルから逆(最下部)から拾ってくるのではない
>でしょうか?
>現に実行してみたら、CSVファイルの最下部がマクロが入っている
>シートの最上部に現れ、逆方向に挿入されていました。

CSVのサンプルデータや、
シートレイアウトが示されていないので、検証のしようがありません。
そもそも、コードの提示をもっと早い段階でしていただきたかったと思います。

【61974】Re:行の挿入について
お礼  mori  - 09/6/15(月) 15:32 -

引用なし
パスワード
   kanabun さん

早速のお返事をありがとうございます。

早速試してみました。。。

うまくいきました!

ありがとうございました。


他にも手段があると思うので、もっと勉強したいと思います。

【61976】Re:行の挿入について
発言  mori  - 09/6/15(月) 15:36 -

引用なし
パスワード
   Yuki さん

早速のお返事をありがとうございます。

なかなかうまくいきません。。。
ご指摘のところを変更したのですが・・・

【61977】Re:行の挿入について
お礼  mori  - 09/6/15(月) 15:52 -

引用なし
パスワード
   かみちゃん さん

本当に何度も何度もありがとうございました。
ご迷惑をお掛けして申し訳ありませんでした。

これを機にもっと勉強します。


合計行の判定はできています。
(他の条件を処理しています)

kanabunさんの処理で一先ずは空白行の挿入ができました。

ありがとうございました。

【61996】Re:行の挿入について
質問  mori  - 09/6/16(火) 14:30 -

引用なし
パスワード
   kanabun さん

先日はありがとうございました。

前回は「合計」と記入されているセルがある行の下に1行挿入したいと
言うことでした。
この逆(「合計」と記入されているセルがある行の「上」に1行挿入
したい)と言うのは可能でしょうか?

【61998】Re:行の挿入について
発言  kanabun  - 09/6/16(火) 15:17 -

引用なし
パスワード
   ▼mori さん:

>前回は「合計」と記入されているセルがある行の下に1行挿入したいと
>言うことでした。
>この逆(「合計」と記入されているセルがある行の「上」に1行挿入
>したい)と言うのは可能でしょうか?

これまでのコードは 転記処理のFor〜Nextループに入る前に
書き込み先の行番号(lngPresentRowIndex)に 4 を入れておいて、
1行書き込み処理が終わったら、「次に書き込む行番号」を指定するために
lngPresentRowIndex に1を加えていました。
その後、値が「合計」だったときだけ、「次の書き込み先行番号」に 2 を
加える処理を追加して、結果として1行空白行を挿入した転記処理を実現す
るように改良しました。

>  lngPresentRowIndex = 4
>  For lngRow = 31 To lngMaxRow
>
>    '転記処理
>
>    If 値が「合計」ならば
      lngPresentRowIndex = lngPresentRowIndex + 2 '次の転記行番号
    Else
      lngPresentRowIndex = lngPresentRowIndex + 1 '次の転記行番号
    End If
>  Next

こんどはこれを
   '最初の書き込み行番号 - 1 を初期値とする
◆  lngPresentRowIndex = 4 - 1

としておいて、
◆ For〜Loopの先頭で 行番号を 現在の値に +1 する
◆  ただし、値が「合計のときは」さらに +1 した行に、転記する

という風にすればよいと思います。


  'Dim InsertLine As Long (不要)
  lngPresentRowIndex = 4 - 1 '◆変更(本来の開始行-1)
  For lngRow = 31 To lngMaxRow
      
   (途中省略)

   '書き込み行インデックスを加算
   lngPresentRowIndex = lngPresentRowIndex + 1 '◆ここへ移動

   If strTrimedTekiyo = "合計" Then
    lngPresentRowIndex = lngPresentRowIndex + 1 '◆この行追加
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku

   ElseIf strTrimedTekiyo = "値引" Then
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku

   Else
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 3).Value = strSuryo
    .Cells(lngPresentRowIndex, 4).Value = strTani
   End If

  Next

かんちがいなら、ゴメン。

【62001】Re:行の挿入について
発言  mori  - 09/6/16(火) 15:44 -

引用なし
パスワード
   kanabun さん

早速のお返事をありがとうございます。

もう一つ質問ですが・・・
「合計」の下に1行追加と「値引」の上に1行追加と言うのは
同居できるものなのでしょうか?

【62005】Re:行の挿入について
発言  kanabun  - 09/6/16(火) 16:13 -

引用なし
パスワード
   ▼mori さん:

>もう一つ質問ですが・・・
>「合計」の下に1行追加と「値引」の上に1行追加と言うのは
>同居できるものなのでしょうか?

転記してから次の書き込み行を1行ジャンプするか、
転記する前に1行ジャンプしておくかの違いだけなので
2つを合成すればいいと思いますが?

  lngPresentRowIndex = 4 '◆(書き込み開始行の初期値)
  For lngRow = 31 To lngMaxRow
   
   (途中省略)

   If strTrimedTekiyo = "合計" Then
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku
    lngPresentRowIndex = lngPresentRowIndex + 1 '◆下に1行空白

   ElseIf strTrimedTekiyo = "値引" Then
    lngPresentRowIndex = lngPresentRowIndex + 1 '◆1行空白挿入してから転記
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku

   Else
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 3).Value = strSuryo
    .Cells(lngPresentRowIndex, 4).Value = strTani
   End If
   lngPresentRowIndex = lngPresentRowIndex + 1 '◆ 次の書き込み行

  Next

【62008】Re:行の挿入について
発言  mori  - 09/6/16(火) 17:03 -

引用なし
パスワード
   kanabun さん

度々申し訳ありません。

「合計」の下に1行追加と「値引」の上に1行追加と言うのは
問題なくできたのですが、他の処理(今回のところで言うと
次にある「式」の下(上)に1行追加)の場所では、
挿入されません。

.Cells・・・の前後に先程の
lngPresentRowIndex = lngPresentRowIndex + 1
を挿入すれば、そのセルに代入される前後に行が挿入されると
思っていたのですが・・・

【62009】Re:行の挿入について
発言  kanabun  - 09/6/16(火) 17:42 -

引用なし
パスワード
   ▼mori さん:

>「合計」の下に1行追加と「値引」の上に1行追加と言うのは
>問題なくできたのですが、他の処理(今回のところで言うと
>次にある「式」の下(上)に1行追加)の場所では、
>挿入されません。

これから私用で出かけますので私はもうこれ以上レスできませんが、

> 「他の処理」
> 次にある「式」

これらについてもう少し説明が必要なような?
転記データを先読みするという処理が加わるわけですか?

【62012】Re:行の挿入について
発言  かみちゃん  - 09/6/16(火) 23:30 -

引用なし
パスワード
   こんにちは。かみちゃん です。

まだご覧になっておられますでしょうか?
kanabunさんのアドバイスが続いていますので、私の出番はもうなさそうですが、

>> If strTrimedTekiyo = "合計" Then
>>の行番号は、
>>変数lngRowなのではないでしょうか?
>私もそういう受け取り方をしています。
>
>しかしながら、
>> Rows(lngRow + 1).Insert Shift:=xlDown
>を挿入しましたが、行挿入はできませんでした。
>何も変わらずでした。
>手を加えたりしたのですが、行挿入どころか「合計」が
>消えてしまったり、行挿入はできなかったりという状況です。
>
>> For lngRow = lngMaxRow To 31 Step -1
>>として、下方向から繰り返し処理したほうがいいと思います。
>下方向からの繰り返しという処理はわかったのですが、この処理を
>するとCSVファイルから逆(最下部)から拾ってくるのではない
>でしょうか?
>現に実行してみたら、CSVファイルの最下部がマクロが入っている
>シートの最上部に現れ、逆方向に挿入されていました。

CSVファイルの内容がよくわからないので、具体的なアドバイスが難しいのですが、
[61961]で提示したコードは、以下のようなシートレイアウトで実行すると、
きちんと「合計」の次の行に挿入されます。
新規ブックで一度ご確認いただいたほうがいいかもしれません。

  A  B
1 あ
2 い
3 う
4 合計
5 え
6 お
7 か
8 き
9 合計
10 く
11

Sub Sample2()
 Dim lngRow As Long
 Dim lngRowMax As Long

 lngRowMax = Range("A" & Rows.Count).End(xlUp).Row
 For lngRow = lngRowMax To 1 Step -1
  If Cells(lngRow, 1).Value = "合計" Then
   Rows(lngRow + 1).Insert Shift:=xlDown
  End If
 Next
End Sub

【62013】Re:行の挿入について
発言  kanabun  - 09/6/17(水) 0:38 -

引用なし
パスワード
   ▼mori さん:

>「合計」の下に1行追加と「値引」の上に1行追加と言うのは
>問題なくできたのですが、他の処理(今回のところで言うと
>次にある「式」の下(上)に1行追加)の場所では、
>挿入されません。

後半の部分については moriさんからもう少し具体的な説明が
あるまで回答を控えさせていただきます。

ところで、
ひとつ 重要なことを考慮していなかったので
その部分を修正したコードを投稿しておきます。
その部分とは 1列目の転記が 「合計」か「値引」かの
条件のまえで実行されていたため、
他の列と同じ行に転記されていなかったことです。
以下に 1列目も 条件節の中に入れたものを示します。
こちらのデバッグの都合上、また列の内容を理解しやすく
するため、変数を日本語などに変えていますのでご了承を。

Sub CreateMitsumori▲3()

 Dim i          As Long
 Dim j          As Long
 Dim lngMaxRow      As Long
 Dim newLine       As Long
 Dim 行番号 As String
 Dim 適用 As String
 Dim 数量 As String
 Dim 単位 As String
 Dim 単価 As String
 Dim 金額 As String
 Dim Trim適用 As String '適用項目 トリミング後

 With Worksheets(3)
  '一時シートから行数を取得
  lngMaxRow = Worksheets("TMP1").Cells(Rows.Count, 1) _
        .End(xlUp).Row
  j = 1
  For i = 31 To lngMaxRow
   If j = 1 Then
   ElseIf j Mod 29 = 1 Then
    'A列〜U列まで 29行をCopy
    .Range("A4").Resize(29, 21).Copy .Cells(j + 3)
    With .Cells(j + 3).Resize(29, 21)
      .RowHeight = 27
      Worksheets(3).PageSetup.PrintArea = .Cells
    End With
   End If
   j = j + 1
  Next

  newLine = 4       '◆最初の貼り付け先行番号
  For i = 31 To lngMaxRow
   
   行番号 = Worksheets("TMP1").Cells(i, 1).Value
   適用 = Worksheets("TMP1").Cells(i, 2).Value
   数量 = Worksheets("TMP1").Cells(i, 3).Value
   単位 = Worksheets("TMP1").Cells(i, 4).Value
   単価 = Worksheets("TMP1").Cells(i, 5).Value
   金額 = Worksheets("TMP1").Cells(i, 6).Value

   'マイナス行番号を カッコ付き行番号にします
   If 行番号 Like "-*" Then
    行番号 = "'(" & Mid(行番号, 2) & ")"
   End If

   '文字列チェック
   Trim適用 = Application.Trim(適用)
   If InStr(Trim適用, "値引") Then '値引があれば
    Trim適用 = "値引"       '値引を抜き出します
   End If

   '転記開始
   If Trim適用 = "合計" Then
    '合計がある場合、小計欄のみに金額を挿入
    .Cells(newLine, 1).Value = 行番号
    .Cells(newLine, 2).Value = 適用
    .Cells(newLine, 6).Value = 金額
    newLine = newLine + 1      '◆前方空行挿入
   
   ElseIf Trim適用 = "値引" Then
    newLine = newLine + 1      '◆後方空行挿入
    .Cells(newLine, 1).Value = 行番号
    .Cells(newLine, 2).Value = 適用
    .Cells(newLine, 6).Value = 金額
   
   Else
    .Cells(newLine, 1).Value = 行番号
    .Cells(newLine, 2).Value = 適用
    .Cells(newLine, 3).Value = 数量
    .Cells(newLine, 4).Value = 単位
   End If
   newLine = newLine + 1       '◆次の転記行

  Next

 End With

End Sub

【62015】Re:行の挿入について
発言  Yuki  - 09/6/17(水) 8:29 -

引用なし
パスワード
   ▼mori さん:

横から失礼
このようでどうでしょう。

逆回しで
'  lngPresentRowIndex = 4
'  For lngRow = 31 To lngMaxRow
  lngPresentRowIndex = 4 + (lngMaxRow - 31)   ' 此処
  For lngRow = lngMaxRow To 31 Step -1     ' 此処
  
   strGyoNO = Worksheets("TMP1").Cells(lngRow, 1).Value
   strTekiyo = Worksheets("TMP1").Cells(lngRow, 2).Value
   strSuryo = Worksheets("TMP1").Cells(lngRow, 3).Value
   strTani = Worksheets("TMP1").Cells(lngRow, 4).Value
   strTanka = Worksheets("TMP1").Cells(lngRow, 5).Value
   strKingaku = Worksheets("TMP1").Cells(lngRow, 6).Value
   strSyokei = Worksheets("TMP1").Cells(lngRow, 6).Value
 
   If Left(strGyoNO, 1) = "-" Then
    lngLength = Len(strGyoNO)
    strKakkoGyoNO = Mid(strGyoNO, 2, lngLength - 1)
    strKakkoGyoNO = "'(" & strKakkoGyoNO & ")"
    .Cells(lngPresentRowIndex, 1).Value = strKakkoGyoNO
   Else
    .Cells(lngPresentRowIndex, 1).Value = strGyoNO
   End If
 
   '文字列チェック
   strTrimedTekiyo = strTekiyo
   strTrimedTekiyo = StrConv(strTrimedTekiyo, 4)
   strTrimedTekiyo = Replace(strTrimedTekiyo, " ", "")
   lngTekiyoLength = InStr(strTrimedTekiyo, "値引")
   If lngTekiyoLength > 0 Then
    strTrimedTekiyo = Mid(strTrimedTekiyo, lngTekiyoLength, 2)
   End If
 
   If strTrimedTekiyo = "合計" Then
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku
'    .Rows(lngPresentRowIndex).Insert    ' 合計の上
    .Rows(lngPresentRowIndex + 1).Insert  ' 合計の下    ' 此処
   ElseIf strTrimedTekiyo = "値引" Then
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 6).Value = strKingaku
    .Rows(lngPresentRowIndex).Insert     ' 値引の上   ' 此処
   Else
    .Cells(lngPresentRowIndex, 2).Value = strTekiyo
    .Cells(lngPresentRowIndex, 3).Value = strSuryo
    .Cells(lngPresentRowIndex, 4).Value = strTani
   End If
   lngPresentRowIndex = lngPresentRowIndex - 1 'インデックスを減算   ' 此処
  Next

【62016】Re:行の挿入について
発言  mori  - 09/6/17(水) 10:00 -

引用なし
パスワード
   kanabun さん
何度も何度も申し訳ありません。

後半部分についてなのですが。

If str単位 = "式" And str単価 = "" Then
  .Cells(lngPresentRowIndex, 6).Value = str金額
 Else
  .Cells(lngPresentRowIndex, 5).Value = str単価
  .Cells(lngPresentRowIndex, 6).Value = str金額
End If

単位欄に「式」、単価欄に「空白」が記入されている行の前に空白行を
入れる場合・・・と言うことです。


「合計」、「値引」の応用で大丈夫かと何度も挑戦してみているのですが、
どうしても「式」(単位欄は空白)の下にしか行が挿入されずにいます。
「式」の上に行挿入する場合は、「値引」のときのような方法ではだめなの
でしょうか?

【62017】Re:行の挿入について
発言  kanabun  - 09/6/17(水) 11:12 -

引用なし
パスワード
   ▼mori さん:

>kanabun さん
>何度も何度も申し訳ありません。
いえいえ、、、ひまなんでお付き合いさせていただきますよ(^^


>単位欄に「式」、単価欄に「空白」が記入されている行の前に空白行を
>入れる場合・・・と言うことです。
>
>
>「合計」、「値引」の応用で大丈夫かと何度も挑戦してみているのですが、
>どうしても「式」(単位欄は空白)の下にしか行が挿入されずにいます。
>「式」の上に行挿入する場合は、「値引」のときのような方法ではだめなの
>でしょうか?

上か、下かに「空行挿入」というのは、このケースでは、結局、
転記先の行を
      「1行ジャンプしてから」転記したり、 --- 上に空行挿入
「転記後に 次の転記行を+2とする」       --- 下に空行挿入
と操作することだと思います。

で、

   '転記開始
   If Trim適用 = "合計" Then
    .Cells(newLine, 1).Value = str行番号
    .Cells(newLine, 2).Value = str適用
    .Cells(newLine, 6).Value = str金額
    newLine = newLine + 1      '◆下に空行挿入
   
   ElseIf Trim適用 = "値引" Then
    newLine = newLine + 1      '◆上に空行挿入
    .Cells(newLine, 1).Value = str行番号
    .Cells(newLine, 2).Value = str適用
    .Cells(newLine, 6).Value = str金額
   
   Else
    .Cells(newLine, 1).Value = str行番号
    .Cells(newLine, 2).Value = str適用
    .Cells(newLine, 3).Value = str数量
    .Cells(newLine, 4).Value = str単位
   End If
   newLine = newLine + 1       '◆次の転記行

  Next



>後半部分についてなのですが。
>
>If str単位 = "式" And str単価 = "" Then
>  .Cells(lngPresentRowIndex, 6).Value = str金額
> Else
>  .Cells(lngPresentRowIndex, 5).Value = str単価
>  .Cells(lngPresentRowIndex, 6).Value = str金額
>End If

とを、どう総合するか ということですが、
いちど日本語で説明してもらえませんか?
要は、【判定順序】 です。

たとえば、
> 単位欄に「式」、単価欄に「空白」が記入されている
かどうかだけを調べて
(1) str単位が "式" で かつ str単価 が空白だったら、
   ◆1行開けて
   str金額を 6列目に書き込む
(2) それ以外はすべて
   str単価を5列目に、 str金額 を6列目に書き込む

とするだけでは、それ以外のすべてが
  5列目に str単価が、 6列目に str金額 が書き込まれる
だけで
思惑と違った結果になるでしょう?


たとえば
(1)Trim適用 が 「合計」か「値引」のとき
  (1-1) str単位が "式" で かつ str単価 が空白だったら
    ◆1行空けて str金額→ 6列目に転記
  (1-2) Trim適用 が "値引" のときは
    ◆1行空けて str金額→ 6列目に転記
  (1-3) Trim適用 が "合計" のときは
    str金額→ 6列目に転記 ◆転記してから1行飛ばす

(2)それ以外のときは
    str数量 を 3列目に、
    str単位 を 4列目に 転記する

とするのか?

あなたが部下に 転記させるとしたら、どのように条件を
教えますか?
とりあえずこのコレコレのときは どこにどの欄をの
判定条件が(手順が)明確化される必要があります。

【62019】Re:行の挿入について
発言  kanabun  - 09/6/17(水) 11:30 -

引用なし
パスワード
   元のシートのレイアウトと

【TMP1】シートの30行目から
 行番号  適用  数量  単位  単価  金額
  (1)   ---   30   本   100  3000
  (2)   ---  100   本   50  5000
  15   合計            8000
  25   値引き            ?
  ..
  ..

 
転記後のシートのレイアウト
があると分かりやすいですね。
(とくに 「適用」欄にどんな記載があるのか などが分かるようなものが)

【62021】Re:行の挿入について
発言  mori  - 09/6/17(水) 13:02 -

引用なし
パスワード
   kanabun さん

このスレッドが長くなりすぎたので、別スレッドに移動します。
よろしくお願い致します。

【62025】Re:行の挿入について
お礼  mori  - 09/6/17(水) 13:43 -

引用なし
パスワード
   かみちゃん さん

度重なるご回答をありがとうございます。
お返事が遅くなってしまって、申し訳ありません。

かみちゃんさんが仰るように、新規bookで試したところ、
「合計」行の下に空白行が挿入されました。

でも、私が作ったものでは挿入されないままです。
なので、私の作った内部で何かがおかしくなっているのだと思います。。。

一つずつ検証していかねばならないです。

本当にありがとうございます。

【62026】Re:行の挿入について
お礼  mori  - 09/6/17(水) 13:48 -

引用なし
パスワード
   Yuki さん

何度もありがとうございます。

私がしたい事ができました!!!
ありがとうございました。

Yukiさんの場合は下からでしたが、当然、他の方法もある訳ですよね?

もっともっと勉強します。

本当にありがとうございました。

3473 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free