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

VBA初心者です。
Excel2010を使用しています。
よろしくお願いします。

H列 国名が表示されています。
V列 文字列
W列 文字列

H列が「日本」の時は、V列で重複チェックする。

H列が、日本以外の時(アメリカ、ドイツなど)は
W列で重複チェックする。
ただし、W列が「除外」と入力されている行は、無視する。

どちらの場合も重複していたら、ひとつめを含めて
該当行のA〜Wまで黄色にする。

全て組み合わせた記入の仕方が分かりませんでした。わかる方、教えて下さい。よろしくお願いします。

質問者からの補足コメント

  • 回答いたします。

    1)1行目は見出しですか。→見出しです。

    2)W行が除外の場合、無視するとなってますが、国名が日本でも同様ですか。→①重複しない(日本の場合はW列に「除外」という文字列は発生しない&その他の文字列が重複しても判定は不要です。そのためV列で判定したいです。)

    3)日本以外の場合は、重複判定ですが→ ②でお願いします。(国名ごとに、W列の文字列を判定)

    4)日本の場合は、V列に除外という文字があっても、通常の文字列として扱う。→重複でお願いします。判定したくないところに「除外」と入力しており、通常の文字列内に「除外」という文字列はありません。

    追加補足要求です。 1)行はどのくらいありますか→3000行程度ですが、可変です。

      補足日時:2017/07/11 17:13
  • tatsu99様

    早速のご対応ありがとうございました。
    コードを拝見いたしまして、
    まだ実行はできていませんが
    一点、私の回答ミスに気がつきました。

    3)日本以外の場合は、重複判定ですが、 ①「国名+W行の文字列」が重複の場合、重複とする。 (この場合、青色部分は重複しない。) ②W行の文字列のみで、重複の判定をする。 (この場合、青色部分は重複する) ①②のどちらでしょうか。

    の設問に対する回答は「 ①「国名+W行の文字列」が重複の場合、重複とする。 (この場合、青色部分は重複しない。)」でした。

    特にこの部分が分からなくて悩んでいるので、
    よろしければ教えていただけますでしょうか。
    宜しくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/07/11 21:24

A 回答 (5件)

以下のマクロを標準モジュールへ登録してください。


Option Explicit
Public Sub 重複チェック()
Dim maxrow As Long
Dim row As Long
Dim dicT0 As Object
Dim dicT1 As Object
Dim key1 As Variant
Dim key2 As Variant
Dim key As Variant
Set dicT0 = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set dicT1 = CreateObject("Scripting.Dictionary") ' 連想配列の定義

maxrow = Cells(Rows.Count, "H").End(xlUp).row 'sheet H列 最終行を求める
'既存の色を解除
Range("A2:W" & maxrow).Select
With Selection.Interior
.Pattern = xlNone
End With
For row = 2 To maxrow
key1 = Cells(row, "H").Value
If key1 = "日本" Then
key2 = Cells(row, "V").Value
Else
key2 = Cells(row, "W").Value
End If
If key1 = "日本" Or key2 <> "除外" Then
key = key1 & "|" & key2
If dicT0.exists(key) = True Then
dicT1(row) = True
dicT1(dicT0(key)) = True
Else
dicT0(key) = row
End If
End If
Next
For Each key In dicT1
Range("A" & key & ":W" & key).Select
With Selection.Interior
.Color = 65535
End With
Next
MsgBox ("完了")
End Sub
この回答への補足あり
    • good
    • 0

すみません。


No3の回答ですが、
>3)日本以外の場合は、重複判定ですが、 ①「国名+W行の文字列」が重複の場合、重複とする。 (この場合、青色部分は重複しない。)
> ②W行の文字列のみで、重複の判定をする。 (この場合、青色部分は重複する) ①②のどちらでしょうか。
>の設問に対する回答は「 ①「国名+W行の文字列」が重複の場合、重複とする。 (この場合、青色部分は重複しない。)」でした。
①の仕様で作成していました。(②ではありません)
したがって、結果的にNo3がそのまま使えます。
    • good
    • 1
この回答へのお礼

ありがとう

できました!

こういう場合はkeyを使うのですね。
他にも応用できそうなので、
色々と悩んでみたいと思います。

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

お礼日時:2017/07/12 09:13

3)日本以外の場合は、重複判定ですが、 ①「国名+W行の文字列」が重複の場合、重複とする。

(この場合、青色部分は重複しない。) ②W行の文字列のみで、重複の判定をする。 (この場合、青色部分は重複する) ①②のどちらでしょうか。
の設問に対する回答は「 ①「国名+W行の文字列」が重複の場合、重複とする。 (この場合、青色部分は重複しない。)」でした。

>特にこの部分が分からなくて悩んでいるので、
>よろしければ教えていただけますでしょうか。

判らないというのは、①と②の違いが判らないという意味ですか?
それとも①を実装するには、どうすれば良いかわからないという意味ですか?
どちらの意味でしょうか?
    • good
    • 0

追加補足要求です。


1)行はどのくらいありますか。
    • good
    • 0

補足要求です。


1)1行目は見出しですか。(添付図のグレー部分)

2)W行が除外の場合、無視するとなってますが、国名が日本でも同様ですか。
①日本でも無視するなら、緑の部分は重複しない。
②日本は無視しないなら、緑の部分は重複する。
①②のどちらでしょうか?

3)日本以外の場合は、重複判定ですが、
①「国名+W行の文字列」が重複の場合、重複とする。
(この場合、青色部分は重複しない。)
②W行の文字列のみで、重複の判定をする。
(この場合、青色部分は重複する)
①②のどちらでしょうか。

4)日本の場合は、V列に除外という文字があっても、通常の文字列として扱う。
従って、オレンジの部分は重複する。・・・これであってますか。
「VBAを使用した、複数条件での重複チェッ」の回答画像1
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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

Qコピー&ペーストではなく数式やエクセルの機能を使ってデータを反映させたい。

下記の「表①」のエクセルデータを、「表②」に反映させたいです。
「表②」のB3セルに、数式を入れて、「表①」のログイン・ログオフ時刻を「表②」へ
自動反映させたいのですが、どのような式を入れたらいいかがわかりません。

現状は、目視とコピー&ペーストで表①→表②へ貼りつけていますが、
スタッフの数が多いのとシフト勤務で出勤日数も時間もバラバラで、作業が大変です。

また、早くて正確なら他の方法でもいいです。
よろしくお願いします。


表①
A B C D E
1 氏名 日付 ログイン 日付 ログオフ
2 田中 舞子 2017/5/16 8:21:35 2017/5/16 17:34:38
3 田中 舞子 2017/5/17 8:22:40 2017/5/17 17:35:00
4 田中 舞子 2017/5/18 8:28:02 2017/5/18 17:35:55
5 田中 舞子 2017/5/19 8:22:09 2017/5/19 17:34:18
6 田中 舞子 2017/5/22 8:18:03 2017/5/22 17:33:13
7 三田 建造 2017/5/23 8:19:55 2017/5/23 17:39:44
8 三田 建造 2017/5/25 8:21:03 2017/5/25 17:38:04
9 三田 建造 2017/5/26 8:17:45 2017/5/26 17:31:54
10 三田 建造 2017/5/29 8:19:42 2017/5/29 17:32:39
11 三田 建造 2017/5/30 8:20:12 2017/5/30 17:33:26
12 牧 重三 2017/5/31 16:18:33 2017/5/31 23:31:36
13 牧 重三 2017/6/1 16:20:08 2017/6/1 23:35:33
14 牧 重三 2017/6/2 17:18:35 2017/6/2 23:41:05
15 牧 重三 2017/6/5 15:20:00 2017/6/5 23:31:54
16 牧 重三 2017/6/6 19:22:05 2017/6/6 23:41:14
17 長岐 知美 2017/6/7 8:25:48 2017/6/7 17:34:38
18 長岐 知美 2017/6/8 8:26:24 2017/6/8 17:36:52
19 長岐 知美 2017/6/9 8:26:01 2017/6/9 17:34:08
20 長岐 知美 2017/6/12 8:19:24 2017/6/12 17:32:02
21 篠田 亜紀 2017/5/21 8:19:14 2017/5/21 17:32:29
22 柿田 輝未 2017/5/28 7:34:55 2017/5/28 17:17:54
23 荒元 耕平 2017/6/4 7:32:49 2017/6/4 17:32:50
24 佐田 容子 2017/6/11 8:18:35 2017/6/11 17:41:05
25 藤島 澄人 2017/6/12 8:25:15 2017/6/12 17:59:55
26 藤島 澄人 2017/6/13 8:45:31 2017/6/13 17:41:06
27 藤島 澄人 2017/6/14 8:05:34 2017/6/14 17:28:14
28 藤島 澄人 2017/6/15 8:13:25 2017/6/15 17:30:24


表②
   A B C D E F G
1 田中 舞子 三田 建造 牧 重三 ・・・・
2 日付 ログイン ログオフ ログイン ログオフ ログイン ログオフ
3 2017/5/16 B3
4 2017/5/17
5 2017/5/18
6 2017/5/19
7 2017/5/20
8 2017/5/21
9 2017/5/22
10 2017/5/23
11 2017/5/24
12 2017/5/25
13 2017/5/26
14 2017/5/27
15 2017/5/28
16 2017/5/29
17 2017/5/30
18 2017/5/31
19 2017/6/1
20 2017/6/2
21 2017/6/3
22 2017/6/4
23 2017/6/5
24 2017/6/6
25 2017/6/7
26 2017/6/8
27 2017/6/9
28 2017/6/10
29 2017/6/11
30 2017/6/12
31 2017/6/13
32 2017/6/14
33 2017/6/15

下記の「表①」のエクセルデータを、「表②」に反映させたいです。
「表②」のB3セルに、数式を入れて、「表①」のログイン・ログオフ時刻を「表②」へ
自動反映させたいのですが、どのような式を入れたらいいかがわかりません。

現状は、目視とコピー&ペーストで表①→表②へ貼りつけていますが、
スタッフの数が多いのとシフト勤務で出勤日数も時間もバラバラで、作業が大変です。

また、早くて正確なら他の方法でもいいです。
よろしくお願いします。


表①
A B ...続きを読む

Aベストアンサー

表①のB列ですが、シリアル値「2017/5/16 8:21:35」を表示形式で「2017/5/16」と表示していませんか?もしそうであればNGです。B2セルは時刻の部分をゼロにしてください。

2人ログオンする日がある件ですが、残念ながら、この方式では実現できません。
No.1 chonamiさんの案が一番簡単そうです。たぶん、こんな感じを想定していると思われます。

【B3セル】=SUMIFS(表①!$C:$C,表①!$A:$A,B$1,表①!$B:$B,$A3)
※C3セルは、上記を参考にご自分で考えてみて下さい。

QExcel条件付き書式での指定した日付を塗りつぶす方法について

お世話になっております。
添付画像を見本と致します。
BセルからCセルの15日前を塗りつぶし処理をしたいのですがどの様に条件付き書式を
構成すればよろしいのかご教示をいただきたい内容になります。

宜しくお願い致します。

Aベストアンサー

( ‥)ン? 「2017/7/15」前までを塗りつぶしたいという事でいいのかな?
だとして・・・
セルB4~F4までを範囲してしておき、条件付き書式より「新しいルール」から
「数式を使用して・・・」で、入力欄に 「=B3<$E$3」の式を入れ、
書式より塗りつぶしの色を設定→「OK」→「OK」にすると希望通りに。

Qエクセルの重複データを見つけて統合したいです。

みなさんお忙しいところすみません、教えてください。

AとA‘という2つの表があります。データは行で1700件ほどです。
どちらの表にも
エクセルのA列は識別番号で共通の数字が並んでいます。

Aの表には、ABCDEの列で作られています。
A‘の表にはABCDEは同じ内容のセルで、FGH列は別な内容のセルがあります。

A列の識別番号の1700件のなかで、ABCDEを持つ人に、FGHを持つ人を
合成させるためには

どのようにしたらいいでしょうか。

Aベストアンサー

シート名に'は使え無いので
A表をSheet1、A'表をSheet2とすると

Sheet1のF2、G2、H2に以下の関数を入れて、下までコピペする
F2:=VLOOKUP(A2,Sheet2!$A$2:$H$1701,6,FALSE)
G2:=VLOOKUP(A2,Sheet2!$A$2:$H$1701,7,FALSE)
H2:=VLOOKUP(A2,Sheet2!$A$2:$H$1701,8,FALSE)

Qエクセルで三つの条件での参照する方法。 お世話様です。 コード 項目 7月 8月 9月 10月 11

エクセルで三つの条件での参照する方法。
お世話様です。

コード 項目 7月 8月 9月 10月 11月 12月
1234 野菜 8 11
9876 肉類 5 4
小計 5 8 11 4
2345 魚類 12 8
3456 麺類 1 6
小計 1 6
合計

このようなデータがあります。
コードは1000くらいあります。
小計も100くらいあります。

別シートにこれよりも項目が多い表があります。
この表に上記データを反映させたいです。

作業列を作りコードと項目を&で合体させ
ます。
それを検索値とし、別シートの7月の列にvlookup関数にします。
コードの列をフィルタ掛けし小計、合計を非表示にします。
貼り付け。

これを月別に貼り付けしようと思います。
他に効率良い方法ありますか?
言葉足らずな点は補足します。
よろしくお願いいたします。

エクセルで三つの条件での参照する方法。
お世話様です。

コード 項目 7月 8月 9月 10月 11月 12月
1234 野菜 8 11
9876 肉類 5 4
小計 5 8 11 4
2345 魚類 12 8
3456 麺類 1 6
小計 1 6
合計

このようなデータがあります。
コードは1000くらいあります。
小計も100くらいあります。

別シートにこれよりも項目が多い表があります。
この表...続きを読む

Aベストアンサー

素朴な確認をば。
小計行の数値 5、8、11、4 はどのセルとどのセルとの小計になっているの?
「あれは、単に書いたまでで、実はデタラメ!」なんて言わないでネ。回答者は真剣なので。

Q西暦をS〇〇年〇月〇日へ

1964/11/10と入力していましてこれを
S39年11月10日と表示したいのですがどうすればいいのか教えて下さい。

Aベストアンサー

セルの書式設定でユーザ定義を加えれば、
お望みどおりの表示形式が作成できます。

Qエクセル2016 にてご質問をお願いいたします。

シート1、シート2、シート3が3個あります。

全てのシートのA1セルに同じ文字や数字を入れたいと思っております。

シート1でA1セルに入力したものがシート2、シート3も同じ数字になる。
シート2でA1セルに入力したものがシート1、シート3も同じ数字になる。

どのページでA1の文字を入力や修正を行うとすべてのシートが同じになるようにしたいです。

どうかよろしくお願いいたします。

Aベストアンサー

「ThisWorkbook」モジュールのWorkbook_SheetChangeイベントプロシジャに下記のコードを書いちゃうってのは、いかがでしょう。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim r As Range
Set r = Intersect(Target, Sh.Range("A1"))
If r Is Nothing Then Exit Sub
Application.EnableEvents = False
Select Case Sh.Name
Case "Sheet1"
Sheets("Sheet2").Range("A1").Value = r.Value
Sheets("Sheet3").Range("A1").Value = r.Value
Case "Sheet2"
Sheets("Sheet1").Range("A1").Value = r.Value
Sheets("Sheet3").Range("A1").Value = r.Value
Case "Sheet3"
Sheets("Sheet1").Range("A1").Value = r.Value
Sheets("Sheet2").Range("A1").Value = r.Value
End Select
Application.EnableEvents = True
End Sub

「ThisWorkbook」モジュールのWorkbook_SheetChangeイベントプロシジャに下記のコードを書いちゃうってのは、いかがでしょう。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim r As Range
Set r = Intersect(Target, Sh.Range("A1"))
If r Is Nothing Then Exit Sub
Application.EnableEvents = False
Select Case Sh.Name
Case "Sheet1"
Sheets("Sheet2").Range("A1").Value = r.Value
Sheets("Sheet3").Range("A1").V...続きを読む

QVBAか関数でできるのでしょうか?

いつもこちらで皆さんに助けていただいてます。昨日質問しましたが画像が張り付けられていなかったので再度質問です。

”仕入表”タブに入力されたデータが横並びのデータです。
例えば、商品コード/品名/価格/色/入荷数 の並び順で、入力されています。一つの品番に対して色数は1から10個あり、色/入荷数/色/入荷数という風に構成されてます。

そこでこちらでお世話になり、仕入表に入力したデータを縦並びに色別で”在庫表”タブに表を作れるようなVBAを教えていただきました。

画像の仕入表は上の表で、下の表が在庫表に転記されたときの例です。
因みにその時のVBAはこちらです。


Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Application.Calculation = xlCalculationManual
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D1", Cells(Rows.Count, 4).End(xlUp)).NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
Application.Calculation = xlCalculationAutomatic
End Sub '//この行まで


そこで、また新たにもしできるなら教えていただきたいことが出てきました。
仕入表タブのC列に出荷した商品が出たら「出荷済」と入力していますが(画像ではA列から埋まってますが実際はA~Cは空白にしてます)、”出荷済”にしたときに在庫表タブの同じ品番の商品すべて(日付~すべての色の個数まで)を黄色の色付けにすることはできますか?
もしできるとすごく楽になるのですが・・・
それではよろしくお願いします。

いつもこちらで皆さんに助けていただいてます。昨日質問しましたが画像が張り付けられていなかったので再度質問です。

”仕入表”タブに入力されたデータが横並びのデータです。
例えば、商品コード/品名/価格/色/入荷数 の並び順で、入力されています。一つの品番に対して色数は1から10個あり、色/入荷数/色/入荷数という風に構成されてます。

そこでこちらでお世話になり、仕入表に入力したデータを縦並びに色別で”在庫表”タブに表を作れるようなVBAを教えていただきました。

画像の仕入表は上の表で...続きを読む

Aベストアンサー

No6です。
以下の箇所を修正しました。前回のマクロをこれで入れ替えてください。
1)エラー13で型が一致しません。・・・この対策
色の箇所が0以外なら処理しているのを、空白以外なら処理するようにしました。
2)今更ですが黄色の色付けを日付の列だけにすることは可能でしょうか。
日付の列だけ黄色にしました。
-------------------------------------------------------
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Dim wns As Worksheet
Application.Calculation = xlCalculationManual
Set wS = Worksheets("仕入表")
Set wns = Worksheets("納品仕訳")
Worksheets("在庫表").Activate '追加
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
.Range(.Cells(2, "D"), .Cells(lastRow, "I")).Interior.Pattern = xlNone
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> "" Then '//画像で「0」が表示されているので「0」以外を追加★ '修正
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
If wns.Cells(i + 2, "C").Value = "出荷済" Then
.Range("D" & cnt).Interior.Color = 65535 '修正
End If
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D1", Cells(Rows.Count, 4).End(xlUp)).NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
Application.Calculation = xlCalculationAutomatic
End Sub '//この行まで
-------------------------------------

No6です。
以下の箇所を修正しました。前回のマクロをこれで入れ替えてください。
1)エラー13で型が一致しません。・・・この対策
色の箇所が0以外なら処理しているのを、空白以外なら処理するようにしました。
2)今更ですが黄色の色付けを日付の列だけにすることは可能でしょうか。
日付の列だけ黄色にしました。
-------------------------------------------------------
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Dim wns As Works...続きを読む

Qエクセル 数式を教えてください!

エクセルの数式を教えてください!

エクセルでタイムカードを作成しているのですが、休憩時間が2枠ある場合(①通常時間帯②深夜時間帯)の各時間(拘束時間・労働時間・日勤時間・通常残業・深夜
時間・深夜残業)の算出数式が分かりません。

画像のように、休憩時間は①通常時間帯と②深夜時間帯(22:00~5:00)の2枠あり、それぞれ合計時間を数値で入力します。
各時間帯の休憩時間がそれぞれ、
・拘束時間・労働時間・日勤時間・通常残業・深夜時間・深夜残業に反映させるようにしたいのですが、休憩が2枠あるため数式がうまくいきません。。

深夜帯(深夜時間・深夜残業)は22:00~5:00で、1日の労働時間が8時間を超えた場合に残業となります。

画像のように、【拘束時間・労働時間・日勤時間・通常残業・深夜時間・深夜残業】に適切な数値(出勤退勤はh:mmで入力し、その他は15分=0.25単位の数値)で計算されるようにしたいです!

賢者の皆様、どうか宜しくお願い致します!

Aベストアンサー

ANo3です。

>15分を0.25と数値で計算させる方法がわからないので
シリアル値は1日が1.0となるように計算しています。

シリアル値の時間をTとするなら
 =HOUR(T)+MINUTE(T)/60
とすることで、時間単位(15分は0.25時間)に該当する値を得られます。
例えば、3:15 → 3.25 となります。

上記の1日=1.0(1日=24時間)を利用すれば、もっと簡単に
 =T*24
とすることでも、同様の結果を得ることができます。

※どちらの場合も、表示書式は「数値」や「標準」としておく必要があります。

Qエクセルの式がわかりません、教えてください。

fujillinさん解り易くしました。

報告書を作成する際、入力内容から、A(業務報酬)
とB(預り金)を選ばせようとしていますが、うまく表示されません。どこがいけないのでしょうか?

パターンは4つありますが、
もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
B =$V$18(預り金)

もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が無かったら)
この事例はあり得ませんので削除

もし、$AP$7="○" ○で(請求書が弊社宛)
('!$AL$7="")文字式が空欄だったら(下請会社名の記載が無かったら)
A =$V$19(業務報酬)金額的には100%
もし、$AP$7="○" ○で(請求書が弊社宛)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
A =$V$19(業務報酬)金額的には50%

を選ばせようとしています。

疑問点の $AT$7=(支払金額)は上記の式に関係ないものとして削除しました。

以下の文書では、もし、$AP$7="×"(請求書が弊社宛ではなくて)で $AT$7=""(支払金額の記載が無かったら)A=$V$19(業務報酬)

もし、$AP$7="○"(請求書が弊社宛で)、,NOT($AL$7==""(下請会社名の記載が有ったら)、A=$V$19(業務報酬)
そうでなければ、B=$V$18(預り金)

=IF(AND($AP$7="×",$AT$7=””),$V$19,IF(OR($AP$7="○",NOT($AL$7="")),'$V$19,$V$18))

改善策1として
=IF($AP$7="×",$V$18,$V$19)を入れてみましたが、
もし請求書が弊社宛では無ければ、預り金、そうでなければ業務報酬

もし、$AP$7="○" ○で(請求書が弊社宛)
($AL$7="")文字式が空欄だったら(下請会社名の記載が無かったら)
A =$V$19(業務報酬)
がうまくいきません。


改善策2として
=IF(OR($AP$7="○",NOT($AL$7="")),$V$18,$V$19)で作成しましたが、間違っていました。
(請求書が弊社宛)または(下請会社名の記載が有ったら)、業務報酬、そうでなければ預り金


パターン例
請求書が弊社宛 請求書が弊社宛じゃない
下請会社有 業務報酬 預り金
下請会社無 業務報酬 -

fujillinさん解り易くしました。

報告書を作成する際、入力内容から、A(業務報酬)
とB(預り金)を選ばせようとしていますが、うまく表示されません。どこがいけないのでしょうか?

パターンは4つありますが、
もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が有ったら)
B =$V$18(預り金)

もし、$AP$7="×" ×で(請求書が弊社宛ではなくて)
NOT('!$AL$7="")文字式が空欄じゃなかったら(下請会社名の記載が無かった...続きを読む

Aベストアンサー

またしても添付画像が判別できないですけど。
細かく書いても表示される画像は縮小されてしまうので、
それでもわかるように工夫(画像をトリミング;必要な部分以外は切り捨てる)する必要があります。
その方法は質問に関係ないので省きます。

画像のものを憶測で簡略化したものを添付します。
これで式を考えてみます。

私が回答投稿して良い空気なのかわからないけど…

■APが「○」の場合
ALやAYの内容がどうであれ、結果は全て「業務報酬」になります。

これを、IF関数を使って表すと以下のようになります。

=IF(AP="○","業務報酬",【AP="×"の場合の処理】)   …【式1】

これで、条件①~④の場合の処理は完了。

■APが「×」の場合
結果が「業務報酬」と「預り金」のどちらかになります。
どの条件で結果が分岐するのか、見てみると・・・

AYに金額の記入があるか、無い(空欄)かで違います。

これを、IF関数を使って表すと以下のようになります。

=IF(AY<>"","業務報酬","預り金")   …【式2】

これで、条件⑤~⑧の場合の処理は完了。

■合体!

(式1)と(式2)を合体させると、条件①~⑧全てを処理できる式になります。
ではやってみましょう。

=IF(AP="○","業務報酬",【AP="×"の場合の処理】)
   ↓
=IF(AP="○","業務報酬",【式2】)
   ↓
=IF(AP="○","業務報酬",IF(AY<>"","業務報酬","預り金"))   …完成!

※もちろん、「AP」「AY」だけだとセルになっていないので、行番号も加えて下さい。


■疑問
あくまで、私が画像から読み取った条件で考えたのですが

AL(業者名の有無)については、結果表示させるにあたり、条件として不要だと思います。

条件④と条件①の違いは?(画像で判別不可)

条件④と条件⑧は無いパターンとのことでしたので、
データミスでも存在しえないないものと解釈しまして、
敢えてそのようなケースが合った場合のエラー処理などは含めていません。

---------------------
★別解
添付した表を前提条件としての別解を。

条件がいくつもあっても、結果が「預り金」となるパターンは条件⑦、ただ1つのみ。

そこだけをIFで判別します。

=IF(AND(AP="×",AY=""),"預り金","業務報酬")

こんなにシンプルになります。
※もちろん、「AP」「AY」だけだとセルになっていないので、行番号も加えて下さい。

またしても添付画像が判別できないですけど。
細かく書いても表示される画像は縮小されてしまうので、
それでもわかるように工夫(画像をトリミング;必要な部分以外は切り捨てる)する必要があります。
その方法は質問に関係ないので省きます。

画像のものを憶測で簡略化したものを添付します。
これで式を考えてみます。

私が回答投稿して良い空気なのかわからないけど…

■APが「○」の場合
ALやAYの内容がどうであれ、結果は全て「業務報酬」になります。

これを、IF関数を使って表すと以下のようになります...続きを読む

Qマクロで消去したいです

たびたび同じ質問をしてしまい申し訳ありません
以前教えてもらった
Sub Sample()

Dim c As Range, cbx As Object
Dim rw As Long
Dim t As Single, h As Single, w As Single
Dim y As Single, v As Boolean, f As Boolean

For rw = 6 To 15
Set c = Cells(rw, 1)
t = c.Top
h = t + c.Height
w = c.Width
f = False

' Form Control
For Each cbx In ActiveSheet.CheckBoxes
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f = True
If cbx.Value = xlOn Then v = True Else v = False
Exit For
End If
Next cbx

' ActiveX Control
If Not f Then
For Each cbx In ActiveSheet.OLEObjects
If TypeName(cbx.Object) = "CheckBox" Then
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f = True
v = cbx.Object.Value
Exit For
End If
End If
Next cbx
End If

If f And v Then
Cells(rw, 3).Resize(, 3).ClearContents
Cells(rw, 16).Resize(, 2).ClearContents
End If
Next rw

End Sub
でシート「操作画面」のC13:E13,P13:Q13 C15:E15,P15:Q15は消去することができました
それを応用して別シート「集計」のI7:I12 K7:K12も合わせて消去しようかと思ったのですが上手く
動作しませんでした

大変申し訳ないのですが、また、ご指導のほどよろしくお願いいたします

たびたび同じ質問をしてしまい申し訳ありません
以前教えてもらった
Sub Sample()

Dim c As Range, cbx As Object
Dim rw As Long
Dim t As Single, h As Single, w As Single
Dim y As Single, v As Boolean, f As Boolean

For rw = 6 To 15
Set c = Cells(rw, 1)
t = c.Top
h = t + c.Height
w = c.Width
f = False

' Form Control
For Each cbx In ActiveSheet.CheckBoxes
y = cbx.Top + cbx.Height / 2
If t < y And y < h And cbx.Left < w Then
f ...続きを読む

Aベストアンサー

前回回答者です。

最初に、前回の説明と重複になってしまいますが・・・
https://oshiete.goo.ne.jp/qa/9807697.html

説明にもありますように、通常はセルとチェックボックスの関係をきちんと取れるようにしておいてから、マクロを作成するものと思います。
その意味において、前回のNo1様、No3様の回答は関係性を確かなものにする方法を提示なさっています。

No2の回答は、それらの情報が与えられないので、しかたなく見た目から推測する方法で処理したものですので、正確性や効率性の点であまり良いものとは言えません。
また、チェックボックスも複数の種類が想定でき、どちらなのかが不明でしたので、両方を考慮しましたが、実際には(常識的に)どちらか一方だけの利用であると推測できますので、結果的に残り半分のコードは不要ということになります。
さらに、きちんと関係性が取れている場合は、位置関係から探す必要もなくなるので、コードも大幅に短くできるはずですが、不明な状況でしたので、ひとまず冗長なコードであっても提示しておけば、後は、質問者様がアレンジなさるであろうことを期待しての回答でした。


今回のご質問で、
・それを応用して~~
・〇〇も合わせて消去しようかと~
・上手く動作しませんでした
「応用する」、「うまく動作しない」という情報だけから推理しようとしても、あまりにも可能性が広がりすぎてしまって皆目見当がつきません。

多少なりともヒントになりそうな情報として記せそうなのは、前回の回答で「セルの内容を消去している」部分は
> Cells(rw, 3).Resize(, 3).ClearContents
> Cells(rw, 16).Resize(, 2).ClearContents
の2行である、ということぐらいでしょうか。
(この部分に関しては、前回のNo3様と、たまたま同様の記述になっています)
ANo3様のコードの方が、シートを明記する形式で対象を指定していますので、より明確な記述方法になっていると言えるかもしれません。

ちなみに
>別シート「集計」のI7:I12 K7:K12を消去する
という部分だけであれば、
 Worksheets("集計").Range("I7:I12,K7:K12").ClearContents
のような記述で実現できるはずと思います。

前回回答者です。

最初に、前回の説明と重複になってしまいますが・・・
https://oshiete.goo.ne.jp/qa/9807697.html

説明にもありますように、通常はセルとチェックボックスの関係をきちんと取れるようにしておいてから、マクロを作成するものと思います。
その意味において、前回のNo1様、No3様の回答は関係性を確かなものにする方法を提示なさっています。

No2の回答は、それらの情報が与えられないので、しかたなく見た目から推測する方法で処理したものですので、正確性や効率性の点であまり良いものとは...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報