[[20160615090431]] 『ExcelVBAについて』(わんこそば) ページの最後に飛ぶ

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

 

『ExcelVBAについて』(わんこそば)

初めての投稿です。

ExcelVBAについての質問です。

私は今マクロでとあるコードを書いているのですが、一部に詰まってしまっています。

?@-1.シート1のF列に記入されている文字が"A"の場合
2.h1=I1 & J1=K1の時シート2に記入されているh1=I1・j1=K1と数字と同じものをそれぞれ探してA列の文字列をシート1のG列に記入
(書き方:〇/〇)丸の左には数字が、右には英字が入ります。
?A.共通条件
1.h1≠I1 & J1=K1の時シート2に記入されているものからh1・I1・j1=K1に記入されている数字と同じものをそれぞれ探してA列の文字列をシート1のG列に記入
(書き方:〇-〇/〇)
2.h1=I1 & J1≠K1の時シート2に記入されている文字ものからh1=I1・J1・K1に記入されている数字と同じものを探してA列の文字列をシートのG列に記入
(書き方:〇/〇-〇)
3.h1≠I1 & j1≠K1の時シート2に記入されている文字ものからh1・I1・J1=K1に記入されている数字と同じものを探してA列の文字列をシートのG列に記入
(書き方:〇-〇/〇-〇)
4.h1≠I1 & J1=K1の時シート2に記入されている文字ものからh1=I1・J1・K1に記入されている数字と同じものを探して同じ数字がない場合にシート2の表の中での中間を取ってA列の文字列をシートのG列に記入
(例)h1&I1=2600の時下記のシートからみて取ってくるものはA列の"4"と"3"
なのでG列に書き込まれるものは4-3/〇
(書き方:〇-〇/〇)
5.h1=I1 & J1≠K1の時
上記共通条件の4と同じ
(書き方:〇/〇-〇)
6.h1≠I1 & j1≠K1の時
共通条件の4と同じ
(書き方:〇-〇/〇-〇)

シート2
(A列) (B列) (C列)
F 数字 数字
E 数字 数字
D 数字 ・
C 数字 ・
B 数字
A 数字
5 ・
4 2800 40,000
3 2500
2
1

(作成したコード)

Sub 位置情報()

Dim i As Long

Dim sh1, sh2 As Worksheets

Set sh1 = Worksheets("Sheet1")

Set sh2 = Worksheets("Sheet2")

For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row

'X軸'

If sh1.Cells(i, 8) <> sh1.Cells(i, 9) Then

 If sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then

sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)

ElseIf sh1.Cells(i, 8) <> sh1.Cells(i, 9) Then

sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)

ElseIf sh1.Cells(i, 8) = sh1.Cells(i, 9) Then

 ElseIf sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then

sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)

Else

sh2.Cells(i, 4) = sh2.Cells(i, 3 - 1)

End If

'Y軸'

If sh1.Cells(i, 10) <> sh1.Cells(i, 11) Then

 If sh2.Cells(i, 2) < sh1.Cells(i, 10) And sh2.Cells(i, 3) < sh1.Cells(i, 11) Then

sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)

ElseIf sh1.Cells(i, 10) <> sh1.Cells(i, 11) Then

sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)

ElseIf sh1.Cells(i, 10) = sh1.Cells(i, 11) Then

 ElseIf sh2.Cells(i, 2) < sh1.Cells(i, 10) And sh2.Cells(i, 3) < sh1.Cells(i, 11) Then

sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)

Else

sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1)

End If

Cells(i, 7) = sh2.Cells(i, 4) & "/" & sh2.Cells(i, 5)

End If

Next i

End Sub

とこのような条件のもと上記のコードを作成したのですがうまく動いてくれません。

みなさまどうかこのコードの完成を手伝っていただけないでしょうか?

長々と失礼いたしました。よろしくお願いいたします。

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


ステップ実行し、間違っている行を特定してください。こういう作業をデバッグと言います。
自分で書いたコードは、自分でデバッグするものです。他人に後始末させるのは、横綱か介護される人か赤ちゃんくらいなものです。

アドバイス。
(1)ループやIf文の範囲を明確にするため、TABで段付けする。
(2)「ツール」−「オプション」で、「変数の宣言を強制する」。
(3)変数宣言にマルチステートメントは使わないこと。

 Sub 位置情報()
    Dim i As Long
    Dim sh1 As Worksheets
    Dim sh2 As Worksheets

    Set sh1 = Worksheets("Sheet1")
    Set sh2 = Worksheets("Sheet2")

    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        'X軸'
        If sh1.Cells(i, 8) <> sh1.Cells(i, 9) Then
            If sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then
                sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)
            ElseIf sh1.Cells(i, 8) <> sh1.Cells(i, 9) Then
                sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)
            ElseIf sh1.Cells(i, 8) = sh1.Cells(i, 9) Then
            ElseIf sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then
                sh2.Cells(i, 4) = sh2.Cells(i, 2 - 1) & "-" & sh2.Cells(i, 2 - 2)
            Else
                sh2.Cells(i, 4) = sh2.Cells(i, 3 - 1)
            End If
        '【あれ、この辺にEnd Ifが足りないのでは?】

        'Y軸'
        If sh1.Cells(i, 10) <> sh1.Cells(i, 11) Then
            If sh2.Cells(i, 2) < sh1.Cells(i, 10) And sh2.Cells(i, 3) < sh1.Cells(i, 11) Then
                sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)
            ElseIf sh1.Cells(i, 10) <> sh1.Cells(i, 11) Then
                sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)
            ElseIf sh1.Cells(i, 10) = sh1.Cells(i, 11) Then
            ElseIf sh2.Cells(i, 2) < sh1.Cells(i, 10) And sh2.Cells(i, 3) < sh1.Cells(i, 11) Then
                sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1) & "-" & sh2.Cells(i, 3 - 2)
            Else
                sh2.Cells(i, 5) = sh2.Cells(i, 3 - 1)
            End If
            Cells(i, 7) = sh2.Cells(i, 4) & "/" & sh2.Cells(i, 5)
        End If
    Next i
 End Sub
(???) 2016/06/15(水) 09:34

さっそくのご回答ありがとうございます。

確かに人に任せるのはだめですね、すみません。

質問の内容をかえます。
条件の中に表1のH列とI列・J列とK列の数字をみてシート2の表の中にその数字がない場合、その表の中の数字の中間をとってくるという条件を式にした場合どのような書き方をすればいいのか色々調べてみたのですがどうしてもわかりません。

(例)下記の表で表すとH列=I列のとき、H・Iの数字が2600とします。
そうすると条件としてシートに書き込まれるものはシート2のB列の「2800」と「2500」の中間なので「4」と「3」になる。
シート2
(A列) (B列) (C列)
F 数字 数字
E 数字 数字
D 数字 ・
C 数字 ・
B 数字
A 数字
5 ・
4 2800 40,000
3 2500
2
1

このような条件をどう書いていいのかがわからなかったため現在は
sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then
のような式を記入しています。

答えでなくともヒントだけでもいただけたらと思います。
よろしくお願いいたします。

(わんこそば) 2016/06/15(水) 09:51


シート1のデータを書いていただいていないので、何を言われてもさっぱり…。
A列B列と、アルファベットで語るならば、コーディングも sh2.Cells(i, "E").Value のようにしてください。

でもって、間違えているのはおそらく、sh2.Cells(i, 2) という書き方。これはi行2列なので、

 > sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then 

これはシート1もシート2も全て同じ行を見ていますが、やりたいことは現在行と次行の値を調べるのですよね?
それと、シート1の行と、シート2の行は同じで良いのですか?
(???) 2016/06/15(水) 10:24


ご回答ありがとうございます。

シートの内容を書くのをすっかり忘れてしまっていました。
すみません。

シート1で条件に必要な列はH・I・J・K列です。
シート2で条件に必要な列はB・C列です。
H・I・J・K列には数字が記入されており、最終的に記入する列はシート1のG列になります。
ですが、何分初心者なもので条件が多すぎて一気にまとめるということができなかったので
いったんシート2のD列・E列に途中のものを記入してから最終的にD列とE列に記入されているものに"/"を挟んでG列に記入させようとしています。

データは3行目から記入されおり(変わる可能性があります)かなり大量にあります。(データ量未確定)

ほしい文字列はシート2の表のA列に記入されている英数字です。

G列には最終的にこの4パターンの記入方法になります。

(例)〇には数字が、 △には英字が記入されます。
1.〇/ △
2.〇/ △- △
3.〇-〇/ △
4.〇-〇/△- △

になります。

説明が下手ですみません。
よろしくお願いいたします。

(わんこそば) 2016/06/15(水) 10:45


具体的に、2つのシートにどういう数値が入っているのか、結果どのように出力されるかの実例を挙げて頂けると、意味が通じるかと思います。現状、条件はこの列です、だけ言われてもさっぱり…。いまのところ、具体的に判ったことは、比較元が2600で、比較先に2800と2500があれば、ここを対象にしたい、ということだけ。比較データが降順ソートされている、という事なのですかね?

また、一気に最終形態をコーディングしようとせず、1データだけ思ったように処理される事を確認。その後少しずつ処理を増やしていきましょう。

今知りたいのは、2行の数値間に値が含まれる行を見つけて…、という事かと思います。それに関しては、全部同じ行しか使ってないからでは?、ということを教えましたが、いかがでしょうか?
(???) 2016/06/15(水) 14:12


ご回答ありがとうございます。

シート1にはこのように数値が入っています。

 
 G列 H列  I列  J列  K列
位置情報X始点 X終点 Y始点 Y終点

	24000	24000	4800	4800
	24000	24000	4800	4800
	21600	17100	4800	4800
	21600	17100	4800	4800
	16800	17100	7200	7200
	21600	24000	7200	7200
	24000	24000	4800	9600
	24000	24000	4800	9600
	21600	24000	7200	7200
	21600	24000	7200	7200
	9600	9600	16800	16800
	9600	9600	21600	21600
	9600	9600	26400	26400
	16800	17100	9600	9600
	12000	12000	26400	26400
	21600	24000	7200	7200
	21600	24000	7200	7200

シート2にはこのように数値が入っています。

A列  B列  C列  D列  E列

	X	Y   X結果 Y結果
F	0	28800
E	0	24000
D	0	19200
C	0	14400
B	0	9600
A	0	4800
5	24000	0
4	19200	0
3	14400	0
2	9600	0
1	4800	0

シート1はデータとしてもらうので固定です。
シート2は自分で作成知るので必ずこの数値というわけではないです。(書き方は同じです。)

最終的に記入するのはG列「位置情報」の部分です。

今知りたいのは、2行の数値間に値が含まれる行を見つけて…、という事かと思います。それに関しては、全部同じ行しか使ってないからでは?、ということを教えましたが、いかがでしょうか?

読解力が足りずどの部分かがわかりません。
申し訳ありません。

まずこの部分が必要なのかも怪しいです。
sh2.Cells(i, 2) < sh1.Cells(i, 8) And sh2.Cells(i, 3) < sh1.Cells(i, 9) Then

わからないことだらけで本当に申し訳ありません。

よろしくお願いいたします。

(わんこそば) 2016/06/15(水) 14:52


んー、データは判りやすくなりましたが、最初の条件と合っていない部分が。
(今更ですが、○に数字は機種固有文字であり、文字化けしますので、Web上で使ってはいけません)

例えば、最初の条件を見てみます。

 > (1)-1.シート1のF列に記入されている文字が"A"の場合 
 > 2.h1=I1 & J1=K1の時シート2に記入されているh1=I1・j1=K1と数字と同じものをそれぞれ探してA列の文字列をシート1のG列に記入 

F列なんて、データ例に出てきませんし、コード例でも使っていないような?
とりあえず無視して先を読みますね。

「h1=I1 & J1=K1の時」? 1行目は見出しに使っていて、「X始点」「X終点」「Y始点」「Y終点」なので、絶対一致しませんよね?
まぁこれも2行目以降の事なんだろうということで読み飛ばします。

2行目のデータは、「24000, 24000, 4800, 4800」なので該当しますね。この行で追ってみます。

「シート2に記入されているh1=I1・j1=K1と数字と同じもの」? シート2はE列までしか使っていませんよね?
これは「24000」「4800」の事を言っているのだろうと判断して、先に進みます。

「24000」は、シート2のB8セルにありますね。「4800」はシート2のC7セルかな。それぞれのA列の値は「5」「A」ですね。
つまり、シート1のG2セルには、「5/A」となれば良い。この解釈で正しいでしょうか?

ここまでのサンプルを書いてみますね。残りはご自分で考えてみてください。

 Sub 位置情報()
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim cx As String
    Dim cy As String
    Dim c1 As String
    Dim c2 As String
    Dim i As Long
    Dim j As Long

    Set sh1 = Worksheets("Sheet1")
    Set sh2 = Worksheets("Sheet2")

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row
        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And _
           sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then
            cx = sh1.Cells(i, "H").Value
            cy = sh1.Cells(i, "J").Value
            c1 = ""
            c2 = ""
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If cx = sh2.Cells(j, "B").Value Then
                    c1 = sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If cy = sh2.Cells(j, "C").Value Then
                    c2 = sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            If c1 <> "" And c2 <> "" Then
                sh1.Cells(i, "G").Value = c1 & "/" & c2
            End If
        End If
    Next i
 End Sub
(???) 2016/06/15(水) 16:04

ご回答ありがとうございます。

サンプルを試してみたところきちんと動きました。
ありがとうございます。

 > (1)-1.シート1のF列に記入されている文字が"A"の場合 
 > 2.h1=I1 & J1=K1の時シート2に記入されているh1=I1・j1=K1と数字と同じものをそれぞれ探してA列の文字列をシート1のG列に記入 

こちらの部分は必要なくなった部分です。
削除をし忘れていました。申し訳ありません。

厚かましいお願いとは存じますが、上記のコードはどの部分がなにをしているかだけ教えていただけないでしょうか?

また、二つほど前で質問させていただいた

>条件の中に表1のH列とI列・J列とK列の数字をみてシート2の表の中にその数字がない場合、その表の中の数字の中間をとってくるという条件を式にした場合どのような書き方をすればいいのか色々調べてみたのですがどうしてもわかりません。
(例)下記の表で表すとH列=I列のとき、H・Iの数字が2600とします。
そうすると条件としてシートに書き込まれるものはシート2のB列の「2800」と「2500」の中間なので「4」と「3」になる。
記入法:4-3/

の部分のご解説もいただけないでしょうか?
あとの部分はなんとか自分で作成しようと思います。

何度も長々と申し訳ありません。
よろしくお願いいたします。
(わんこそば) 2016/06/15(水) 16:36


元ソースはご自身で考えたのでしょうから、私の書いたものも読めるかと思いますよ。どの列なのかも判りやすくしましたし。
元になかったのは j のループであり、これが i のループだけでいいの?、という私の質問に対する答えになります。

今回の質問の元である、イコールなものが無い場合の処理ですが、私が書いた部分のロジックを抜けてもG列が代入されなかった場合(つまりイコールなものが無かった場合)というIfの後、jのループでイコールなものを探している部分を大小比較に変えれば良いかと思います。ただし、セル値が0なものは除外。今度は行と列の関係を間違えないように。(列をアルファベットにしたので、間違えないと思いますが)

大小比較で1行見つけた後、1行違うセルの値が、もう一つの情報になるでしょう。
(???) 2016/06/15(水) 17:39


ご回答ありがとうございます。

その方法で試したいと思います。

最後にもうひとつだけ If c1 <> "" And c2 <> "" Then
の部分のだけどうしてもわからないのでこの部分だけどういう意味なのかを教えていただけないでしょうか?

わかりやすいご説明本当にありがとうございます。
よろしくお願いいたします。
(わんこそば) 2016/06/15(水) 21:36


私が書いた部分は、いろいろな条件のあった最初のものだけに対応していて、XもYも一致するものがあった場合、の処理です。
c1はXに一致したものがあればセル値が入っていて、無ければ空欄です。c2はYについて同様。
両方共一致があれば、c1は空欄ではないし、c2も空欄ではないわけです。
「If c1 <> "" And c2 <> "" Then 」というのは、両方空欄でない事を判定しているのですね。
(???) 2016/06/16(木) 09:10

ご回答ありがとうございます。

いただいたコードを参考に自分なりに作成したのですが、やはり
>条件の中に表1のH列とI列・J列とK列の数字をみてシート2の表の中にその数字がない場合、その表の中の数字の中間をとってくるという条件を式にした場合どのような書き方をすればいいのか色々調べてみたのですがどうしてもわかりません。
(例)下記の表で表すとH列=I列のとき、H・Iの数字が2600とします。
そうすると条件としてシートに書き込まれるものはシート2のB列の「2800」と「2500」の中間なので「4」と「3」になる。
記入法:4-3/
の部分がどうしてもとけません。
文字列は出るのですが、「True-False/True-False」のような表記になってしまいます。

 Sub 位置情報()

    Dim sh1 As Worksheet

    Dim sh2 As Worksheet

    Dim x1 As String

    Dim x2 As String

    Dim y1 As String

    Dim y2 As String

    Dim c1 As String

    Dim c2 As String

    Dim c3 As String

    Dim c4 As String

    Dim i As Long

    Dim j As Long

    Set sh1 = Worksheets("Sheet1")

    Set sh2 = Worksheets("Sheet2")

    '数-数/英-英 表にない場合

   For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            x2 = sh1.Cells(i, "I").Value

            y1 = sh1.Cells(i, "J").Value

            y2 = sh1.Cells(i, "K").Value

            c1 = ""

            c2 = ""

            c3 = ""

            c4 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 <> sh2.Cells(j, "B").Value Then

                    c1 = x1 < sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x2 <> sh2.Cells(j, "B").Value Then

                    c2 = x2 > sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 <> sh2.Cells(j, "C").Value Then

                    c3 = y1 < sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y2 <> sh2.Cells(j, "C").Value Then

                    c4 = y2 > sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" And c4 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3 & "-" & c4

        End If

            End If

           Next i

    '数-数/英 表にない場合

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            x2 = sh1.Cells(i, "I").Value

            y1 = sh1.Cells(i, "J").Value

            c1 = ""

            c2 = ""

            c3 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 <> sh2.Cells(j, "B").Value Then

                    c1 = x1 > sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x2 <> sh2.Cells(j, "B").Value Then

                    c2 = x2 < sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 = sh2.Cells(j, "C").Value Then

                    c3 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3

            End If

                End If

        Next i

   '数/英-英 表にない場合

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            y1 = sh1.Cells(i, "J").Value

            y2 = sh1.Cells(i, "K").Value

            c1 = ""

            c2 = ""

            c3 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 = sh2.Cells(j, "B").Value Then

                    c1 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 <> sh2.Cells(j, "C").Value Then

                    c2 = y1 > sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y2 = sh2.Cells(j, "C").Value Then

                    c3 = y2 < sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3

            End If

                End If

        Next i

    '数/英

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            y1 = sh1.Cells(i, "J").Value

            c1 = ""

            c2 = ""

            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 = sh2.Cells(j, "B").Value Then

                    c1 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 = sh2.Cells(j, "C").Value Then

                    c2 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

            If c1 <> "" And c2 <> "" Then

                sh1.Cells(i, "G").Value = c1 & "/" & c2

            End If

        End If

    Next i

    '数-数/英

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value <> sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            x2 = sh1.Cells(i, "I").Value

            y1 = sh1.Cells(i, "J").Value

            c1 = ""

            c2 = ""

            c3 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 = sh2.Cells(j, "B").Value Then

                    c1 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x2 = sh2.Cells(j, "B").Value Then

                    c2 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 = sh2.Cells(j, "C").Value Then

                    c3 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3

            End If

                End If

        Next i

    '数/英-英

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value <> sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            y1 = sh1.Cells(i, "J").Value

            y2 = sh1.Cells(i, "K").Value

            c1 = ""

            c2 = ""

            c3 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 = sh2.Cells(j, "B").Value Then

                    c1 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 = sh2.Cells(j, "C").Value Then

                    c2 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y2 = sh2.Cells(j, "C").Value Then

                    c3 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "/" & c2 & "-" & c3

        End If

        End If

           Next i

    '数-数/英-英

  For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value <> sh1.Cells(i, "I").Value And sh1.Cells(i, "J").Value <> sh1.Cells(i, "K").Value Then

            x1 = sh1.Cells(i, "H").Value

            x2 = sh1.Cells(i, "I").Value

            y1 = sh1.Cells(i, "J").Value

            y2 = sh1.Cells(i, "K").Value

            c1 = ""

            c2 = ""

            c3 = ""

            c4 = ""

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x1 = sh2.Cells(j, "B").Value Then

                    c1 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

    For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If x2 = sh2.Cells(j, "B").Value Then

                    c2 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y1 = sh2.Cells(j, "C").Value Then

                    c3 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row

                If y2 = sh2.Cells(j, "C").Value Then

                    c4 = sh2.Cells(j, "A").Value

                    Exit For

                End If

            Next j

   If c1 <> "" And c2 <> "" And c3 <> "" And c4 <> "" Then

        sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3 & "-" & c4

        End If

            End If

           Next i

 End Sub

よろしくお願いいたします。

(わんこそば) 2016/06/16(木) 13:34


私の使っているPCは、縦が20cmもありません。貴方のモニタは縦2mくらいあるのかも知れませんが、全ての行に改行が追加されていると表示しきれませんので、無駄な改行は止めてください。あと、段付けがめちゃくちゃで、見るに堪えませんので、これも私が書いたように直してください。
(If と End If、ForとNext等、同じ階層にして、対象範囲を明確にする)

また、すべて一気にやるな!、と言ったのに、全て書いたコードをアップしないでください。私が1条件だけの例を挙げたように、問題になっている条件だけのコードにしてください。話はそれからです。(ちゃんと動くことも確認してからアップすること!)
(???) 2016/06/16(木) 15:09


ご回答ありがとうございます。

全てを貼り付けおよび改行申し訳ございません。
今まで他のVBAについての質問をするときには一部だけ貼り付けていたのですが
大体どの方からも一部だけ貼り付けるななどとお叱りを受けることが多かったため
全て貼り付けたほうがいいのかと思いました。申し訳ありません。

再度一部のコードのみ貼り付けます。
一部いただいたコードから替えている部分があります。(おもに変数の部分)
cx=x1に変更、cy=y1に変更 x2・y2追加 c3・c4を追加しました。

For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row

        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And _
           sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then
            cx = sh1.Cells(i, "H").Value
            x2 = sh1.Cells(i, "I").Value
            cy = sh1.Cells(i, "J").Value
      y2 = sh1.Cells(i, "K").Value
            c1 = ""
            c2 = ""
            c3 = ""
            c4 = ""
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x1 <> sh2.Cells(j, "B").Value Then
                    c1 =x1 > sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x2 = sh2.Cells(j, "B").Value Then
                    c2 = x2 < sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x1 <> sh2.Cells(j, "C").Value Then
                    c3 =y1 > sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x1 <> sh2.Cells(j, "C").Value Then
                    c4 =y2 > sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            If c1 <> "" And c2 <> "" And c3 <> "" And c4 <> "" Then
                sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3 & "-" & c4
            End If
        End If
    Next i

この部分は私なりにシート2の表の中にシート1の数字がない場合を書いたものです。
こちらを実行するとエラーは出ないのですが、「True-False/True-False」と表示されます。

よろしくお願いいたします。

(わんこそば) 2016/06/16(木) 15:34


一部だけ貼り付けるな!、というのはその通り。今回のように、一部だけ貼り付けるから怒られるのです。
その一部だけで動くように、宣言等は残して、必要な部分だけで動くことを確認したプロシジャを、丸ごとコピーすべき。

で、駄目なのは以下。

                    c1 =x1 > sh2.Cells(j, "A").Value

これは、「x1 > sh2.Cells(j, "A").Value」の判定結果(TrueかFalse)をc1に入れる、という意味です。
判定と代入を一緒にしない! 横着しすぎです。考え直してください。
(???) 2016/06/16(木) 15:48


お久しぶりでございます。

この4日間色々試行錯誤し私なりに考えてみたのですが、どう頑張ってもきちんとできませんでした。

最後にご指摘いただいた
>これは、「x1 > sh2.Cells(j, "A").Value」の判定結果(TrueかFalse)をc1に入れる、という意味です。
判定と代入を一緒にしない! 横着しすぎです。考え直してください。
についてなのですが、申し訳ありません。横着していたつもりはないのですが自分なりにほしいデータを取ろうと考え、エラーの出なかったものがこちらしかなく書かせていただきました。
ですがよく考えると横着といわれても仕方ない式だと思いました。すみません・・・。

また、試行錯誤している間に新たな問題も出てきてしまいもはや自分ではどうすることもできない状況です。
('数-数/英 表にない場合の部分が、「数-True/False」という風に出てきてしまいます。その部分のデータでは24000・24000/17100・17100というデータなので「数/True-False」と出てくるはずなのですが・・・。)

どの部分が悪いのかさえわからないのでどの部分のコードを貼り付ければいいのかもわかりません・・・。

ここまで丁寧に教えていただいたにもかかわらず申し訳ありません。
もしまだ教えていただけるチャンスがあるならば教えていただけると嬉しいです。

よろしくお願いいたします。
(わんこそば) 2016/06/20(月) 14:55


追記

>また、試行錯誤している間に新たな問題も出てきてしまいもはや自分ではどうすることもできない状況です。
('数-数/英 表にない場合の部分が、「数-True/False」という風に出てきてしまいます。その部分のデータでは24000・24000/17100・17100というデータなので「数/True-False」と出てくるはずなのですが・・・。)
の部分の試行錯誤という点なのですが、現在は一部を除き、上記で一度貼らせていただいた全データの状態に戻してあります。

Sub 位置情報()

    Dim sh1 As Worksheet    
    Dim sh2 As Worksheet    
    Dim x1 As String    
    Dim x2 As String    
    Dim y1 As String    
    Dim y2 As String    
    Dim c1 As String    
    Dim c2 As String    
    Dim c3 As String    
    Dim c4 As String    
    Dim i As Long    
    Dim j As Long           
    Set sh1 = Worksheets("Sheet1")    
    Set sh2 = Worksheets("Sheet2")
 For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row 
        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And _
           sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then
            x1 = sh1.Cells(i, "H").Value
            y1 = sh1.Cells(i, "J").Value
      y2 = sh1.Cells(i, "K").Value
            c1 = ""
            c2 = ""
            c3 = ""
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x1 = sh2.Cells(j, "B").Value Then
                    c1 = sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If y1 = sh2.Cells(j, "C").Value Then
                    c2 = y1 < sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If y2 <> sh2.Cells(j, "C").Value Then
                    c3 =y1 > sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            If c1 <> "" And c2 <> "" And c3 <> "" Then
                sh1.Cells(i, "G").Value = c1 & "-" & c2 & "/" & c3
            End If
        End If
  Next i
End Sub

の>If y2 <> sh2.Cells(j, "C").Value Thenの部分の"<>"がイコールになってしまっていたのでその部分のみ修正いたしました。

書き忘れ申し訳ございません。
(わんこそば) 2016/06/20(月) 15:06


現行ソースコードが判らなかったので、前のコードを元に書いてしまいました。

大小判定と代入をいっきにやろうと欲張って書くから、訳判らなくなったのかと思います。
前と同様、H,I同じ、J,K同じの場合限定で、処理追加してみますね。

 Sub 位置情報2()
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim x1 As Long
    Dim y1 As Long
    Dim c11 As String
    Dim c12 As String
    Dim c21 As String
    Dim c22 As String
    Dim i As Long
    Dim j As Long

    Set sh1 = Worksheets("Sheet1")
    Set sh2 = Worksheets("Sheet2")

    For i = 2 To sh1.Cells(sh1.Rows.Count, "H").End(xlUp).Row
        If sh1.Cells(i, "H").Value = sh1.Cells(i, "I").Value And _
           sh1.Cells(i, "J").Value = sh1.Cells(i, "K").Value Then
            x1 = sh1.Cells(i, "H").Value
            y1 = sh1.Cells(i, "J").Value
            c11 = ""
            c21 = ""
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If x1 = sh2.Cells(j, "B").Value Then
                    c11 = sh2.Cells(j, "A").Value
                    c12 = ""
                    Exit For
                ElseIf sh2.Cells(j, "B").Value <> 0 And sh2.Cells(j, "B").Value < x1 Then
                    c11 = sh2.Cells(j - 1, "A").Value
                    c12 = sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            For j = 2 To sh2.Cells(sh2.Rows.Count, "B").End(xlUp).Row
                If y1 = sh2.Cells(j, "C").Value Then
                    c21 = sh2.Cells(j, "A").Value
                    c22 = ""
                    Exit For
                ElseIf sh2.Cells(j, "C").Value <> 0 And sh2.Cells(j, "C").Value < y1 Then
                    c21 = sh2.Cells(j - 1, "A").Value
                    c22 = sh2.Cells(j, "A").Value
                    Exit For
                End If
            Next j
            If c11 <> "" And c21 <> "" Then
                sh1.Cells(i, "G").Value = c11 & IIf(c12 = "", "", "-" & c12) & "/" & c21 & IIf(c22 = "", "", "-" & c22)
            End If
        End If
    Next i
 End Sub
(???) 2016/06/20(月) 15:34

早速のご回答ありがとうございます。

いただいたコードを試してみたのですが、なにも結果が表示されません。
試しにシート1のデータに追加で「4800 4800 24000 24000」というデータを追加した場合のみその部分に「1/5-A」というデータが出ます。
これはいただいたデータをすべて作成しないときちんとした結果は出ないということなのでしょうか?

また、「/」を挟んだ左側には英字のみがきてほしいのですがそちらも自分で修正ということでしょうか?

なんども質問本当にすみません。

ご回答よろしくお願いいたします。
(わんこそば) 2016/06/20(月) 16:06


H,I同じ、J,K同じの場合限定、と書きました。どんなに時間がかかろうと、他の条件はご自分で書いてください。
丸1日くらいで諦めず、1週間、2週間かけるつもりで。それくらいかけても当たり前なくらいのボリュームですよ。1ヶ月かかりっきりでも、初心者さんなら決して多すぎないと思います。

 A列	B列	C列
 	X	Y
 F	0	28800
 E	0	24000
 D	0	19200
 C	0	14400
 B	0	 9600
 A	0	 4800
 5	24000	0
 4	19200	0
 3	14400	0
 2	 9600	0
 1	 4800	0

Sheet2は、こういうデータでしたよね? Xに値があるのは全てA列が数字なので、/ の左側は必ず数字では?
Y/X の順ならば、C1とC2を文字列連結する順番を逆にしてください。

問題なのはそこではなく、一致する値が無い場合、値より上と下を見つけて、そのA列を X1-X2 の表示にする部分かと思います。
変数を2つに分けた事(これは気づかれていましたよね)と、ElseIfの判定部分に着目してください。
(???) 2016/06/20(月) 16:27


 > 試しにシート1のデータに追加で「4800 4800 24000 24000」というデータを追加した場合のみその部分に「1/5-A」というデータが出ます。 

んー、これはおかしいですよ? XもYも一致した値があるので、「1/E」になるはず。
前の条件と変わっていませんか?
(???) 2016/06/20(月) 16:38


ご回答ありがとうございます。

残りのコードは自分で考えてみます。

ただ、ひとつだけヒントをいただきたいです。
>sh1.Cells(i, "G").Value = c11 & IIf(c12 = "", "", "-" & c12) & "/" & c21 & IIf(c22 = "", "", "-" & c22)
この部分なのですが、新たに式を作る際に「数-数/英」などを作成する際に変数をひとつ増やして作成しているのですが、その場合ここの部分がどうなるのかがわかりません。
おそらく
sh1.Cells(i, "G").Value = c & IIf(c = "", "", "-" & c) & "/" & c
という風に短くなると思うのですが、どうすればいいのでしょうか?
ヒントをいただければと思います。

よろしくお願いいたします。
(わんこそば) 2016/06/20(月) 16:53


>んー、これはおかしいですよ? XもYも一致した値があるので、「1/E」になるはず。
前の条件と変わっていませんか?

すみません、それは私に対するものでしょうか?もう一人の回答者様に対するものでしょうか?

もし、私に対するものでしたら私は条件は変えていないです。

ご回答ありがとうございます。

(わんこそば) 2016/06/20(月) 16:55


すみません、見そびれていました。

>Sheet2は、こういうデータでしたよね? Xに値があるのは全てA列が数字なので、/ の左側は必ず数字では?
Y/X の順ならば、C1とC2を文字列連結する順番を逆にしてください。

すみません、正しくは回答者様のいう通り数字は左側です。記入ミスをしてしまいました。
申し訳ありません。
(わんこそば) 2016/06/20(月) 16:57


この件に回答しているのは私一人であり、他の回答者なんていませんよ? どういうデータならどういう結果になるか、よく考えてみてください。そこが揺らぐようでは、誰もコーディングできませんので、しっかり。

 > おそらく 
 > sh1.Cells(i, "G").Value = c & IIf(c = "", "", "-" & c) & "/" & c 
 > という風に短くなると思うのですが、どうすればいいのでしょうか? 
 > ヒントをいただければと思います。 

えっと、何処が判らないのかが判りません。元はC1とC2で、ハイフンを考慮していませんでしたが、今回のコードでは、XもYもハイフン(一致が無い場合)を考慮していますので、他の条件でも似たコーディングになるかと思いますよ。(だから文字列変数が4つに増え、「数-数/英-英」まで対応しましたが、もっと増える?)
(???) 2016/06/20(月) 17:22


ご回答ありがとうございます。

すみません
> > 試しにシート1のデータに追加で「4800 4800 24000 24000」というデータを追加した場合のみその部分に「1/5-A」というデータが出ます。
んー、これはおかしいですよ? XもYも一致した値があるので、「1/E」になるはず。
前の条件と変わっていませんか?
の部分に関してなのですが、ほかの回答の時と少し口調が違って見えたので第三者の方かと思いました。申し訳ありません。

おかげでひとつの問題を除き、無事に答えの出る式が完成いたしました。本当にありがとうございます。

ひとつの問題なのですが、きちんと答えは出てくれるのですがエラーで「型が一致しません」とでてしまいます。これはどういう場合に出るエラーなのでしょうか?調べてもいまいちぴんとくるものがありませんでした。

よろしくお願いいたします。
(わんこそば) 2016/06/21(火) 11:37


メッセージ通り、データ型が違う場合に表示されます。どこの行で表示されましたか? 定義データが想定外なものなのか、それとも追加ロジックを書いてあり、そこに問題があるのか…。

デバッグの仕方ですが、実行途中であれば、変数部分にマウスカーソルを当てると値が表示されます。
または、イミディエイトウィンドウ上で ? i のように変数名を書くと、値が表示されます。
(正式には debug.print i のように書くのですが、長いので、? 1文字で代用できるようになってます)

エラー時に途中で止まらず、マクロ実行が終わってしまった場合、値を見ることができません。
この場合はエラーになりそうな行にブレークポイントを設定(F9キー)してから実行。そこまで動いたら、後はF8キーでステップ実行し、エラーになる場所を見つけ、エラー終了する手前で変数を調べましょう。

すこし気になるのは、前回は値一致だけだったので、変数x1,y1は文字型にしたのですが、今回は値の上下判定が必要な事から、Long型に変えました。なので、定義データ(B,C列)の中に数値以外があると、エラーになる事でしょう。
(???) 2016/06/21(火) 11:54


ご回答ありがとうございます。

>すこし気になるのは、前回は値一致だけだったので、変数x1,y1は文字型にしたのですが、今回は値の上下判定が必要な事から、Long型に変えました。なので、定義データ(B,C列)の中に数値以外があると、エラーになる事でしょう。

x1、y1などの変数の部分をString型に変更したところ見事エラーが表示されなくなりました。

長々とお付き合いくださり本当にありがとうございました。
(わんこそば) 2016/06/21(火) 13:40


あ、文字列にすると、上下判定で失敗しますよ? "24000" < "9600" が正になりますから。
(String型の場合、1文字目からの文字コードで比較になるので、9のほうが大きい)

まるでアナログモデムの伝送速度のようなデータですが、数字以外に入っているものを消せませんか?
または、Val関数を使ってみてください。
(???) 2016/06/21(火) 14:08


ご回答ありがとうございます。

式をまとめるとややこしく考えすぎてしまってエラーばかり出てしまったので、ElseIfの部分は除かせていただきました。
その分式は多くなってしまったのですが、そちらのほうが私にはわかりやすかったので今回はそのような方法をとらせていただきました。

ありがとうございます。
(わんこそば) 2016/06/21(火) 16:52


コメント返信:

[ 一覧(最新更新順) ]


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