[[20151013133830]] 『表数値を用いて計算2』(つぶ) ページの最後に飛ぶ

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

 

『表数値を用いて計算2』(つぶ)

下記の様な表があります。

     A        B        C        D        E        F        G    ・・・
1                 100      180      230      260      360   ・・・ 
2                     010      015      020      024      031 
3   200      013  
4   252      018 
5   303       03  
6   348      032  
7   405      04   
8   455      043  
9   510      05   
・ ・
・ ・
・ ・

リストボックス1に、
「○○ 010013」
とあり、
リストボックス2に、
「△△ 02003」
とあったとします。

リストボックス1・2を選択した時に、
仮にA1に、
「○○+△△ 03105」
と表示させたいです。

数値については、
リストボックス1の値で説明すると、
010が横方向の値で、013が縦方向の値です。
この時、010は100であり、013は360です。
これをリストボックス1と2で合せて、
  100(010)+230(020)=330≒360(031)

    200(013)+303(03)=503≒510(05)
で、「03105」となります。

リストボックスの値をばらして、表からそれに連動する数値を読み取り、
連動する数値を足して、その合計と近似する値を表から読み出して合体させる?
なんてことは出来ますでしょうか?
宜しくお願いします。

< 使用 アプリ:Excel2000、使用 OS:WindowsXP >


 >リストボックス1に、 
 > 「○○ 010013」 
 >とあり、 
 >リストボックス2に、 
 > 「△△ 02003」 
 >とあったとします。 

 1.その○○ とか △△とは現実には何ですか?

 2.「○○+△△」とは具体的にどんなことになるんですか?
    常識的には、○○と△△は加算できないです。

 3.02003が、020と03に分かれるようですけど、
   なぜ、02と003には分割されないと云えるのですか?
   (左から必ず3桁取ると云うことなんですか?)

 4.B列のデータの頭に「0」がついているので、そのデータは文字列なんですね?

(半平太) 2015/10/13(火) 19:14


>1.その○○ とか △△とは現実には何ですか?
→○と△は文字です。例えば「上 013013」と「下 02003」
 を合体?させた時に、合体させたということを判別する為に、
 見かけ上、「上+下」という様に表現したいです。

>2.「○○+△△」とは具体的にどんなことになるんですか?
   常識的には、○○と△△は加算できないです。
→1.の通りです。

>3.02003が、020と03に分かれるようですけど、
   なぜ、02と003には分割されないと云えるのですか?
   (左から必ず3桁取ると云うことなんですか?)
→左から必ず3桁とることで大丈夫です。
 桁数的には5桁〜6桁ですが、必ず3桁目で分かれます。

>4.B列のデータの頭に「0」がついているので、そのデータは文字列なんですね?
→文字列です。

(つぶ) 2015/10/14(水) 08:50


 当該シートのシートモジュールに(↓)

Sub crossRef()

     Dim App As Application
     Dim L1上下, L2上下
     Dim L1横Val, L2横Val
     Dim L1縦Val, L2縦Val
     Dim L1num, L2num
     Dim L1横Pos, L2横Pos
     Dim L1縦Pos, L2縦Pos

     Dim Hrange As Range
     Dim Vrange As Range

     Dim 横計, 横解
     Dim 縦計, 縦解

     Set App = Application
     Set Hrange = Range("C2", Range("C2").End(xlToRight))
     Set Vrange = Range("B3", Range("B3").End(xlDown))

     L1上下 = Split(Replace(Me.ListBox1.Value, " ", " "), " ")(0)
     L2上下 = Split(Replace(Me.ListBox2.Value, " ", " "), " ")(0)

     L1横Val = Left(Split(Replace(Me.ListBox1.Value, " ", " "), " ")(1), 3)
     L2横Val = Left(Split(Replace(Me.ListBox2.Value, " ", " "), " ")(1), 3)
     L1縦Val = Mid(Split(Replace(Me.ListBox1.Value, " ", " "), " ")(1), 4, 3)
     L2縦Val = Mid(Split(Replace(Me.ListBox2.Value, " ", " "), " ")(1), 4, 3)

     L1num = App.CountIf(Hrange, Left(L1横Val, 3))
     L2num = App.CountIf(Hrange, Left(L2横Val, 3))

     If L1num = 0 Or L2num <> 1 Then
         Range("A1").Value = "コードが不正です"
         Set App = Nothing
         Exit Sub
     Else
         L1横Pos = App.Match(Left(L1横Val, 3), Hrange, 0)
         L2横Pos = App.Match(Left(L2横Val, 3), Hrange, 0)
         L1縦Pos = App.Match(Left(L1縦Val, 3), Vrange, 0)
         L2縦Pos = App.Match(Left(L2縦Val, 3), Vrange, 0)

         横計 = Hrange.Offset(-1).Cells(L1横Pos) + Hrange.Offset(-1).Cells(L2横Pos)
         縦計 = Vrange.Offset(, -1).Cells(L1縦Pos) + Vrange.Offset(, -1).Cells(L2縦Pos)
         横解 = Hrange.Cells(1, App.CountIf(Hrange.Offset(-1), "<" & 横計) + 1)
         縦解 = Vrange.Cells(App.CountIf(Vrange.Offset(, -1), "<" & 縦計) + 1, 1)

     End If

     Range("A1").Value = L1上下 & "+" & L2上下 & " " & 横解 & 縦解
     Set App = Nothing
End Sub

(半平太) 2015/10/14(水) 18:22


半平太さんありがとうございます。

こちらのご説明不足で本当に申し訳ないのですが、
入力規則のリストボックスでして、上手く動作しないです。

Me.ListBox1.Valueをセル位置にすればよいのでしょうか?
(つぶ) 2015/10/15(木) 09:13


 入力規則のリストボックスだとすると、二つも同時に存在できないですから
 こんな状態にはならないですよね?
   ↓
 >リストボックス1に、 
 > 「○○ 010013」 
 >とあり、 
 >リストボックス2に、 
 > 「△△ 02003」 
 >とあったとします。 

 質問の前提となる状況が理解できませーん。

(半平太) 2015/10/15(木) 09:32


 強引に関数で・・・。参照するセルは実際のものと変えてください。

 I1セルに ○○ 010013
 I2セルに △△ 02003
 があるとして

 I4セル =MID(I1,1,FIND(" ",I1)-1)
 J4セル =MID(I1,FIND(" ",I1)+1,3)
 K4セル =SUBSTITUTE(I1,I4&" "&J4,"")
 I4セルからK4セルを選択した状態で5行目にフィルコピー

 L4セル =INDEX($C$1:$G$1,MATCH(J4,$C$2:$G$2,0))
 M4セル =INDEX($A$3:$A$9,MATCH(K4,$B$3:$B$9,0))
 L4セルからM4セルを選択した状態で5行目にフィルコピー

 L6セル =IF(ISERROR(INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)+1)),INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)),INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)+1))
 M6セル =IF(ISERROR(INDEX(B3:B9,MATCH(M4+M5&"",A3:A9,1)+1)),INDEX(B3:B9,MATCH(M4+M5&"",A3:A9,1)),INDEX(B3:B9,MATCH(M4+M5&"",A3:A9,1)+1))
 A1セル =CONCATENATE(I4,"+",I5," ",L6,M6)
(se_9) 2015/10/15(木) 17:32

半平太さん、se_9さんコメありがとうございます。
また、返事遅くなり申し訳ございません。
ちょっとパタパタしておりました。

まず半平太さん
説明不足ですみません。別々のセルに入力規則のリストボックスを設定してますので、
1つのセルに二つも同時に存在しているわけでは無いです。
仮にI1セルをリストボックス1として、I2セルをリストボックス2としている感じです。

se_9さん
私の下手な説明の意図を理解して下さいありがとうございます。
ご提示頂いた関数が正に希望する動作です。ありがとうございます。
ただ1点だけですが(多分此方の不具合だと思いますが)、
L6セル =IF(ISERROR(INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)+1)),INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)),INDEX(C2:G2,MATCH(L4+L5&"",C1:G1,1)+1))
のみ、#N/Aとエラーになります。
参照するセルは、表共に式と同じに合せてみたのですが、同様にエラーとなってしまいます。
M6セル=の方は正常に動作する為、違いを確認しましたが、これといって見つけれませんでした。
お手数お掛け致しますが、ご意見頂ければ幸いです。
(つぶ) 2015/10/22(木) 09:32


 L4セル、L5セルの数値は右に寄っていますか?もしそうならL6セルの関数の&""を取ってみてください。
 A列、B列、1行目、2行目のセルが文字列になっていると思って&""をつけてみたのですが、多分1行目、2行目の
 セルが標準になっているのでエラー(#N/A)が表示されるのだと思います。
(se_9) 2015/10/23(金) 07:43

se_9さんありがとうございます。
また、お返事遅くなり申し訳ございません。
「&""」を取ってみたら希望通りの動作確認できました。
ありがとうございます。

申し訳御座いませんが1点お伺いしたいのですが、
リストボックス1&2の値を合計した数に一番近い値を
表から読み出してると思うのですが、どの様な仕組み?に
なっているのか、簡単でいいのでお教え頂ければ幸いです。
合計値に最も近い値では無く、合計値以上で最も近い値になるのでしょうか?
そこら辺の設定は自由に変えれるのでしょうか?

(つぶ) 2015/10/26(月) 18:02


 すみません、説明しようと思ってふと考えたのですが

 a 010013
 b 010018

 の場合、

 1.a+b 020043
 2.a+b 015043

 1と2どちらが正しい答えになりますか?それとも2つともまったく違う答えになってしまうのか・・・。
(se_9) 2015/10/27(火) 16:17

現状では、
1.a+b 020043
の方が正しい答えになってますが、
合計値以上で最も近い値だと、
あまりに合計と表示で差があり過ぎる場合が生じる可能性がありますので、
設定可能かどうかお伺いした次第です。宜しくお願い致します。
(つぶ) 2015/10/28(水) 10:44

 返事が遅くなってすみません。

 MATCH関数の使い方
http://excel.onushi.com/function/match.htm

 照合の型で1を指定しているので、検査値以下の最大の値を検索するわけですが(例えば179だと010になる)
 つぶさんの規則性だと179のパターンでは015になるのでMATCH関数で取得された値に+1しています。でも
 180だと015を取得しなければいけないかな?と色々考えていたら頭が痛くなってきた・・・。

 つぶさんが希望しているような設定もできるかとは思いますが、そのことで質問されても多分私の能力では
 解決できなさそうなので、他の回答者に助けを求める可能性大です(無責任ですみません)
(se_9) 2015/10/30(金) 12:05

いえいえ、お返事ありがとうございます。

また貴重なお時間頂き感謝致します。
現状、se_9さんがお教え頂いた内容で十分満足行く結果が得られておりますので、
感謝しか感じておりません。全く無責任では無いです。

長々とお付き合い頂きありがとうございました。
(つぶ) 2015/10/30(金) 16:29


コメント返信:

[ 一覧(最新更新順) ]


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