[[20161015144743]] 『条件文がいまいち不案内』(snb1001) ページの最後に飛ぶ

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

 

『条件文がいまいち不案内』(snb1001)

 いつもお世話になっております。
またわからないことが出てきましたので
教えを乞いたく存じます。

   M列     N列   O列  
9  16-11P/売		#N/A	
10 16000	95		
11 16-11P/買	370		
12 17000		#N/A	
13 16-11P/売		#N/A	
14 16625	230		
15 16-11C/買	115		
16 17375		#N/A	

こんな感じの表があります。
#N/Aには数字が入っています。

やりたいことは「M9」のセル内に「売」という文字が
入っているので「O9」のセルの値を下の「O10」
にコピーして「O9」の数値を消します。

また、「M11」のセル内には、「買」という文字が
入っているので「O12」のセルの値を一つ上の「O11」
にコピーして「O12」の数値を消します。

以下順番にM13、M15、・・・と見ていきます。
時にO列が空欄のところもあるかもしれませんが
その時もスルーで空欄をコピー。

そこで、こんなマクロを組んでみましたが
条件文がいまいち不案内のままです。

Sub 反転に()

Dim r As Range
Dim adr1 As String, adr2 As String, adr3 As String

    Dim col As Range
    Dim col2 As Range
    Set r = Range("M9:O26") '★対象となる範囲
    adr1 = r.Cells(1).Address(False, False)

IF adr1=*買* THEN

    adr1.Cells(3).Select
    Selection.Copy
    adr1.Cells(3,1).Select
    ActiveSheet.Paste

    adr1.Cells(3).Select
    Application.CutCopyMode = False
    Selection.ClearContents
 END IF

IF adr1=*売* THEN

    adr1.Cells(3).Select
    Selection.Copy
    adr1.Cells(3, 1).Select
    ActiveSheet.Paste

    adr1.Offset(3, 1).Select
    Application.CutCopyMode = False
    Selection.ClearContents

 END IF

End Sub

なお、例の表にあるようにいつも2行ずつ
一まとまりになっており上のセルはM列に「買」
という文字を見つけると上のセルに、「売」と
いう文字を見つけると下のセルに自動的に入ります。

ただ、売り・買いの反転作業を経ると
O列はそのまま残ってしまいその場合の
後処理を手作業で行っていますが
ちょっと危ういのです。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


>IF adr1=*買* THEN

Like演算子 を使って比較してください。

参考URL>>
http://www.239-programing.com/excel-vba/basic/basic044.html
http://span.jp/office2010_manual/excel_vba/practical/like-operator.html
https://www.moug.net/tech/exvba/0140043.html
(まっつわん) 2016/10/15(土) 15:27


 >>#N/Aには数字が入っています。 

 この意味がわかりません。数字が入っているのに、なぜ #N/A と表示されているのですか?

 >>ただ、売り・買いの反転作業を経ると 
 >>O列はそのまま残ってしまい

 アップされたコード、未実行ですけど、実行するとそうなるのですか?

 >>にあるようにいつも2行ずつ一まとまりになっており

 2行1かたまりの上の行のA列セルの文字列の最後が 売 または 買 ということですね?

(β) 2016/10/15(土) 15:29


 もう何点か。

 >>条件文がいまいち不案内のままです

 条件文のみならず、領域の記述ルールも、参考書ないしはネットの解説ページで勉強をされたほうがよろしいかと。

 なにか.Cells(1) といった記述を行う場合、「なにか」は Rangeオブジェクトでなければいけません。

 Adr1.Cells(1) という記述だと、Adr1 がRangeオブジェクトではなく、単なる文字列なのでエラーになります。

 また、adr1.Offset(3, 1).Select
 adr1. はだめですけど、それ以外に、Offset(3,1) は、基準セルの 3行下、1列右 をさします。
 なんかおかしいですね。
 また、この Select したセルを、どこでも利用してませんね。

(β) 2016/10/15(土) 15:39


 説明文通りに処理をするとアップされた例では、O列がすべて空白になりますが、それでいいのですか?

(β) 2016/10/15(土) 15:53


結局、売りでも買でも上下のセルを入れ替えるのは同じですよね?

Sub test2()

    Dim Rng As Range
    Dim ixRow As Long

    Set Rng = Range(Range("M9"), Cells(Rows.Count, "M").End(xlUp))

    For ixRow = 1 To Rng.Count Step 2
        Rng(ixRow, 3).Cut
        Rng(ixRow + 2, 3).Insert xlShiftDown
    Next
End Sub
(まっつわん) 2016/10/15(土) 16:44

 コメントした通り、説明文の通りに処理すると、例示のケースでは ??? になりますが、
 とりあえず。

 Sub Sample()
    Dim i As Long

    For i = 9 To Range("N" & Rows.Count).End(xlUp).Row Step 2
        Select Case Right(Range("N" & i).Value, 1)
            Case "売"
                Range("O" & i + 1).Value = Range("O" & i).Value
                Range("O" & i).ClearContents
            Case "買"
                Range("O" & i).Value = Range("O" & i + 1).Value
                Range("O" & i + 1).ClearContents
        End Select
    Next

 End Sub

(β) 2016/10/15(土) 17:30


こんばんは。

だいぶ時間がたってしまっている間に
マクロまで作っていただいていて
大変、恐縮しております。

まっつわんさま、βさま
ありがとうございます。

さて、当初の私の説明があまりにマズく
みなさまに多くの混乱をおこさせてしまいました。
失礼しました。

さて、結論ですが、まっつわんさまの
ご指摘通りでした。

条件の「売」「買」は関係なくただ
上下の入れ替えで済む話でした。
これも、言われてみて初めて
気が付いたことでした。

この間、
最初の表で#N/Aをそのままにして、コピーペイストしてしまったことで
(このエラー表示の意味がよくわかっていませんでした。)βさまに
失礼してしまいました。
また、アップしたマクロはコンパイルすらできないまま
「こんな雰囲気」みたいな感じの手抜きのマクロとも呼べない
しろものでした。

にもかかわらず、βさまには「説明文通りに」処理したマクロを
書いてくださりほんとうにありがとうございます。頭が下がる思いです。

このマクロ、わたしの今の知識では
まったく歯が立ちませんので、
私の勉強用に表を書き換えながら
研究させていただきます。
改めて、ありがとうございました。

(snb1001) 2016/10/15(土) 23:03


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.