[[20150321104755]] 『別シートの表を参照するマクロについて教えて下さ』(takuya) ページの最後に飛ぶ

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

 

『別シートの表を参照するマクロについて教えて下さい。』(takuya)

マクロ初心者です。
過去の質問履歴を調べましたが、見つける事が出来ない為、宜しくお願い致します。

       A     B      C                  種  類

 1   サイズ  種類  コード        サイズ   A   B    C    D

  2   M   A   0.6        S   0.5   0.7   0.8   0.9

  3                                       M      0.6   0.8   0.9   1.0

  4   L   B   0.9        L     0.7   0.9   1.0   1.1

  5                   LL    1.2   1.3   1.5   1.8

         Sheet1 "一覧表"                              Sheet2 "コード表"

  上記の2つの表に於いて、『一覧表』でその行のサイズと種類に入力すると
 『コード表』からサイズと種類が合致するコードを読み取り、『一覧表』の
 コードに自動入力したいと思います。
 

 

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 値を入力したときに、参照するだけだったら
 今回は数式の方が適したケースではないでしょうか?

 VLOOKUP、MATCH、INDEX あたりの組合せでできるかと思います。
 マクロでやるにしても、「列、行、を検索して表から引くという」ロジックは一緒では
 ないでしょうか。

(Mook) 2015/03/21(土) 11:53


 Mookさんもおっしゃっていますが、関数でもよさそうな気がします。
 =IF(OR(A2="",B2=""),"",IFERROR(INDEX(コード表!$B$2:$E$5,MATCH(A2,コード表!$A$2:$A$5,0),MATCH(B2,コード表!$B$1:$E$1,0)),"該当なし"))
(se_9) 2015/03/21(土) 12:12

 Mookさん、se_9さん、ご回答有難うございました。

 関数で出来ました。 

 出来れば、勉強したいので、マクロで行った場合のコードを教えて頂けないで     
  しょうか。

 宜しくお願い致します。  
(takuya) 2015/03/23(月) 08:21

 あまり参考にならないと思いますけれど、一例ということで。
 コードの書き方は人によってまちまちなので、他のやり方も試してみてはと思います。

 値の検索は Find を使ったり、WorksheetFunction.Match のように EXCEL 関数を使う
 ことも出来ます。

 Sub Sample()
    With Worksheets("一覧表")
        Dim r As Long
        For r = 2 To 4 Step 2
            .Cells(r, "C").Value = getCode(.Cells(r, "A").Value, .Cells(r, "B").Value)
        Next
    End With
 End Sub

 Function getCode(pSize, pType)
    getCode = ""
    If pSize = "" Or pType = "" Then Exit Function

    With Worksheets("コード表")
        Dim c As Long
        For c = 2 To 5
            If .Cells(1, c).Value = pType Then Exit For
        Next

        Dim r As Long
        For r = 2 To 5
            If .Cells(r, 1).Value = pSize Then Exit For
        Next

        If c <= 5 And r <= 5 Then getCode = .Cells(r, c).Value
    End With
 End Function

(Mook) 2015/03/23(月) 11:51


 10:35 コードの構成を一部訂正。

 関数のほうがいいような気もしますが勉強ということで。

 >サイズと種類に入力すると・・・・・『一覧表』のコードに自動入力したいと思います。

 ということなので、ThisWorkbookモジュールに。

 Option Explicit

 Dim dic As Object

 Private Sub Workbook_Open()
    MakeTable
 End Sub

 Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "一覧表" Then MakeTable
 End Sub

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim c As Range
    Dim r As Range
    Dim k As String

    Select Case Sh.Name

        Case "一覧表"
            Set r = Intersect(Target, Sh.Range("A1").CurrentRegion.Columns("A:B"))
            If r Is Nothing Then Exit Sub
            Application.EnableEvents = False
            For Each c In r
                k = c.EntireRow.Range("A1") & vbTab & c.EntireRow.Range("B1")
                c.EntireRow.Range("C1").Value = dic(k)
            Next
            Application.EnableEvents = True

    End Select

 End Sub

 Private Sub MakeTable()
    Dim c As Range
    Dim k As String

    If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary")
    dic.RemoveAll

    With Sheets("コード表").Range("A1").CurrentRegion
        For Each c In .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
            k = c.EntireRow.Range("A1").Value & vbTab & c.EntireColumn.Cells(1).Value
            dic(k) = c.Value
        Next
    End With

 End Sub

(β) 2015/03/26(木) 10:25


 いろんな書き方あるねぇ。
 βさんと似てるけど、二段階Dictionaryで!!
 参考出品

    Option Explicit
    '==================================================
    'ThisWorkBookモジュールに記載
    Dim dic    As Object    'コード表を入れる入れ物 C列 = dic(サイズ)(種類) のように使う
    Dim CngFlg As Boolean   'コード表が変更されたことを示すフラグ

    '==================================================
    'メインのチェンジイベント
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Select Case Sh.Name
            Case "一覧表"
                If Target.Address Like "$[A,B]$*" Then ListSheet Sh, Target
            Case "コード表"
                CngFlg = True
        End Select
    End Sub

    '==================================================
    '一覧表にコード表からデータを取り出して代入する処理
    Private Sub ListSheet(Sh As Worksheet, Target As Range)
        Dim i As Long
        If CngFlg Or dic Is Nothing Then SetDic
        Application.EnableEvents = False
        On Error Resume Next
            For i = Application.Min(Sh.Cells(Rows.Count, "A").End(xlUp).Row, Sh.Cells(Rows.Count, "B").End(xlUp).Row) To 2 Step -1
                Sh.Cells(i, "C").Value = dic(Sh.Cells(i, "A").Value)(Sh.Cells(i, "B").Value)
            Next i
        On Error GoTo 0
        Application.EnableEvents = True
    End Sub

    '==================================================
    'コード表をDictionaryに取り込む
    Private Sub SetDic()
        Dim a
        Dim r As Long
        Dim c As Long
        Set dic = CreateObject("Scripting.Dictionary")
        a = Sheets("コード表").Range("A1").CurrentRegion.Value
        With dic
            For r = 2 To UBound(a, 1)
                .Add a(r, 1), CreateObject("Scripting.Dictionary")
                For c = 2 To UBound(a, 2)
                    .Item(a(r, 1)).Add a(1, c), CreateObject("Scripting.Dictionary")
                    .Item(a(r, 1)).Item(a(1, c)) = a(r, c)
                Next c
            Next r
        End With
        CngFlg = False
    End Sub
 Like演算子のところ、書き換え 12:27
(稲葉) 2015/03/26(木) 11:59

 すみません、ちょっとスレ貸してください。
 先ほどLike演算子で書き換えたときに、あれっと思ったのですが
http://officetanaka.net/excel/vba/tips/tips35.htm

 田中さんのSample1 で
 >「東京、横浜、千葉ではない住所を赤字」 →Like "[!東京,横浜,千葉]*"
 ってあるんですが
 Andに置きかえると
 Like "東*" And _
 Like "京*" And _
 Like "横*" And _
 Like "浜*" And _
 Like "千*" And _
 Like "葉*" And _
 Like ",* "
 こうなるんじゃないですかね?
(稲葉) 2015/03/26(木) 13:16

みなさん、お忙しいところ有難うございます。

 大変勉強になりました。

 また、ご教示をお願い致します。 

(takuya) 2015/03/30(月) 14:30


  >    If Cells(i, 1).Value Like "[!東京,横浜,千葉]*" Then _

 これは、先頭1文字が
         ^^^^^^^^^
        「東」
        または「京」
        または「,」
        または「横」
        または「浜」
        または「,」
        または「千」
        または「葉」
     のいずれかでなかったら、

 という構文になっていると思います。

 したがって、セルの値が

   「京都府西上条」
   「葉山市...」
   「東海道」
    「,,,,,」

 などでも、色塗りされない結果になると思います。

 [ ] の中は 1文字なので 、サンプルで2文字づつグループ化するために
 使用されてるカンマ(,) はここでは不要でしょう。

 > 住所録で「東京、横浜、千葉ではない住所を赤字」にするには

 これを Like演算子で表現するのは不可能かと思います。
 あえてLike演算子を使って書くなら

   Not 文字列 Like "東京*" _
   And Not 文字列 Like "横浜*" _
   And Not 文字列 Like "千葉*" 

 くらいでしょうか?
 .
(kanabun) 2015/03/30(月) 16:56

コメント返信:

[ 一覧(最新更新順) ]


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