iSAMrx72's思いつきBlog

twitterが使いこなせない管理人のメモです。思いついたとき書きます。
トップスポンサー広告スポンサーサイト

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/ (--) --:--| スポンサー広告 | コメント(-) | トラックバック(-) | 編集
トップExcelのlookup()についての悩みと解決法

Excelのlookup()についての悩みと解決法

ワークシートが2個有って、仮に片方をトランザクションと言います。もう一方を

マスターと言うことにします。マスターは考えられる全てのコードだけのレコード

だとします。レコードとは1行分の記録と言うことで良いです。

トランザクションは全てのマスターのレコードを持っていると限りません。その逆に

マスターはトランザクションのコードの全てを持っている、と言うことになります。

更に仮定として、マスターとトランザクションともコード順に並んでるとします。

又お互いのレコードがある場合でも、1対1で対応するものとします。

マスターにlookup()でトランザクションの内容で更新しようとすると、エラー

になる場合と、前の値で更新になる場合があります。これは関数の仕様です。



 

単純に考えると、トランザクションのコードを順番に見るのですが、対応する

マスターを探します。コードが一致すれば、マスターのレコードを更新します。

トランザクションのコードが0になれば終了です。マスターは必ずあるので

そんな感じで、VBAで書いてみましたが、これを関数でやることも出来るんだそうです。

調べればあるもんです。

関数でやった方が、忘れることも無いでしょうし、絶対良いように思います。

自分の場合は、頻繁にやる必要も無いのでVBAでも良いように思うんですが

一番の問題は他の人にやって貰う場合は、関数が絶対良いように思います。

 

せっかく作った VBAですが、関数で書き直しになりそうです。

http://support.microsoft.com/kb/816370/ja

上は参考にしたサイトです。

=IF(ISERROR(MATCH(D2,A2:A6,0))=TRUE,"",INDEX(B2:B6,MATCH(D2,A2:A6,0)))

上のような長い式を入力するのですが、出来ました。自分の場合は""は0です。

あとこんな長い式を入力する場合のShrap LC-32H7モニタ代わりのテレビ使いました。

(~o~)

以下は今回作成したコードですが、上の関数で置き換えました。要らない変数もあります。

多分作業日、作業時間。

Option Explicit
Dim T農業者 As Integer
Dim M農業者 As Integer
Dim 作業日 As Date
Dim スタート行 As Integer
Dim 作業時間 As Double

Sub 個人協定面積クリア()

スタート行 = 4

Do While (1)
    Worksheets("支払明細書").Select
    If Cells(スタート行, 1) = 0 Then
        MsgBox ("個人の協定面積をクリアしました。")
        Exit Sub
    End If
   
    Cells(スタート行, 3) = 0 '緩傾斜クリア
    Cells(スタート行, 5) = 0  '急傾斜クリア
 
    スタート行 = スタート行 + 1
Loop

End Sub

Sub 個人毎面積更新()

スタート行 = 2

Dim 緩傾斜 As Double
Dim 急傾斜 As Double
Dim sl As Integer

sl = 4

Do While (1)
  
    Worksheets("個人毎面積").Select
    If Cells(スタート行, 1) = 0 Then
        MsgBox ("個人毎の協定面積を更新しました。")
        Exit Sub
    End If
   
    T農業者 = Cells(スタート行, 1)
    緩傾斜 = Cells(スタート行, 2)
    急傾斜 = Cells(スタート行, 3)
   
   
    Worksheets("支払明細書").Select
   
    Do While (1)
        If Cells(sl, 1) = T農業者 Then
            Cells(sl, 3) = 緩傾斜
            Cells(sl, 5) = 急傾斜
            GoTo nexttrans
        Else
            sl = sl + 1
        End If
    Loop
   
nexttrans:
    スタート行 = スタート行 + 1
Loop

End Sub
Sub 各個人協定面積更新()

    Call 個人協定面積クリア
    Call 個人毎面積更新

End Sub

スポンサーサイト
01/26/ (土) 12:15| コメント(0) | トラックバック(-) | 編集
URL
コメント
パスワード
秘密
管理者にだけ表示を許可する
 
プロフィール

isamrx73

Author:isamrx73
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック

月別アーカイブ
カテゴリ
検索フォーム

RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。