ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

日付の書式がダブルクリックしないと反映されません。
大量にデータがある為、マクロで一気に書式の変更が反映されるようにしようと思っています。

年月日    マクロ後
H01/06/01  1989/6/1
H22/04/01  2010/4/1  
H16/04/01  2004/4/1  
H24/05/01  2012/5/1
H25/03/16  2013/3/16


Sub Macro2()
With ActiveSheet
.Columns(6).TextToColumns
End With
end sub

前まではこのマクロでできていた気がするのですが、反映されなくなりました。
マクロの記録をして、覚えさせた後に同じことをしても反映されなくなりました。
どなたかいい方法を教えてください。よろしくお願いします。

A 回答 (2件)

ANo1です。



>中身は同じくH01/06/01のままで、ダブルクリックしないと変化がありません。
おやっ?! 元のデータは日付型ではなく、単なる文字列になっているのでしょうか?

>前まではこのマクロでできていた気がするのですが、反映されなくなりました
想像ですが、データの条件(型)が変わったために処理できなくなったのではないでしょうか?

・・・それでは、こんな感じでは?
 For Each c In ActiveSheet.Range("F1:F1000")
  c.Value = Format(c.Text, "yyyy/m/d")
 Next c
※ 一括ではできないため、F列内のセルを順に処理していますので、範囲を限定しておかないと時間がかかることがあります。(上例では、F1~1000に設定してあります。)
※ 上の例は文字列データの"H01/06/01"等を、文字列データの"yyyy/m/d"形式に変更するものです。
※ 元のデータに日付型も混在している場合や、結果を日付型にしたい場合は、上の処理の前に(ANo1の要領で)セルの書式を"yyyy/m/d"に設定しておけばよいでしょう。
(そうすることで、元のデータが文字列、日付型かにかかわらず、日付型に変換することができるようになると思います)
    • good
    • 0
この回答へのお礼

助かりました

元のデータは文字列です。texttocolumnsの前に設定変更していますが、変化ありませんでした。

>想像ですが、データの条件(型)が変わったために処理できなくなったのではないでしょうか?
私もそんなところかなぁと思っています。texttocolumns便利だったのにな。

出来るようになりました。
詳しく説明していただき、ありがとうございました。

お礼日時:2017/07/13 16:13

こんにちは



F列全体に「yyyy/m/d」形式で書式をセットしたいということと解釈しました。

ActiveSheet.Columns(6).NumberFormat = "yyyy/m/d"

で、どうでしょうか?
    • good
    • 0
この回答へのお礼

書式はセットできますが、中身は同じくH01/06/01のままで、ダブルクリックしないと変化がありません。

「yyyy/m/d」形式で表示がされなくてもいいのですが、最終的にやりたいことは西暦での検索です。言葉足らずで申し訳ありません。
1989/6で検索したら1行目がヒットするようにしたいのです。

お礼日時:2017/07/12 17:32

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

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

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

QExcel VBAを使った複数重複行の抜き出しについて教えてください

以下のようなシートから、「郵便番号」の左から5桁(000-00)が20個以上重複しているsheet1の行を抜き出して、別シートに書き出したいと思っております。その時、重複数表示と郵便番号で並べ替えもしたいです。
全部で約10000行あります。(変動します)
VBAでのプログラムを教えて頂けないでしょうか。
初めての質問ですが、どうぞ宜しくお願い致します。

sheet1
   A    B      C     D    E
1 顧客コード 氏名   郵便番号   住所1  住所2
2 000123  〇〇  256-0000   〇〇県  1-3-5
3 000124  ▲□  258-3311   □▲県  2-6-9
3 000180  〇▲  258-3325   ●□県  3-8-2
3 000186  〇●  258-8236   〇■県  2-4-4
             ・
             ・ 
             ・
sheet2
   A      B
1 郵便番号  重複数
2 258-33   36
3 259-56   25
    ・
    ・
    ・

以下のようなシートから、「郵便番号」の左から5桁(000-00)が20個以上重複しているsheet1の行を抜き出して、別シートに書き出したいと思っております。その時、重複数表示と郵便番号で並べ替えもしたいです。
全部で約10000行あります。(変動します)
VBAでのプログラムを教えて頂けないでしょうか。
初めての質問ですが、どうぞ宜しくお願い致します。

sheet1
   A    B      C     D    E
1 顧客コード 氏名   郵便番号   住所1  住所2
2 000123  〇〇  256-0...続きを読む

Aベストアンサー

失礼します。

うまくいかない原因は、Excel のバグのようなものなので、CSVをインポートする時点で、郵便番号の部分などを、書式-文字列にしていますね。それが原因で、その部分を数式で参照すると、その書式文字列が伝染してしまいます。そうすると、計算ができませんから、その部分を参照する数式は使えません。

数式で郵便番号を参照しようとするなら、参照元の書式は文字列にしてはいけないのです。

以下は、それとはまったく関係のない配列の中での計算です。
並べ替えがないなら、Dictionary オブジェクトを使います。いわゆる連想配列です。並べ替えが必要のようですから、.NetFrameWork のオブジェクトを使ってみました。なお、このマクロは、Excel2003以上です。


標準モジュール
'//
Sub CountDouble()
 Dim DataList As Object
 Dim x
 Dim i As Long, j As Long
 Dim sh1 As Worksheet, sh2 As Worksheet
 Set sh1 = Worksheets("Sheet1")
 Set sh2 = Worksheets("Sheet2")

 Set DataList = CreateObject("System.Collections.SortedList")
 With sh1
  x = .Range("C2", .Cells(Rows.Count, 3).End(xlUp))
 End With
 For i = LBound(x) To UBound(x)
  If DataList.Contains(Left(x(i, 1), 6)) = False Then
   DataList.Add Left(x(i, 1), 6), 1
  Else
   DataList.Item(Left(x(i, 1), 6)) = DataList.Item(Left(x(i, 1), 6)) + 1
  End If
 Next i
 With sh2
  j = 2 '書き出し行
  .UsedRange.Clear
  .Activate
  .Cells(1, 1).Value = "郵便番号"
  .Cells(1, 2).Value = "重複数"
  For i = 0 To DataList.Count - 1
   If DataList.GetByIndex(i) > 19 Then '20個以上
   .Cells(j, 1).Value = DataList.getKey(i)
   .Cells(j, 2).Value = DataList.GetByIndex(i)
   j = j + 1
   End If
  Next i
 End With
 Set DataList = Nothing
End Sub

失礼します。

うまくいかない原因は、Excel のバグのようなものなので、CSVをインポートする時点で、郵便番号の部分などを、書式-文字列にしていますね。それが原因で、その部分を数式で参照すると、その書式文字列が伝染してしまいます。そうすると、計算ができませんから、その部分を参照する数式は使えません。

数式で郵便番号を参照しようとするなら、参照元の書式は文字列にしてはいけないのです。

以下は、それとはまったく関係のない配列の中での計算です。
並べ替えがないなら、Dictionary オブジェク...続きを読む

QexcelのFalseとTrue

添付図は赤の間違い個所を発見しようとするものです。
K列はあらかじめソートされており、同じものが続いています。
L列はK列に対する属性です。
従って、L399とL403は間違いで、これを発見しようとしています。
M列はM398を下へコピーしたもので、M400とM404はなぜTRUEとならないのでしょうか。
正と正が合わさると、虚になっています。

しかし、これが仕様なら間違い個所を発見する方法を考えてもらえませんか。
なお、ソフトはExcel2013、Win10です。

Aベストアンサー

>実際のデータは夫々E列、G列、K列となっています。
>マクロのKLMを単純にEGKに置き換えてよいでしょうか。

それでOKです。
"K"->"E"
"L"->"G"
"M"->"K"
に置き換えてください。
それで実行してみてください。

Qexcel vba if文入れ子のスマートな記入方法は?

excel vba if文入れ子のスマートな記入方法を教えてください。

下記のような場合、処理Aを2回記入せずにすむ論理式があったら教えていただけないでしょうか?
処理Aが多い場合は、「call 処理A」として別に記入しています。
それでもどうしても2回記入しなくてはならないでしょうか?

【セルE1の値を判定して 数値「100」を入力する式】
Sub test()
Dim mymsg As Integer

If Range("E1") = 0 Or Range("E1") = "" Then
  Range("E1").Value = 100 '処理A
Else
 mymsg = MsgBox("値を消去して新しいデータを挿入します。", vbOKCancel)

 If mymsg = 1 Then
  Range("E1").Value = 100 '処理A
 Else
 ' 何もしない
  End If

End If
End Sub

Aベストアンサー

Exit Subを使って良いのであれば、test1。使えないなら、test2でどうでしょう?

Sub test1()
If Range("E1").Value <> "" And _
Range("E1").Value <> 0 Then
If MsgBox("値を消去して新しいデータを挿入します。", vbOKCancel) = vbCancel Then
Exit Sub
End If
End If
Range("E1").Value = 100 '処理A
End Sub

Sub test2()
Dim mymsg As Integer
mymsg = vbOK
If Range("E1").Value <> "" And _
Range("E1").Value <> 0 Then
mymsg = MsgBox("値を消去して新しいデータを挿入します。", vbOKCancel)
End If
If mymsg = vbOK Then
Range("E1").Value = 100 '処理A
End If
End Sub

Exit Subを使って良いのであれば、test1。使えないなら、test2でどうでしょう?

Sub test1()
If Range("E1").Value <> "" And _
Range("E1").Value <> 0 Then
If MsgBox("値を消去して新しいデータを挿入します。", vbOKCancel) = vbCancel Then
Exit Sub
End If
End If
Range("E1").Value = 100 '処理A
End Sub

Sub test2()
Dim mymsg As Integer
mymsg = vbOK
If Range("E1").Value <> "" And _
Range("E1").Value <> 0 Then
my...続きを読む

QExcel VBAや関数で数字を自動で整理したい

添付の画像のように1行10分として10分間の内訳がC~G列まであり、H列に行の合計があります。
本来なら手を加えなくても合計は600秒になるはずですが、
元データが「開始時間から何秒間」というデータの取り方をしている為
600秒以上が内訳に出てきてしまいます。(8:40のD列など)

これまでは、600以上の場合は600で区切りはみ出た分を1つ下の行に移すという作業を手作業でやっていましたが、数が増えてきたので自動化したいです。
VBA、関数何でも構いませんが自動で計算してくれる方法はないでしょうか?

VBAの場合は簡単に解説を付けていただけると大変助かります。
よろしくお願いします。

Aベストアンサー

それは、解決していた問題だと思ったのですが。
こちらでやってみますと、No.6 の修正版で以下のようになっています。
赤の部分は、今は、考えていません。

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

例えば以下のようなデータがあります
◆test
aaaaaaaaaaaa
iiiiiiiiiiiiiiiiiiiiiiiiiii
uuuuuuuuuuu
eeeeeeeeeeee
oooooooooooo
◆test2
kaaaaaaaaaaa
kiiiiiiiiiiiiiiiiiiiiiiiii
kuuuuuuuuuu
keeeeeeeeeee
kooooooooooo


これを、
◆test aaaaaaaaaaaa
    iiiiiiiiiiiiiiiiiiiiiiiiiii 
    uuuuuuuuuuu
    eeeeeeeeeeee
    oooooooooooo
◆test2 kaaaaaaaaaaa
     kiiiiiiiiiiiiiiiiiiiiiiiiii 
    kuuuuuuuuuuu
    keeeeeeeeeeee
    koooooooooooo

こんな感じに並べかえたいのですが、どなたかよい方法をご存じないでしょうか。
当方Excelはおろか、マクロVBAなどの知識が皆無です。。。

例えば以下のようなデータがあります
◆test
aaaaaaaaaaaa
iiiiiiiiiiiiiiiiiiiiiiiiiii
uuuuuuuuuuu
eeeeeeeeeeee
oooooooooooo
◆test2
kaaaaaaaaaaa
kiiiiiiiiiiiiiiiiiiiiiiiii
kuuuuuuuuuu
keeeeeeeeeee
kooooooooooo


これを、
◆test aaaaaaaaaaaa
    iiiiiiiiiiiiiiiiiiiiiiiiiii 
    uuuuuuuuuuu
    eeeeeeeeeeee
    oooooooooooo
◆test2 kaaaaaaaaaaa
     kiiiiiiiiiiiiiiiiiiiiiiiiii 
    kuuuuuuuuuuu
    keeeeeeeeeeee
    kooo...続きを読む

Aベストアンサー

標準モジュールに以下のマクロを登録し、実行してください。
尚、実行時、Sheet1,Sheet2がないとエラーになります。
---------------------------------------------
Option Explicit
Public Sub 並べ替え()
Dim sh1, sh2 As Worksheet
Dim maxrow1, row1, row2 As Long
Dim str As String
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
sh2.Cells.Clear
maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1 A列最大行
row2 = 1
For row1 = 1 To maxrow1
str = sh1.Cells(row1, "A").Value
If Left(str, 1) = "◆" Then
If sh2.Cells(row2, "A").Value <> "" Then
row2 = row2 + 1
End If
sh2.Cells(row2, "A").Value = str
Else
sh2.Cells(row2, "B").Value = str
row2 = row2 + 1
End If
Next
MsgBox ("完了")
End Sub

標準モジュールに以下のマクロを登録し、実行してください。
尚、実行時、Sheet1,Sheet2がないとエラーになります。
---------------------------------------------
Option Explicit
Public Sub 並べ替え()
Dim sh1, sh2 As Worksheet
Dim maxrow1, row1, row2 As Long
Dim str As String
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
sh2.Cells.Clear
maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1 A列最大行
row2 = 1
For row1 = 1 To...続きを読む

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マクロを使って指定箇所の文字の消去はできますか?

A6:A15のチェックボックスにチェックを入れボタンをクリックすると指定位置の文字を消去することは可能でしょうか?
A13のチェックだったらC13:E13,P13:Q13 A15のチェックだったらC15:E15,P15:Q15
両方チェックだったらC13:E13,P13:Q13、C15:E15,P15:Q15を消去という具合に行いたいのですが
どのようにすればよいでしょうか?

ご指導のほどよろしくお願いします。

Aベストアンサー

こんにちは

チェックボックスは、セルと独立した関係にあるので、どのチェックボックスがどの行にあるのか決められてはいません。
通常は、チェックボックスのチェック状態をセルと連動させておいて、それを参照して利用すると思います。
この方法であれば、ご質問の内容は関数でも実現できそうに思われます。

また、チェックボックスと一口に言っても、フォームコントロールのチェックボックスとActiveXのものと2種類あって、VBAでの扱いが微妙に変わります。
そのあたりの情報が何もないので、見た目の位置関係から調べるという少々回りくどい方法で処理してみました。
(普通は、上述のようにセルとの連動を利用すると思います)

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

こんにちは

チェックボックスは、セルと独立した関係にあるので、どのチェックボックスがどの行にあるのか決められてはいません。
通常は、チェックボックスのチェック状態をセルと連動させておいて、それを参照して利用すると思います。
この方法であれば、ご質問の内容は関数でも実現できそうに思われます。

また、チェックボックスと一口に言っても、フォームコントロールのチェックボックスとActiveXのものと2種類あって、VBAでの扱いが微妙に変わります。
そのあたりの情報が何もないので、見た目の位置関...続きを読む

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関数を使って表すと以下のようになります...続きを読む

QExcel2010 複数条件のIf関数の組み方について

タイトルの内容を実施したいです。

言葉で伝えるのが難しい為、図を添付致しますのでご参照ください。
パラメータの空欄・値有により、パターンを自動付加する事をやりたいです。

E15-19セルで、B15-19、C15-19、D15-19に値を手入力し、その結果により、
パターンを自動付加させる関数をE15-19に埋め込みたいと考えています。
(どのようなパターンを自動付加させるかについては、パターン表(B4-E10)を参照する)

上記を実施したい場合、どのような関数を埋め込めば良いか、アドバイスを頂けませんでしょうか。
宜しくお願いいたします。

Aベストアンサー

こんにちは

お求めの関数式とは違うかも知れませんが・・・

E15に
 =INDEX({1,4,2,5,3,"",6,""},SUMPRODUCT((B15:D15<>"")*{4,2,1})+1)
としてフィルコピー。

ご提示のパターン表は参照していません。
式の最初のほうの『{1,4,2,5,3,"",6,""}』がパターン表に該当しています。

Qエクセルで複数セルの文字をまとめ、かつ文字列を追加するには?

どのような数式を使えば良いか、やり方を教えてください。
以下のような複数セルに入っているデータを一つにまとめたいのですが、その際に決まった文字列を追加し、スラッシュで区切られた文字列はそれぞれバラバラにして文字列に組み込みたいのです。

A列 = 商品番号(ABC0001、ABC0002、など)
B列 = 色   (ホワイト/ブラック/イエロー、など複数カラー展開がある場合はスラッシュで区切ってあります。
C列 = サイズ (大、中、小、など)

例えば下記のようにデータが入っている場合で、
A列 | ABC0001
B列 | ホワイト/ブラック
C列 | S/M/L

D列に以下のようになるように設定したいです。

カラー:ホワイト#サイズ:S=ABC0001WHS&カラー:ホワイト#サイズ:M=ABC0001WHM&カラー:ホワイト#サイズ:L=ABC0001WHL&カラー:ブラック#サイズ:S=ABC0001BKS&カラー:ブラック#サイズ:M=ABC0001BKM&カラー:ブラック#サイズ:L=ABC0001BKL

カラーのホワイトやブラックに対応するカラーコードは別シートに設定しておき、A列の商品番号の後ろに、カラーコード+サイズ(S、M、Lなど)を追加されるようにしたいです。

どのように設定したらよいでしょうか?

どのような数式を使えば良いか、やり方を教えてください。
以下のような複数セルに入っているデータを一つにまとめたいのですが、その際に決まった文字列を追加し、スラッシュで区切られた文字列はそれぞれバラバラにして文字列に組み込みたいのです。

A列 = 商品番号(ABC0001、ABC0002、など)
B列 = 色   (ホワイト/ブラック/イエロー、など複数カラー展開がある場合はスラッシュで区切ってあります。
C列 = サイズ (大、中、小、など)

例えば下記のようにデータが入っている場合で、...続きを読む

Aベストアンサー

こんにちは。回答が無いようですので・・・

個人的には視認性が悪くなるばかりの変換のように思えますが、それはおいておくとして。

関数式で行うなら、作業列を用意して各項目を"/"で分解してから、それぞれの組み合わせを作成し、最後に全部を連結するといった方法で展開が可能だと思います。
ただし、個数が決まっていないようなので、全体の構成を考える上で若干の工夫が必要になりそうに想像します。

・・とはいうものの、関数式で完結するのも結構面倒そうなので、ユーザー定義関数で行ってしまう例をご参考までに以下に。
下記のコードを標準モジュールに転記の後、セル(D列?)に
 =ProductCode(A4:C4)
のような式を設定することで、文字列に展開されるようになります。
(A4:C4は品番、色、サイズを示すセル範囲です)

>対応するカラーコードは別シートに設定しておき~~
どのような形式なのか不明なので、とりあえず変換部分は別関数にして取り出し、仮の設定として、別シートは参照せずに「ホワイト→WH」、「ブラック→BK」とだけ返すものにしてあります。
この部分を、別シートを参照するように変更すれば、差し替えが可能と思います。


※ 方法のサンプルなのと、実際の可能性がわからないので、値のチェック等はかなりゆるく作成してあります。

Function ProductCode(ByRef r As Range) As String
Dim result As String, res As String
Dim code As String, col, size
Dim i As Integer, j As Integer

If r.Count = 3 Then
 If r(1) <> "" And r(2) <> "" And r(3) <> "" Then
  code = r(1)
  col = Split(r(2).Value, "/")
  size = Split(r(3).Value, "/")

  For i = LBound(col) To UBound(col)
   For j = LBound(size) To UBound(size)
    If Trim(col(i)) = "" Or Trim(size(j)) = "" Then
     res = "#Value!"
    Else
     res = "&カラー:" & col(i) & "#サイズ:" & size(j) & "=" & code & color2code(col(i)) & size(j)
    End If
    result = result & res
   Next j
  Next i
  result = Mid(result, 2)
 Else
  result = "#Value!"
 End If
Else
 result = "#Ref!"
End If

ProductCode = result
End Function


Function color2code(ByVal c As String) As String
 color2code = "#Value!"
 If c = "ホワイト" Then color2code = "WH"
 If c = "ブラック" Then color2code = "BK"
End Function

こんにちは。回答が無いようですので・・・

個人的には視認性が悪くなるばかりの変換のように思えますが、それはおいておくとして。

関数式で行うなら、作業列を用意して各項目を"/"で分解してから、それぞれの組み合わせを作成し、最後に全部を連結するといった方法で展開が可能だと思います。
ただし、個数が決まっていないようなので、全体の構成を考える上で若干の工夫が必要になりそうに想像します。

・・とはいうものの、関数式で完結するのも結構面倒そうなので、ユーザー定義関数で行ってしまう例をご...続きを読む


人気Q&Aランキング