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

エクセルでログイン画面を作成しています。
①Userform1
②Textbox1(ユーザーID)
③Textbox2(パスワード)
④Commandobutton1(ログイン)
⑤Commandobutton2(終了)
を配置し、エクセルシートには、ユーザーID、パスワードの登録シートを作成してます。

【標準モジュール】
Sub Sample()
Dim i As Byte
For i = 1 To Sheets.Count
If Sheets(i).Name = "登録" Then
Application.DisplayAlerts = False
Sheets(i).Delete
Application.DisplayAlerts = True
Exit For
End If
Next i
Sheets.Add(before:=Sheets(Sheets.Count)).Name = "登録"
For i = 1 To 3
Cells(i + 1, 1) = "名前" & i
Cells(i + 1, 2) = Chr(64 + i) & 0 & i
Cells(i + 1, 2).NumberFormatLocal = """(パス)""@"
Next i
Range("A1:B1") = Split("氏名, パスワード")
Range("A:B").EntireColumn.AutoFit
Range("A:B").HorizontalAlignment = -4108
End Sub

【This Workbook】
Private Sub Workbook_Open()
Sheets.Add before:=Sheets(1)
Sheets(1).Select
UserForm1.Show
End Sub

【User Form 1】
Private Sub CommandButton1_Click()
With Sheets("登録")
If WorksheetFunction.CountIf(.Range("A:A"), TextBox1.Text) > 0 Then
If WorksheetFunction.Index(.Range("B:B"), _
WorksheetFunction.Match(TextBox1.Text, .Range("A:A"), 0)) = _
TextBox2.Text Then
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
MsgBox "ログイン", 64
End
Else: MsgBox "パスワード相違", 48
End If
Else: MsgBox "氏名相違", 48
End If
End With
End Sub


Private Sub CommandButton2_Click()

Application.DisplayAlerts = False
Application.Quit

End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "ユーザーIDとパスワードを入力して下さい"
Cancel = True
End If
End Sub

上記のようにコードを入力してますが、ユーザーIDとパスワードに何も入力せず、ログインボタンをクリックすると”WorksheetFunction クラスの Match プロパティを取得できません”というフォームが表示されその表示の終了をクリックするとログイン画面が消え、そのままログインできるようになります。

ユーザーIDとパスワードに何も入力せず、ログインをクリックした場合、”ユーザーIDとパスワードを入力して下さい”というフォームを表示させ、ユーザーIDとパスワードを入力しないと先へ進めないようにしたいと考えています。(その他に動作については、意図することができるようになってます。)
コードの追加なのかコードの修正なのかどなたかご存知の方がいましたら詳しく教えてください。
よろしくお願い致します。

A 回答 (1件)

こんにちは。



少し、癖のあるコードです。もしも、ご質問者と、このコードを書いた本人と同じでしたら、今の段階で直したほうがよいと思います。
(何を偉そうにと思うなら無視なさって結構です。)

1. MsgBox "ログイン", 64 ←数字で書く
Range("A:B").HorizontalAlignment = -4108 ←数字で書く

私も、数字で書く時はありますが、意図して使うだけです。組み込み定数の割り振りは、製作者側のものだから、それを、こちらの了解の元で決めてしまうと、ミスを起こすことがあります。MSが主要な場所で組み込み定数を変更することはないはずですが、名称を替えていることがあります。もう一つは、可読性が落ちるということです。

2.Else: MsgBox "パスワード相違", 48 
省スペースの書き方が、全体をスッキリさせることがありますが、この場合は、特に変化ありません。ベテランさんで、こういう書き方をする人もいますが。

If WorksheetFunction.Index(.Range("B:B"), _
WorksheetFunction.Match(TextBox1.Text, .Range("A:A"), 0)) = _
これは、うまくないです。なぜなら、Match関数が、Applicationエラーではなく、VBAエラーを吐き出すことを想定しているのですから、これでは全体が死んでしまいます。


Private Sub CommandButton1_Click()
 Dim i As Variant
 With Sheets("登録")
  If TextBox1.Text = "" Or TextBox2.Text = "" Then
    MsgBox "ユーザーIDとパスワードを入力して下さい", vbExclamation
    Exit Sub
  End If
  If WorksheetFunction.CountIf(.Range("A:A"), TextBox1.Text) > 0 Then
   i = Application.Match(TextBox1.Text, .Range("A:A"), 0)
   'あえて抜き出しました。
   If IsNumeric(i) Then
    If StrComp(.Cells(i, 2).Value, TextBox2.Text) = 0 Then
     Application.DisplayAlerts = False
     Sheets(1).Delete  '挿入削除を繰り返すと負荷が多くなります。
     Application.DisplayAlerts = True
     MsgBox "ログイン", 64
    Else
     MsgBox "パスワード相違", 48
    End If
   Else
    MsgBox "氏名相違", 48
   End If
   End If
  End With

 End Sub

Private Sub CommandButton2_Click()
 Application.DisplayAlerts = False '* 
 Application.Quit
 ThisWorkbook.Close False  '単独で開いている場合、Quit とコードが逆さになる
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = vbFormControlMenu Then
  MsgBox "終了ボタンを使ってください。", vbInformation
  Cancel = True
 End If
End Sub

なお、登録シートは、xlSheetVeryHedden で扱った方がよいと思います。

一例/終了する時も同等のものを作ります。
Private Sub Workbook_Open()
 If Worksheets("登録").Visible <> xlSheetVeryHidden Then
  Worksheets("登録").Visible = xlSheetVeryHidden
 End If
 UserForm1.Show
End Sub
    • good
    • 0
この回答へのお礼

大変詳細にご回答いただきありがとうございました。コードを修正したところうまく動作しました。大変勉強になりました。

お礼日時:2017/07/14 01:38

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

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

Qエクセル リストで指定したセルを別シートで参照し、参照セルから指定セルを表示させる方法?

エクセルで自社式の伝票を作成しようと思っています。

シート1のA列2行目から下に向かって商品名リストが、
シート1の1行目B1から右に向かって事業所名が入り、いずれも増加していきます。
シート1のB2以降は商品単価が入り、事業所単位で単価の違うものを一覧化してあります。

シート1 【イメージ】
          B1     B2    B3
         事業所1  事業所2  事業所3
A2 商品イ    200円   空欄    空欄
A3 商品ロ    空欄    330円   空欄
A4 商品ハ    180円   空欄    170円

シート2のA列では事業所1・2・3がドロップダウンリスト表示されるようになっており、
シート2のB列で、A列でリスト表示した現業名に対応する商品リストだけをリスト表示させ、
更にはC列でその価格を表示したいのですがうまくいきません。

エクセル関数に強い方、どうか教えていただけませんか?

Aベストアンサー

●入力シートのA列一番下の事業所リストから、商品名を表示する
Sheet2!E1セルに
=IFERROR(INDEX(Sheet1!A:A,SMALL(IF(INDEX(Sheet1!B$2:D$20,,MATCH(LOOKUP("ーー",A:A),Sheet1!$B$1:$D$1,0))<>"",ROW(Sheet1!B$2:B$20)),ROW(A1))),"")
[Ctrl]+[Shift]+[Enter]で確定。配列数式、{}で囲まれる。
下へオートフィル

Sheet2!B列の入力規則のリスト
=OFFSET(E$1,,,COUNTIF(E:E,"?*"))


●G列以降(右)に商品名を表示する(計算が重くなり、非現実的)
Sheet2!G2セルに
=IFERROR(INDEX(Sheet1!$A:$A,SMALL(IF(INDEX(Sheet1!$B$2:$D$20,,MATCH($A2,Sheet1!$B$1:$D$1,0))<>"",ROW(Sheet1!$B$2:$B$20)),COLUMN(A2))),"")
[Ctrl]+[Shift]+[Enter]で確定。配列数式、{}で囲まれる。
右へ下へオートフィル

Sheet2!B列の入力規則のリスト
=OFFSET($G1,,,,COUNTIF($G1:$Z1,"?*"))

●共通
Sheet2!C2セル
=INDEX(Sheet1!$B$2:$D$4,MATCH($B2,Sheet1!$A$2:$A$4,0),MATCH($A2,Sheet1!$B$1:$D$1,0))

●入力シートのA列一番下の事業所リストから、商品名を表示する
Sheet2!E1セルに
=IFERROR(INDEX(Sheet1!A:A,SMALL(IF(INDEX(Sheet1!B$2:D$20,,MATCH(LOOKUP("ーー",A:A),Sheet1!$B$1:$D$1,0))<>"",ROW(Sheet1!B$2:B$20)),ROW(A1))),"")
[Ctrl]+[Shift]+[Enter]で確定。配列数式、{}で囲まれる。
下へオートフィル

Sheet2!B列の入力規則のリスト
=OFFSET(E$1,,,COUNTIF(E:E,"?*"))


●G列以降(右)に商品名を表示する(計算が重くなり、非現実的)
Sheet2!G2セルに
=IFERROR(INDEX(Sheet1!$A:$A,SMALL(IF(INDEX(Sheet...続きを読む

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...続きを読む

QExcelで名前の7文字組みの方法を教えてください

Excelデータで名前をスペースで入れて7文字組みに変換させたいのですが、
関数またはVBAなどの方法を教えていただけませんでしょうか?
今は関数で個別でMID関数を使い分けてしています。

例) 
林一    → 林     一     田中一   → 田 中   一
林太郎   → 林   太 郎     田中太郎  → 田 中 太 郎
林孝太郎  → 林   孝太郎     田中孝太郎 → 田 中 孝太郎

佐々木一  → 佐々木   一
佐々木太郎 → 佐々木 太 郎
佐々木孝太郎→ 佐々木 孝太郎

Aベストアンサー

板汚しすみません。まだ半角スペース残ってた
=CHOOSE(LEN(A2),,LEFT(A2,1)&REPT(" ",5)&RIGHT(A2,1),
REPLACE(LEFT(A2,B2),2,0,REPT(" ",B2-1))&REPT(" ",3)&REPLACE(RIGHT(A2,3-B2),2,0,REPT(" ",2-B2)),
IF(MOD(B2,2),LEFT(A2,B2)&REPT(" ",3)&RIGHT(A2,4-B2),
REPLACE(LEFT(A2,2),2,0," ")&" "&REPLACE(RIGHT(A2,2),2,0," ")),
IF(OR(B2=1,B2=4),LEFT(A2,B2)&REPT(" ",2)&RIGHT(A2,5-B2),
REPLACE(LEFT(A2,B2),2,0,REPT(" ",3-B2))&" "&REPLACE(RIGHT(A2,5-B2),2,0,REPT(" ",B2-2))),
LEFT(A2,B2)&" "&RIGHT(A2,6-B2),A2)

Qエクセルの、マクロとは何ですか?

エクセルの、マクロとは何ですか?

Aベストアンサー

エクセルの裏に貼り付けてあるVBと言うプログラムです。
ここにコードィングすれば、そのエクセルを開いて使う事が出来ます。
使う:プログラムを実行できる。

下は例です。
Sheet1のA列をSheet2のA列へ1個置きに転送する

Sub WK()
Dim CNT As Long
Dim END1 As Long
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet

Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet2")
END1 = Sh1.Range("B65536").End(xlUp).Row

For CNT = 2 To END1 STEP 2
Sh2.Range("A" & CNT).Value = Sh1.Range("A" & CNT1).Value
Next CNT
E1:
Application.StatusBar = False
End Sub

エクセルの裏に貼り付けてあるVBと言うプログラムです。
ここにコードィングすれば、そのエクセルを開いて使う事が出来ます。
使う:プログラムを実行できる。

下は例です。
Sheet1のA列をSheet2のA列へ1個置きに転送する

Sub WK()
Dim CNT As Long
Dim END1 As Long
Dim Sh1 As Worksheet
Dim Sh2 As Worksheet

Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet2")
END1 = Sh1.Range("B65536").End(xlUp).Row

For CNT = 2 To END1 STEP 2
Sh2...続きを読む

Q同一セル内で重複した特定の文字を削除したい

Windows8.1、Excel2013です。

セル内に同一の文字列が複数出てくる場合に2つめ以降を全て削除したいです。
該当の文字列は複数ありますが、限定されています。

例えば

ABC犬DEやぎGH犬IJK山羊LM犬N
↓2回目以降の「犬」「やぎ」を削除
ABC犬DEやぎFGHIJKLMN

わかりにくくて申し訳ございませんが、初心者のためお知恵拝借できないでしょうか?

Aベストアンサー

事例が1つだけしか紹介されていないのに その事例がおかしいものだと
どういう条件なのかさっぱり分からなくなります。

> ↓2回目以降の「犬」「やぎ」を削除
> ABC犬DEやぎFGHIJKLMN
「ぎ」と「G」の間に「F」が追加された理由は何ですか?
「やぎ」が削除になる理由は何ですか?
その結果として「山羊」が削除されたのは何故ですか?

> わかりにくくて申し訳ございませんが
わかりにくいと分かっているなら もっと丁寧に説明すべきかと思います。
質問のわかりにくさは初心者かどうかの問題ではないので。

Q特定の列に値があれば日付を取得したい。(空欄なら無視)

左の様な元データから右の様に日付を抽出したいです。

*以下、元データの説明
・データは月によって量が違います。
・データはさらに別の元データ(1月~12月まである)から月ごとにシートに分けて抽出済みです。
・データの値は必ず"1"が入ります。
・データ1,2,3いずれにもデータが無ければ日付はありません。
・同じ日に同じデータに値が入る事もあります。(元データの3行目と4行目のデータ3)
・同じ日に複数のデータに値が入る事もあります。(元データ3行目のデータ2とデータ3)

*以下、やりたい事
・抽出シートに1,2,3それぞれに値がある日の日付を抽出したい。
・データに値が無しの行は無視(抽出せずに詰める)する。
・同じ日に同じデータがある時はその数分日付を抽出。(抽出データのデータ3の2行目、3行目)

 要するに特定の列に値があればC列の値を抽出したいが、値の無い行は無視をする(抽出データには空欄を入れるのではなく上に詰める)です。

以上分かりづらい質問ですがお力添えお願いいたします。

Aベストアンサー

#1です。

数式案をお勧めするつもりはないので別にいいのですが

> 教えて頂いた物はシートが表示された状態でCtrl+Shift+Enterという作業
> をしないといけない物ですよね?
違います。数式を確定する時の操作であって 利用者には無関係な話です。
どうしても嫌なら 名前定義してやれば済みます。

マクロでやるにしても

Sub Macro1()
Dim sht1 As Worksheet, sht2 As Worksheet
Dim sht1Val As Variant, lr As Long
Dim i As Long, j As Long
Set sht1 = ThisWorkbook.Worksheets("Sheet1")
Set sht2 = ThisWorkbook.Worksheets("Sheet2")
Application.ScreenUpdating = False
With sht1
sht1Val = .Range("B2:F" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
End With
With sht2
.Range("A:D").ClearContents
.Range("A1").Value = sht1.Range("B1").Value
.Range("B1:D1").Value = sht1.Range("D1:F1").Value
For i = 1 To UBound(sht1Val)
For j = 3 To 5
If sht1Val(i, j) = 1 Then
lr = .Cells(Rows.Count, j - 1).End(xlUp).Row
.Cells(lr + 1, 1).Value = sht1Val(i, 1)
.Cells(lr + 1, j - 1).Value = sht1Val(i, 2)
End If
Next j
Next i
End With
Application.ScreenUpdating = False
Set sht1 = Nothing: Set sht2 = Nothing
End Sub

#1です。

数式案をお勧めするつもりはないので別にいいのですが

> 教えて頂いた物はシートが表示された状態でCtrl+Shift+Enterという作業
> をしないといけない物ですよね?
違います。数式を確定する時の操作であって 利用者には無関係な話です。
どうしても嫌なら 名前定義してやれば済みます。

マクロでやるにしても

Sub Macro1()
Dim sht1 As Worksheet, sht2 As Worksheet
Dim sht1Val As Variant, lr As Long
Dim i As Long, j As Long
Set sht1 = ThisWorkbook.Worksheets("Sheet1")
Set sht...続きを読む

Qエクセル関数、2つの数字で小さい方を表示、ただし値が0のときは大き方を表示

A1とB1の小さい方の値をC1に表示する時、C1=MIN(A1,B1)を使うことは知っています。
ただし、小さい値が0のときは大きい値を表示したいのです。
両方を同時に満たす関数があればお教えください。

Aベストアンサー

関数としては下記の通りでどうでしょうか.
=IF(OR(A1=0,B1=0),MAX(A1:B1),MIN(A1:B1))

関数の説明としては
IF関数を用いて論理式を"A1またはB1が0である"とした時,
真の値としてA1~B1の最大値(この場合にはセルが2つしかないので,0でない方を選ぶという事)を返し,
偽の値としてA1~B1の最小値を返すとしました.

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エクセル 条件付き書式について

エクセル 条件付き書式について
今、エクセルで一ヶ月の職員の業務予定表を作成しています。
職員の中にハーフ勤務(平日の半分だけ勤務)の人がいまして、お休みの日にグレーの色をつけています。
これをどうにか条件付き書式で年月を変えても自動で日付、曜日を見て変わるようにしたいのですが、可能でしょうか?

一日置きに色をつけるのはできるのですが、それだと土日含めて一日置きになってしまい、ずれが生じてしまいます。

よろしくお願いいたします。m(_ _)m

Aベストアンサー

こんにちは

ハーフ勤務のパターンは、ある日に休むのと同じ日に出勤との2通りあると思います。
それに、通常出勤を加えると全部で3パターンになるのでしょうか?

平日の数を数えて偶数か奇数かで判断できそうに思いますが、いずれにしろ、実用化するには祝日が入ったらどうするかとか、GWや正月休み等も考慮する必要が出てくるのではないかと想像しますので、最終的にはユーザ定義関数やマクロを利用することになりそうな気がします。


ともあれ、ご質問の範囲限定であれば条件付き書式でも対応できそうですので・・・
添付図で、
・2行目は日付がシリアル値で入っています。
・3行目はC3が =WEEKDAY(C2)の要領で曜日表示しています。
・土日は条件付き書式で色を変えてあります。
・表内の条件付き書式に以下を追加。C4セルの条件式として
  =MOD(COUNTIFS($C$3:C$3,"<>1",$C$3:C$3,"<>7"),2)+1=$A4
 という条件でグレー表示するように設定します。
 この書式の、優先順位は「土日の設定」よりも低くしておきます。

※ 個人の勤務パターンを表す項目(A列)を作成しています。
  数値(1または2)がハーフ勤務、未入力は通常勤務です
※ 実際には、別に氏名と勤務形態等を示すマスターがあって、そちらを参照するようなことになるのかも知れませんね。

こんにちは

ハーフ勤務のパターンは、ある日に休むのと同じ日に出勤との2通りあると思います。
それに、通常出勤を加えると全部で3パターンになるのでしょうか?

平日の数を数えて偶数か奇数かで判断できそうに思いますが、いずれにしろ、実用化するには祝日が入ったらどうするかとか、GWや正月休み等も考慮する必要が出てくるのではないかと想像しますので、最終的にはユーザ定義関数やマクロを利用することになりそうな気がします。


ともあれ、ご質問の範囲限定であれば条件付き書式でも対応できそうです...続きを読む

Qexcel If関数についてのご質問 セルM4に 下記のように関数を入力しました IF(Count

excel If関数についてのご質問
セルM4に
下記のように関数を入力しました

IF(Count IF(O12:O47,"合格”),"合格”,"不合格”)
この関数だと常に不合格と表示されるのですが例えばO12が空白であれば表示をしないという関数は出来ないでしょうか
アドバイスお願いいたします

Aベストアンサー

>この関数だと常に不合格と表示されるのですが
どうして、常に不合格と表示されるのですか?
常に不合格となるなら、これらの式は不要ではないですか?

>O12が空白であれば表示をしない
if(O2="","",IF(Count IF(O12:O47,"合格”),"合格”,"不合格”))
ではだめなのかな?


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

人気Q&Aランキング

おすすめ情報