B07B.出願人別集計
動向分析では、企業がどのような技術に注力しているか分析することも重要である。
そこで、出願人別の集計表を作成するが、基本的には縦項目に出願人を設定するだけであり、コード別集計と大きな違いは無い。
ただし、出願人名称が変更されていたり、異なる表記が混在する場合には、そのまま集計すると発行件数の順位が異なってしまい、間違った分析を行なう恐れがある。
そこで、出願人別の集計では出願人名称を統一してから処理するようにしている。
また、出願人別の発明者人口や、新規参入企業も分析項目として重要である。
また、出願人別や発明者別の発行件数を集計する場合には持ち分で処理している。
例えば、4社で共同出願したものは持ち分を0.25とし、5名で発明した場合は持ち分を0.2とすることになる。
まず、出願人名称の修正では以下のような変換表を使用している。
元の出願人名称 変換後の出願人名称
アステックス、セラピューティックス、リミテッド アステックス・セラピューティクス・リミテッド
アストラゼネカアーベー アストラゼネカ・アクチエボラーグ
アストラゼネカアクチボラグ アストラゼネカ・アクチエボラーグ
アストラゼネカエービー アストラゼネカ・アクチエボラーグ
新規登録するかどうかはシート「出願人別集計」の集計データで件数が多い企業の名称を確認すればわかる。
多いのは、外国法人であり、カタカナの表記方法や略称などの違いで別の出願人となってしまうことがある。
この場合は、名称順にソートすれば簡単に確認できる。
出願人名称を変換するために以下のExcelマクロを作成した。
この名称変換ではReplaceコマンドで一括変換している。
Sub 出願人名称変換()
'
'同じ法人で呼称が異なる出願人名称を統一するために、公報コピーデータの出願人名称を
'出願人名称変換表に登録された出願人名称に置換する
'
'変数を宣言
Dim SHEETNAME01 As String, SHEETNAME02 As String
Dim NY1 As Long, NX1 As Integer, NY2 As Long, NX2 As Integer
Dim y As Long, k As Long, m As Long
'配列を宣言
Dim code1() As String
Dim code2() As String
'シート名称を設定する
SHEETNAME01 = "出願人名称変換表"
SHEETNAME02 = "重複なしデータ"
'
'======================
'新旧の出願人名称を配列に読み込む
'======================
'処理範囲の行列数を取得
Sheets(SHEETNAME01).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY1 = Selection.Rows.Count
NX1 = Selection.Columns.Count
'配列数を設定
ReDim code1(NY1), code2(NY1)
'新旧の出願人名称を配列に読み込む
Sheets(SHEETNAME01).Select
For y = 2 To NY1
code1(y) = Cells(y, 1)
code2(y) = Cells(y, 2)
Next y
m = NY1
'
'==========================================
'読込んだ元の出願人名称にしたがって登録された出願人名称に置換する
'==========================================
'処理範囲の行列数を取得
Sheets(SHEETNAME02).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY2 = Selection.Rows.Count
NX2 = Selection.Columns.Count
'出願人名称を置換
Range("E:E").Select
For k = 2 To m
Selection.Replace what:=code1(k), Replacement:=code2(k)
Next k
'
'==============
Cells(1, 1).Select
'MsgBox "終了しました"
'
End Sub
・出願人別の発明者人口では以下のマクロを使用している。
'====================================
'発行年毎に出願人と発明者とをシート「作業用」にコピーし、
'発明者を展開し、出願人毎の発明者数を集計し、書込む
'====================================
'ヘッダ設定
Sheets(SHEETNAME05).Select
Cells(1, 1) = "出願人"
Cells(1, 2) = "発明者"
Cells(1, 3) = "ソートキー"
'処理範囲の行列数を取得
Sheets(SHEETNAME02).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY2 = Selection.Rows.Count
NX2 = Selection.Columns.Count
'配列数を設定
ReDim dAP(NY2), dname(NY2), dnn(NY2)
'初期化
For x = 2 To NX2
For y = 2 To NY2
Cells(y, x) = 0
Next y
Next x
'発行年毎に発明者を展開
For x2 = 2 To NX2
k = 1
Sheets(SHEETNAME02).Select
byear = Cells(1, x2)
'公報データからbAPに一致する公報の発明者と発行年をコピー
Sheets(SHEETNAME01).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY1 = Selection.Rows.Count
NX1 = Selection.Columns.Count
'配列数を設定
ReDim dAP(NY1), dname(NY1), dnn(NY1)
For y1 = 2 To NY1
If Cells(y1, nclm3) = byear Then
For y2 = 2 To NY2
If InStr(Cells(y1, nclm1), ctate(y2)) > 0 Then
k = k + 1
dAP(k) = Cells(y1, nclm1)
dname(k) = Cells(y1, nclm2)
Exit For
End If
Next y2
End If
Next y1
'シート「作業用」に書込み
Sheets(SHEETNAME05).Select
For y5 = 2 To k
Cells(y5, 1) = dAP(y5)
Cells(y5, 2) = dname(y5)
Next y5
'処理範囲の行列数を取得
Sheets(SHEETNAME05).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY5 = Selection.Rows.Count
NX5 = Selection.Columns.Count
'発明者を展開
m = 1 '追加した行数+1
For y5 = 2 To NY5
cellword = Cells(y5, 2)
nwd = Len(cellword)
pos = InStr(cellword, ";")
n = 1
'発明者の数を調べる
If pos > 0 Then
Do While pos > 0
If pos > 0 Then
If nwd - pos > 0 Then
cellword = Right(cellword, nwd - pos)
pos = InStr(cellword, ";")
nwd = Len(cellword)
n = n + 1
Else
n = n + 1
pos = 0
End If
End If
Loop
End If
'共同発明者を区切り記号";"に基づき分割し、最下行に追加する
'元のデータを筆頭発明者のみに修正する
cellword = Cells(y5, 2)
For k = 1 To n - 1
bcode = Split(cellword, ";")(k)
Range(Cells(y5, 1), Cells(y5, 2)).Copy
ActiveSheet.Paste Destination:=Cells(NY5 + m, 1)
Cells(NY5 + m, 2) = bcode
m = m + 1
Next k
'筆頭のみに書き換え
If n > 1 Then
bcode = Split(cellword, ";")(0)
Cells(y5, 2) = bcode
End If
Next y5
'処理範囲の行列数を取得
Sheets(SHEETNAME05).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY5 = Selection.Rows.Count
NX5 = Selection.Columns.Count
If NY5 > 1 Then
'ソートキーを作成
For y5 = 2 To NY5
Cells(y5, 3) = Cells(y5, 1) & ";" & Cells(y5, 2)
Next y5
'ソート
Range(Cells(1, 1), Cells(NY5, NX5)).Sort Key1:=Cells(1, 3), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'次行のソートキー(=3)が同じならば当該行をクリア/重複した発明者を削除
For y5 = 2 To NY5
If Cells(y5, 3) = Cells(y5 + 1, 3) Then
Rows(y5).Clear
End If
Next y5
'出願人でソートし、空白行を削除
Range(Cells(1, 1), Cells(NY5, NX5)).Sort Key1:=Cells(1, 1), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'処理範囲の行列数を取得
Sheets(SHEETNAME05).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY5 = Selection.Rows.Count
NX5 = Selection.Columns.Count
'出願人毎の発明者数を集計し配列に読込み
bn = 0
nAP = 1
For y5 = 2 To NY5
If Cells(y5, 1) = Cells(y5 + 1, 1) Then
bn = bn + 1
Else
bn = bn + 1
nAP = nAP + 1
dAP(nAP) = Cells(y5, 1)
dnn(nAP) = bn
bn = 0
End If
Next y5
'出願人別発明者リストに書込み
Sheets(SHEETNAME02).Select
For y2 = 2 To NY2
For y5 = 2 To nAP
If InStr(dAP(y5), Cells(y2, 1)) > 0 Then
Cells(y2, x2) = Cells(y2, x2) + dnn(y5)
End If
Next y5
Next y2
'クリア
Worksheets(SHEETNAME05).Activate
Cells.Select
Selection.Delete Shift:=xlUp
'ヘッダ設定
Cells(1, 1) = "出願人"
Cells(1, 2) = "発明者"
Cells(1, 3) = "ソートキー"
End If
Next x2
'
・新規参入企業は以下の条件で抽出している。
調査開始年の発行件数が0件である(プログラムでは調査開始年の出願人を除外することにより実現している)。
発行件数が平均件数以上でかつ平均増加率以上であるか、または最終年の件数が5件以上でかつ最近に新規参入した出願人である。
以下に作成したExcelマクロを示す。
Sub 新規参入公報抽出()
'
'新規参入集計のための公報データを抽出する
'
'変数を宣言
Dim SHEETNAME01 As String, SHEETNAME02 As String, SHEETNAME03 As String
Dim NY1 As Long, NX1 As Integer, NY2 As Long, NX2 As Integer, NY3 As Long, NX3 As Integer
Dim y As Long, x As Integer, k As Long, by As Long, cellword As String, bcode As String
'配列を宣言
Dim dwrd(65000) As String
'シート名称設定
SHEETNAME01 = "新規参入公報"
SHEETNAME02 = "重複なしデータ"
SHEETNAME03 = "作業用"
'
'カラム数を指定
nclm1 = 11 '発行年
nclm2 = 5 '出願人
'
'クリア
Worksheets(SHEETNAME01).Activate
Cells.Select
Selection.Delete Shift:=xlUp
Worksheets(SHEETNAME03).Activate
Cells.Select
Selection.Delete Shift:=xlUp
'
'===================
'調査開始年の出願人を抽出する
'===================
'処理範囲の行列数を取得
Sheets(SHEETNAME02).Select
Cells(1, 2).Select
ActiveCell.CurrentRegion.Select
NY2 = Selection.Rows.Count
NX2 = Selection.Columns.Count
'発行年でソート
Range(Cells(1, 1), Cells(NY2, NX2)).Sort Key1:=Cells(1, nclm1), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'発行年=開始年の最終行を確認
by = 1
For y = 2 To NY2
If Cells(y, nclm1) <> Cells(y + 1, nclm1) Then
by = y
Exit For
End If
Next y
'発行年=開始年の公報データをコピー
Sheets(SHEETNAME02).Select
Range(Cells(1, nclm2), Cells(by, nclm2)).Select
Selection.Copy
Sheets(SHEETNAME03).Select
Range("A1").Select
ActiveSheet.Paste
'
'=============================================
'セル内のタームを分離し、このタームを公報データから除去する
'セル内に同一分類が複数ある場合があるので分離したタームを二回削除する
'※重複例:特開2007-294830のFIはH01L31/04,Rが重複していた
'=============================================
'処理範囲の行列数を取得
Sheets(SHEETNAME03).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY3 = Selection.Rows.Count
NX3 = Selection.Columns.Count
'セル先頭に";"、セル末尾に";CELLEND;"を追加する
For y = 2 To NY3
Cells(y, 1) = ";" & Cells(y, 1) & ";CELLEND;"
Next y
'セル内のタームを分離し、この分離したタームを公報データから除去する
k = 1
For y = 2 To NY3
'セル内のタームを分離
cellword = Cells(y, 1)
If cellword <> ";CELLEND;" Then
For m = 0 To 1000
If Split(cellword, ";")(m) <> "" Then
bcode = ";" & Split(cellword, ";")(m) & ";"
If bcode = ";CELLEND;" Then
Exit For
Else
'配列に登録
k = k + 1
dwrd(k) = Split(cellword, ";")(m)
'分離したタームを二回除去
Columns("A:A").Select
Selection.Replace what:=bcode, Replacement:=";"
Selection.Replace what:=bcode, Replacement:=";"
End If
End If
Next m
End If
Next y
'
'====================
'配列内容を縦項目として書き出す
'====================
Sheets(SHEETNAME03).Select
Columns(1).Clear
Cells(1, 1) = "分離ターム"
For y = 2 To k
Cells(y, 1) = dwrd(y)
Next y
'
'================
'重複したタームを削除する
'================
'処理範囲の行列数を取得
Sheets(SHEETNAME03).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY3 = Selection.Rows.Count
NX3 = Selection.Columns.Count
'A列のタームでソート
Range(Cells(1, 1), Cells(NY3, NX3)).Sort Key1:=Cells(1, 1), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'次行のタームが同じタームならば当該行を削除
For y = 2 To NY2
If Cells(y, 1) = Cells(y + 1, 1) Then Rows(y).Clear
Next y
'ソートして空白行を削除
Range(Cells(1, 1), Cells(NY3, NX3)).Sort Key1:=Cells(1, 1), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'
'=================================
'開始年出願人以外の出願人を含む公報データを抽出する
'=================================
'処理範囲の行列数を取得
Sheets(SHEETNAME03).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY3 = Selection.Rows.Count
NX3 = Selection.Columns.Count
'開始年出願人名を配列に読込み
For y = 2 To NY3
dwrd(y) = Cells(y, 1)
Next y
'処理範囲の行列数を取得
Sheets(SHEETNAME02).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY2 = Selection.Rows.Count
NX2 = Selection.Columns.Count
'配列以外の出願人を含む公報データにマーク
Columns(NX2 + 1).Clear
For y = 2 To NY2
Cells(y, NX2 + 1) = 0
For k = 2 To NY3
If InStr(Cells(y, nclm2), dwrd(k)) > 0 Then
Cells(y, NX2 + 1) = 1
Exit For
End If
Next k
Next y
'マーク欄でソート
Range(Cells(1, 1), Cells(NY2, NX2 + 1)).Sort Key1:=Cells(1, NX2 + 1), Order1:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'
'=====================
'新規参入の公報データをコピーする
'=====================
'新規参入公報の最終行を確認
by = 1
For y = 2 To NY2
If Cells(y, NX2 + 1) <> Cells(y + 1, NX2 + 1) Then
by = y
Exit For
End If
Next y
'コピー
Sheets(SHEETNAME02).Select
Range(Cells(1, 1), Cells(by, NX2 + 1)).Select
Selection.Copy
Sheets(SHEETNAME01).Select
Range("A1").Select
ActiveSheet.Paste
'
'重複なしデータのマークデータをクリア
Sheets(SHEETNAME02).Select
Columns(NX2 + 1).Clear
'
'==============
Sheets(SHEETNAME01).Select
Cells(1, 1).Select
'MsgBox "終了しました"
'
End Sub
さらに次のマクロにより評価している。
'=================================
'平均件数以上でかつ平均増加率以上の出願人を抽出する
'=================================
'平均件数以上でかつ平均増加率以上の出願人を抽出
Cells(1, NX2 + 3) = "新規候補"
nav = Cells(NY2 + 3, NX2 + 1) '平均件数"
pav = Cells(NY2 + 4, NX2 + 1) '平均増加率
For y = 2 To NY2
Cells(y, NX2 + 3) = 0
If Cells(y, NX2 + 1) > nav Then
If Cells(y, NX2 + 2) > pav Then
Cells(y, NX2 + 3) = 1
End If
End If
Next y
'最終年の件数が5件以上でかつ最近に新規参入した出願人を抽出
For y = 2 To NY2
If Cells(y, 2) = 0 Then
If Cells(y, 3) = 0 Then
'MsgBox Cells(y, NX2)
If Cells(y, NX2) >= 5 Then Cells(y, NX2 + 3) = 1
End If
End If
Next y
'処理範囲の行列数を取得
Sheets(SHEETNAME02).Select
Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
NY2 = Selection.Rows.Count
NX2 = Selection.Columns.Count
'ソート
Range(Cells(1, 1), Cells(NY2, NX2)).Sort Key1:=Cells(1, NX2), Order1:=xlDescending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
'新規候補=0を分離
For y = 2 To NY2
If Cells(y, NX2) = 0 Then
Rows(y).Insert Shift:=xlTodown
Exit For
End If
Next y
'
'===