ジメジメする梅雨のお悩み、一挙解決! >>

エクセルで入力したデータが、ルールに基づいて正しく入力できているかどうかを確認するような関数はありますか?

例として(添付画像もつけさせていただきました)「粉薬」と「飲薬」を入力し、各容量を入力します。
「粉薬」と「××g」、「飲薬」と「××」は必ずセットで入力されていることが必須です。
もし誤って「粉薬」のときに「××」と入力をした場合に、間違った入力がされていることが表示されるような関数はありますでしょうか?
枠外に〇や×として表示される
セルに色がつく・・・等

色々検索をして試してみたのですがうまくいきません。
VBAなども出てきたのですが私自身知識が全くないことと、作成したデータをあまりエクセルが得意ではない人が使う可能性などを考え、できれば関数などでできれば・・・と考えています。

「<エクセル>2つのデータに間違いがないか」の質問画像

A 回答 (2件)

=IF(NOT(ISERROR(FIND("粉薬",B2))),IF(NOT(ISERROR(FIND("g",C2))),"○","×"),"・")


b2に粉薬の文字がある場合で、かつ、(c2にgの文字がある場合には、○を表示、ない場合は×を表示)、左記以外は・を表示
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!
saburo0様のご回答を元に入力を行ったところうまくいきました。
本当にたすかりました^^

お礼日時:2017/05/19 15:23

こんにちは。


ご質問の意図に沿った回答かどうか、少し自信ありませんが、

まず数量と単位を別セルに分けてください。
そして、マスタシートとして、薬ごとに正しい単位を示す表をつくってください。
(画像では同じシートになっていますが、別シートの方が良いです。)

正誤の部分の関数は、添付画像の例で言うと、

=IF(VLOOKUP(A3,$A$12:$B$13,2,FALSE)=C3,"正","誤")

になります。
あ、僕の画像は飲み薬がリットルで、粉薬がグラムになってます。ご容赦ください・・・。
「<エクセル>2つのデータに間違いがないか」の回答画像2
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!
少し自分の作りたかったデータと異なっていたのですが、VLOOKUP関数を使う機会がなかったので勉強になりました^^
わざわざ表も作っていただきありがとうございました!

お礼日時:2017/05/19 15:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q<エクセル>IFを使って2つのデータに間違いがないかをチェックしたい

先日質問させていただいた、エクセルで入力したデータに間違いがないかを関数で出す方法の続きです。
(https://oshiete.goo.ne.jp/qa/9761691.html)

----

IFを使えば正しいデータの条件に合わない場合、〇か×の判定が出せるところまでは分かったのですが、これを複数にすることはできるのでしょうか?
IFSを使って、2つまでは設定ができたのですが、4つ、5つと増やすことはできますか?
入れ子にしたら良いのかと思ったのですが、うまくいきませんでした。(もしかしたら、入れ子のやり方がまちがっていたのかもしれませんが・・・)

一応2つまで増やした数式↓
=IFS(NOT(ISERROR(FIND("粉末",F2))),IF(NOT(ISERROR(FIND("kg",G2))),"○","×"),NOT(ISERROR(FIND("液体",F2))),IF(NOT(ISERROR(FIND("",G2))),"○","×"))

前回ベストアンサーで選ばせて頂いた方の関数を「IF」から「IFS」に変えて条件を増やしました。

----

B2から「粉末」または「粘土」または「薬品」を探し単位が「kg」であれば〇、そうでなければ×
または
B2から「液体」または「水」を探し、単位が「」であれば〇、そうでなければ×

というように組み合わせ、入力データの横に〇か×で判定が出るようにしたいです。
「FIND」の後に「OR」で条件を入れれば・・・と思ったのですがうまくいきませんでした。

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

先日質問させていただいた、エクセルで入力したデータに間違いがないかを関数で出す方法の続きです。
(https://oshiete.goo.ne.jp/qa/9761691.html)

----

IFを使えば正しいデータの条件に合わない場合、〇か×の判定が出せるところまでは分かったのですが、これを複数にすることはできるのでしょうか?
IFSを使って、2つまでは設定ができたのですが、4つ、5つと増やすことはできますか?
入れ子にしたら良いのかと思ったのですが、うまくいきませんでした。(もしかしたら、入れ子のやり方がまちがっ...続きを読む

Aベストアンサー

さすがに水虫まで判断しませんが(笑)
=IF(OR(RIGHT(C2,{1,2})=LOOKUP(2,FIND({"粉末","粘土","薬品","液体","水"},B2),{"kg","kg","kg","L","L"})),"○","×")

QExcelを使って行列変換をしたい(大量件数)

先日質問させていただいたものです。
さらなる加工が必要になりました。

例えば、
◆test
aaaaaa
iiiiiiiiiiiii
uuuuu
eeeee
ooooo
◆test2
kaaaaa
kiiiiiiiiiii
kuuuuu
keeeee
kooooo
...

これらのデータを
◆test aaaaaa
    iiiiiiiiiiiiii
    uuuuuu
eeeeee
oooooo
◆test2 kaaaaa
     kiiiiiiiiiii
     kuuuu
     keeeee
     koooooo

に変換はできたのですが、今度は
◆test aaaaaaaa iiiiiiiiiii uuuuuuuuuuu eeeeeee oooooo
◆test2 kaaaaaa kiiiiiiiii kuuuuuuuuu keeeeee koooooooo

のように変換する必要がでてしまいました。

マクロなどで一括で変換できないでしょうか。
当方知識が乏しいため困っております。

先日質問させていただいたものです。
さらなる加工が必要になりました。

例えば、
◆test
aaaaaa
iiiiiiiiiiiii
uuuuu
eeeee
ooooo
◆test2
kaaaaa
kiiiiiiiiiii
kuuuuu
keeeee
kooooo
...

これらのデータを
◆test aaaaaa
    iiiiiiiiiiiiii
    uuuuuu
eeeeee
oooooo
◆test2 kaaaaa
     kiiiiiiiiiii
     kuuuu
     keeeee
     koooooo

に変換はできたのですが、今度は
◆test aaaaaaaa iiiiiiiiiii uuuuuuuuuuu eeeee...続きを読む

Aベストアンサー

こんにちは!

別シートに表示しても良いですか?
元データはSheet1のA列にあり、Sheet2に表示するとします。
標準モジュールにしてください。

Sub Sample1()
Dim i As Long, cnt As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Cells.ClearContents
With Worksheets("Sheet1")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
If InStr(.Cells(i, "A"), "◆") > 0 Then
cnt = cnt + 1
wS.Cells(cnt, "A") = .Cells(i, "A")
Else
wS.Cells(cnt, Columns.Count).End(xlToLeft).Offset(, 1) = .Cells(i, "A")
End If
Next i
End With
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんにちは!

別シートに表示しても良いですか?
元データはSheet1のA列にあり、Sheet2に表示するとします。
標準モジュールにしてください。

Sub Sample1()
Dim i As Long, cnt As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Cells.ClearContents
With Worksheets("Sheet1")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
If InStr(.Cells(i, "A"), "◆") > 0 Then
cnt = cnt + 1
wS.Cells(...続きを読む

Q数式を値に置換するには?

Excelにて、数式のエラー(#N/A)を検索オプションにて、値で検索し、値(0)←数字のゼロに置換しようとするのですが、上手くいきません。
置換できる方法を教えて下さい。

Aベストアンサー

こんにちは!

VBAになりますが一例です。
すべてのエラーセル(#N/Aや#DIV/0!など)が「0」になります。

Sub Sample1()
Dim myRng As Range
Set myRng = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
If Not myRng Is Nothing Then
myRng = 0
End If
End Sub
 
※ #N/A のエラーだけを「0」にしたい場合は↓のコードにしてみてください。

Sub Sample2()
Dim c As Range, myRng As Range
Set myRng = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
If Not myRng Is Nothing Then
For Each c In myRng
If c = CVErr(xlErrNA) Then
c = 0
End If
Next c
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんにちは!

VBAになりますが一例です。
すべてのエラーセル(#N/Aや#DIV/0!など)が「0」になります。

Sub Sample1()
Dim myRng As Range
Set myRng = ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
If Not myRng Is Nothing Then
myRng = 0
End If
End Sub
 
※ #N/A のエラーだけを「0」にしたい場合は↓のコードにしてみてください。

Sub Sample2()
Dim c As Range, myRng As Range
Set myRng = ActiveSheet.Cells.SpecialCells(x...続きを読む

Qエクセルデータをカンマ区切り、ダブルコーテーションで囲んだデータにする方法を教えてください

はじめまして。
仕事でエクセルデータをカンマ区切り、ダブルコーテーション囲みのテキストデータにする必要があります。

例)
”111”,"222","","","","666""

このように空白のセルもあり、そのセルもダブルコーテーションで囲みたいです。
VBAで変更する方法をどこかで見かけましたが、張り付けてみましたが、上手く動きませんでした。
超初心者ですので、わかりやすく教えていただけると有り難いです。

お手数をおかけしますが、宜しくお願い致します。

Aベストアンサー

Unicode 出力の件ですが、せっかく、個人用マクロブックに納められる(つもり)ので、それを、書き換えるよりも、後づけマクロのほうがよいかもしれません。一緒にしてしまうと、Unicodeのみになってしまいますから、それも望まないし……
とあれこれ考えて、単独マクロで、Unicodeファイル判別するプログラムもつけました。BigEndien も LittleEndienも別けますが、出力は、BigEndienだけです。
こういうのは、余計なものかもしれません。

'//
Public Sub Convert2UNICODE()
'シフトJISをUnicodeに替えるマクロ
Dim stream As Object
Dim stream2 As Object
Dim fname As Variant
Dim buf As Variant
Dim b() As Byte
Dim i As Long
fname = Application.GetOpenFilename _
 ("File (*.*), *.*", 1, "ファイルオープン")
 If VarType(fname) = vbBoolean Then Exit Sub
 Open fname For Binary As #1
   ReDim b(1 To 6)
    Get #1, , b
  Close #1
 For i = 1 To 6
 buf = buf & Hex(b(i))
 Next
 If buf Like "FFFE*" Or buf Like "FEFF*" Then
  MsgBox "ファイルはすでにUnicodeです。", vbExclamation
  Exit Sub
 End If
 '-------変換プログラム-----------
On Error GoTo ErrHandler
Set stream = CreateObject("ADODB.Stream")
  stream.Open
  stream.Type = 2
  stream.Charset = "shift_jis"
  stream.LoadFromFile fname

Set stream2 = CreateObject("ADODB.Stream")
  stream2.Open
  stream2.Charset = "unicode"
  stream.CopyTo stream2
  stream2.SaveToFile (fname), 2
  stream2.Close
  stream.Close

Set stream2 = Nothing
Set stream = Nothing
Exit Sub
ErrHandler:
 If Err.Number <> 0 Then 
  Msgbox Err.Number & " :" & Err.Description
End If
End Sub

Unicode 出力の件ですが、せっかく、個人用マクロブックに納められる(つもり)ので、それを、書き換えるよりも、後づけマクロのほうがよいかもしれません。一緒にしてしまうと、Unicodeのみになってしまいますから、それも望まないし……
とあれこれ考えて、単独マクロで、Unicodeファイル判別するプログラムもつけました。BigEndien も LittleEndienも別けますが、出力は、BigEndienだけです。
こういうのは、余計なものかもしれません。

'//
Public Sub Convert2UNICODE()
'シフトJISをUnicodeに替えるマクロ
Di...続きを読む

QEXCEL 一番右の結果を返す関数を教えてください。

閲覧ありがとうございます。

WEBアンケートの結果集計をしています。
複数回答で、YESと回答するとEXCELに「1」と表示されます。
右にいくにつれて最新情報となっている為、一番右の「1」を反映させたいです。

添付画像は例です。
左の表を右の表のように作り変えるには、H列にどのような関数を入れればよいでしょうか。

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

Aベストアンサー

=IFERROR(LOOKUP(2,B2:E2,B$1:E$1),"")

でどうですか?

QExcel 2010 VBAの改変

下のVBAを使ってデータの抽出とコピーを自動でやっていたのですが、
業務変更?により、ブック内のシート名を変更しなければいけなくなりました。
"R-1", "R-2", "R-3", "R-4", "A-1start", "Z-1start"という6つのシート名を
→R-1→"弘前りんご", R-2→"夕張メロン", R-3→"白い恋人",R-4→ "じゃがぽっくる", A-1start→"札幌ラーメン", Z-1start→"白いブラックサンダー"
……といったように変更しなければならないのですが、
VBAの初心者なので、正直どこをいじっていいのか全くわかりません。

どなたかシート名を変更してもマクロが実行できるように直してはいただけないでしょうか。

Sub Sample()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim hizuke As String, wnum As String
Dim rng As Range
Dim i As Long, imax As Long
Dim j As Variant, c As Long
Dim sname As String
Dim fsh As Variant
fsh = Array("R-1", "R-2", "R-3", "R-4", "A-1start", "Z-1start")
hizuke = InputBox("日付を入力して下さい")
If hizuke = "" Then Exit Sub
If IsDate(hizuke) = False Then
MsgBox "日付不正"
Exit Sub
End If
Set sh1 = Worksheets("おみやげ表")
With sh1
Set rng = .Range(.Cells(4, 5), .Cells(4, .Cells(4, Columns.Count).End(xlToLeft).Column))
End With
j = Application.Match(CLng(CDate(hizuke)), rng, 0)
If IsError(j) Then
MsgBox "該当日付がありません"
Exit Sub
End If
wnum = InputBox("週を入力して下さい")
If wnum = "" Then Exit Sub
If wnum < 1 Or wnum > 5 Then
MsgBox "週不正"
Exit Sub
End If
Application.ScreenUpdating = False
c = wnum * 2 + 3
For Each sh2 In Worksheets
For i = 0 To 5
If sh2.Name = fsh(i) Then
With sh2
If .Cells(5, c) <> "" Then
.Range(.Cells(5, c), .Cells(.Cells(Rows.Count, c).End(xlUp).Row, c)).ClearContents
End If
End With
Exit For
End If
Next i
Next sh2
With sh1
imax = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 6 To imax
If .Range("A" & i).Value <> "" Then
sname = .Range("D" & i).Value
Select Case sname
Case "R-1", "R-2", "R-3", "R-4"
Case Else
If (Left(sname, 3) = "A-1" Or Left(sname, 3) = "Z-1") And InStr(sname, "人気商品") = 0 Then
sname = Left(sname, 3) & "start"
Else
sname = ""
End If
End Select
If sname <> "" Then
Set sh2 = Worksheets(sname)
sh2.Cells(sh2.Cells(Rows.Count, c).End(xlUp).Row + 1, c).Value = .Cells(i, j + 4)
End If
End If
Next i
For i = 32 To 40
Set sh2 = Nothing
Select Case i
Case 32
Set sh2 = Worksheets("A-1start")
Case 33
Set sh2 = Worksheets("Z-1start")
Case 35
Set sh2 = Worksheets("R-1")
Case 37
Set sh2 = Worksheets("R-2")
Case 38
Set sh2 = Worksheets("R-3")
Case 40
Set sh2 = Worksheets("R-4")
End Select
If Not sh2 Is Nothing Then
.Cells(i, j + 4).Value = sh2.Cells(sh2.Cells(Rows.Count, c + 1).End(xlUp).Row, c + 1).Value
End If
Next i
End With
Application.ScreenUpdating = True
MsgBox "終了しました"
End Sub

下のVBAを使ってデータの抽出とコピーを自動でやっていたのですが、
業務変更?により、ブック内のシート名を変更しなければいけなくなりました。
"R-1", "R-2", "R-3", "R-4", "A-1start", "Z-1start"という6つのシート名を
→R-1→"弘前りんご", R-2→"夕張メロン", R-3→"白い恋人",R-4→ "じゃがぽっくる", A-1start→"札幌ラーメン", Z-1start→"白いブラックサンダー"
……といったように変更しなければならないのですが、
VBAの初心者なので、正直どこをいじっていいのか全くわかりません。

どなたかシート...続きを読む

Aベストアンサー

すみません。NO2で提示したマクロに誤りがありました。

If Left(sname, 6) = "札幌ラーメン" And InStr(sname, "人気商品") = 0 Then
sname = Left(sname, 6)
ElseIf Left(sname, 10) = "白いブラックサンダー" And InStr(sname, "人気商品") = 0 Then
sname = Left(sname, 10)
Else
sname = ""

上記が正しいマクロです。
今の状態のマクロは、赤字で表示される個所があるかと思います。
上記に変えれば、全て、黒字でマクロが表示されるはずです。
それを確認したのち、再度実行していただけ間瀬でしょうか。

すみません。NO2で提示したマクロに誤りがありました。

If Left(sname, 6) = "札幌ラーメン" And InStr(sname, "人気商品") = 0 Then
sname = Left(sname, 6)
ElseIf Left(sname, 10) = "白いブラックサンダー" And InStr(sname, "人気商品") = 0 Then
sname = Left(sname, 10)
Else
sname = ""

上記が正しいマクロです。
今の状態のマクロは、赤字...続きを読む

QExcelについて教えて頂きたいのですが。縦に1~10行あり、名前あり、例えば5番目の方が休みの時に

Excelについて教えて頂きたいのですが。縦に1~10行あり、名前あり、例えば5番目の方が休みの時に自動的に5番目の行の所に下から詰める方法はありますか?

Aベストアンサー

配列の確定をしない場合、こんなふうにできます。

=IFERROR(INDEX($A$1:$B$11,SUMPRODUCT(SMALL(ROW($A$1:$A$11)+($B$1:$B$11<>"")*100,ROW(A1))),1),"")

注意点
=IFERROR(INDEX($A$1:$B$11,
  $A$1:$B$11 ←全体の範囲/1行目から始まる
  
SUMPRODUCT(SMALL(
ROW($A$1:$A$11)+($B$1:$B$11<>"")*100,
  $A$1:$A$11 ,$B$1:$B$11 ←1行目から始まる

ROW(A1))),1),"")

つまり、計算上で出てくる「0値」の追い出しですね。

QVBAで抽出とコピペのループがうまくいかない?

Excel2010のVBAに詳しい方、至急です。
前回も同様の質問をして、回答していただいた方のアドバイスをもとに自分でも改善?してみたつもりなのですが無理だったので再度質問させていただきます。

ポケモン図鑑という表をタイプごとにリストを抽出して、
そのデータをA列に数値が入っている行から最後の行までをコピーして、
抽出した際の条件と同じ名前のシートに所定の場所に貼り付け、最後に貼り付け先のシートのとある箇所をコピーして、ポケモン図鑑というシートにデータをペーストするというマクロなんですが、実際に通しても数値が0となってしまいます。
メッセージボックスで入力した後、「終了しました」と出るのですが期待通りに抽出してコピー&ペーストができていないようで困っています。
だれかたすけていただけませんか。

※抽出する項目
lightening※1
fire※2
water
leaf
wind
dragon

※1抽出する際、テキストフィルターのユーザー設定で
「lightening」からはじまる「伝説・幻」を含まないという条件で抽出しなければならない。
※2抽出する際、テキストフィルターのユーザー設定で
「fire」からはじまる「伝説・幻」を含まないという条件で抽出しなければならない。

Sub Pokemon()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim hizuke As String, wnum As String
Dim rng As Range
Dim i As Long, imax As Long
Dim j As Variant, c As Long
Dim sname As String
Dim fsh As Variant
fsh = Array("lightening", "fire", "water", "leaf", "wind", "dragon")
hizuke = InputBox("ポケモンを捕まえた日付を入力して下さい")
If hizuke = "" Then Exit Sub
If IsDate(hizuke) = False Then
MsgBox "日付不正"
Exit Sub
End If
Set sh1 = Worksheets("ポケモン図鑑")
With sh1
Set rng = .Range(.Cells(4, 5), .Cells(4, .Cells(4, Columns.Count).End(xlToLeft).Column))
End With
j = Application.Match(CLng(CDate(hizuke)), rng, 0)
If IsError(j) Then
MsgBox "該当日付がありません"
Exit Sub
End If
wnum = InputBox("選択した日付が何週目になるかを入力して下さい")
If wnum = "" Then Exit Sub
If wnum < 1 Or wnum > 5 Then
MsgBox "週不正"
Exit Sub
End If
Application.ScreenUpdating = False
c = wnum * 2 + 3
For Each sh2 In Worksheets
For i = 0 To 5
If sh2.Name = fsh(i) Then
With sh2
If .Cells(5, c) <> "" Then
.Range(.Cells(5, c), .Cells(.Cells(Rows.Count, c).End(xlUp).Row, c)).ClearContents
End If
End With
Exit For
End If
Next i
Next sh2
With sh2
If .Cells(5, c) <> "" Then
.Range(.Cells(5, c), .Cells(.Cells(Rows.Count, c).End(xlUp).Row, c)).ClearContents
End If
End With
End If
Next sh2
With sh1
imax = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 6 To imax
If .Range("A" & i).Value <> "" Then
sname = .Range("D" & i).Value
Select Case sname
Case "lightening","fire","water", "leaf", "wind", "dragon"
Case Else
sname = ""
End If
End Select
If sname <> "" Then
Set sh2 = Worksheets(sname)
sh2.Cells(sh2.Cells(Rows.Count, c).End(xlUp).Row + 1, c).Value = .Cells(i, j + 4)
End If
End If
Next i
For i = 32 To 40
Set sh2 = Nothing
Select Case i
Case 1
Set sh2 = Worksheets("lightening")
Case 2
Set sh2 = Worksheets("fire")
Case 4
Set sh2 = Worksheets("water")
Case 6
Set sh2 = Worksheets("leaf")
Case 7
Set sh2 = Worksheets("wind")
Case 9
Set sh2 = Worksheets("dogagon")
End Select
If Not sh2 Is Nothing Then
.Cells(i, j + 4).Value = sh2.Cells(sh2.Cells(Rows.Count, c + 1).End(xlUp).Row, c + 1).Value
End If
Next i
End With
Application.ScreenUpdating = True
MsgBox "ポケモン抽出コピペ終わり!"
End Sub

Excel2010のVBAに詳しい方、至急です。
前回も同様の質問をして、回答していただいた方のアドバイスをもとに自分でも改善?してみたつもりなのですが無理だったので再度質問させていただきます。

ポケモン図鑑という表をタイプごとにリストを抽出して、
そのデータをA列に数値が入っている行から最後の行までをコピーして、
抽出した際の条件と同じ名前のシートに所定の場所に貼り付け、最後に貼り付け先のシートのとある箇所をコピーして、ポケモン図鑑というシートにデータをペーストするというマクロ...続きを読む

Aベストアンサー

プログラム自体の動きは全くチェックしていません。
色々おかしいところがありますが 自分でデバッグくらいできるように
ならないとダメだと思います。

42行目と 50行目の「End If」はどこに掛かっていますか?
51行目の Next sh2はどこに掛かっていますか?
最後の方の「dogagon」てつづりは合ってますか?
61行目の「End If」と 62行目の「End Select」の順番は合ってますか?
67行目の「End If」はどこと以下同文

初心者レベルでいいので VBAについての勉強を先にすべきだと思います。

QExcel関数 詳しい方教えてください

例えば
sheet1のA1に#0010入力するとD1に"可"か"不可"でるようにしたいです。A列に何も入力されていない場合は、D列に表示しないようにしたいです。
どの様にすれば良いのか分からないでので教えて下さい。

sheet2にデータ参照とします。
B列とC列に#を含む4桁の数字が入力しています。B列に含まれる#4桁の数字が"可"C列に含まれる#4桁の数字が"不可"をsheet1のD列に"可"か"不可"でるようにしたいです。A列に何も入力されていない場合は、D列に表示しないようにしたいです。(B列とC列は同じ数字は存在しません。)
画像添付は、sheet2参照となります。
教えてくださいお願いいたします。

Aベストアンサー

こんにちは、No.1の方が回答してくださったものに、Aが空欄だったら空欄 とIF式を追加してみてはいかがでしょうか。

=IF(A1="","",IF(COUNTIF(Sheet2!B:B,A1),"可",IF(COUNTIF(Sheet2!C:C,A1),"不可","")))

Qexcelを使用したVBAの問題に関する質問です。 下記のサイトの問題19の解答の中で、 http:

excelを使用したVBAの問題に関する質問です。 下記のサイトの問題19の解答の中で、 http://excel-ubara.com/excel-answer/EXCELVBA619A.html



'縦合計の客単価
If i = 4 Then
Cells(20, j) = Cells(18, j) / Cells(19, j)
End If



なぜ、週を表している「i」が「4」(if=だったら)なのでしょうか?
「4」だった場合、「合計」欄ではなく、
「第4週目」欄を表すのではないでしょうか?


実は以前にもこの問題19の回答について質問させて頂いております。
しかし、未熟ゆえ、未だに全体的にこの問題の回答が理解できません。

もしよろしければ、
回答全体をひとつずつ「なにがしたいのか」、「どうしてこんなことをしているのか」、について
丁寧にお教え頂けますと、とても助かります。


VBAを始めたばかりの初心者でいて、
理解力が乏しいため

お詳しい方がいらっしゃいましたら、是非、お教え下さい。

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

Aベストアンサー

こんにちは。

単刀直入。
If i = 4 Then
これは何を意味するか、客単価を4回計算したら、合計欄に計算を出すというものです。第5週目を加えてみれば一目瞭然です。

5週目を加えるには、
If i =5 にしなければなりません。

このコードが奇妙なのは、縦に集計をしているということです。

「未熟ゆえ、未だに全体的にこの問題の回答が理解できません。」
私が愚かなのかもしれませんが、そのサイトのコードはわかりにくいです。
故意ではないとは思いたいのですが、非常にマレな書き方です。

VBAの学習の進め方は、構文(ループの使い方の違い)や関数を一通り終えて、高級文法に入り、エラー処理を覚え、私の場合は、次に、UserForm やワークシートのイベントを覚えていくというのが、良いと思っています。技術評論社から出ているテキストは、UserForm (コントロール)を入門編の後につけるようです。

せっかくで水を差すようで大変に心苦しいのですが、特に、変数の付け方、プロパティの使い方が標準的ではない人はない人の場合は、わかりにくいのです。
昔は、Microsoft が出していた、『Office VBA プログラマーズガイダンス』という本があったし、細かい部分は、VB6側の『プログラマーズガイダンス』のほうで確認していましたが、今は、たぶん、痕跡ぐらいしか残っていません。

>回答全体をひとつずつ「なにがしたいのか」、「どうしてこんなことをしているのか」、について
>丁寧にお教え頂けますと、とても助かります。

私自身(分身?以前、自分が書いたような書き方の人がいました)が書いたのなら、ある程度はお教えできますが、それでも、半年経てば他人の方ものと同然で、分からないのです。そのマクロは、手法が違うので、その解説するというのは、苦痛というしかありません。

VBAの練習は、英会話と同じで、短文の例文を数多く集め、覚えるように心がけるようにしたほうがよいです。

この問題は、応用問題で、やり方はいろいろありますし、自分なりの答えを出すまでは、もう少し先でもよいのではないでしょうか。

その代わり、私の解答を出しておきます。

'//
Sub Question19()
 Dim lstCol As Long, lstRw As Long
 Dim i As Long
 Dim LastCell As Range
 Dim Rng As Range
 Dim flg As Boolean
 lstCol = Cells(1, Columns.Count).End(xlToLeft).Column
 lstRw = Cells(Rows.Count, 2).End(xlUp).Row
 Set Rng = Range("A1", Cells(lstRw, lstCol))
 
 Rng.Font.ColorIndex = xlColorIndexAutomatic
 With Rng
  For i = 2 To lstRw

   If .Cells(i, 2).Value = "客単価" Then
    .Cells(i, 3).Resize(, lstCol - 2).Formula = "=R[-2]C/R[-1]C"
    .Cells(i, 3).Resize(, lstCol - 2).NumberFormat = "#,##0.0"
    DeficitRed .Cells(i, 3).Resize(, lstCol - 1), .Cells(i, lstCol).Value
   End If
   If .Cells(i, 1).Value Like "合計*" Then flg = True 'ネットからなので、ゴミが入っていました。それで、Like演算子にしました。

   If flg = True Then
    If .Cells(i, 2).Value = "売上" Then
     .Cells(i, 3).Resize(1, lstCol - 2).Formula = _
     "=SUMIF(R2C2:R" & i - 1 & "C2,R" & i & "C2,R2C:R[-1]C)"
    ElseIf .Cells(i, 2).Value = "客数" Then
     .Cells(i, 3).Resize(1, lstCol - 2).Formula = _
     "=SUMIF(R2C2:R" & i - 1 & "C2,R" & i & "C2,R2C:R[-1]C)"
    End If
   End If

   If .Cells(i, 2).Value = "売上" Or _
     .Cells(i, 2).Value = "客数" Then
    .Cells(i, lstCol).FormulaLocal = "=SUM(RC3:RC[-1])"
   End If
  Next i
 End With
End Sub

こんにちは。

単刀直入。
If i = 4 Then
これは何を意味するか、客単価を4回計算したら、合計欄に計算を出すというものです。第5週目を加えてみれば一目瞭然です。

5週目を加えるには、
If i =5 にしなければなりません。

このコードが奇妙なのは、縦に集計をしているということです。

「未熟ゆえ、未だに全体的にこの問題の回答が理解できません。」
私が愚かなのかもしれませんが、そのサイトのコードはわかりにくいです。
故意ではないとは思いたいのですが、非常にマレな書き方です。

VBAの学習の進め方...続きを読む


人気Q&Aランキング

おすすめ情報