質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2234閲覧

配列とVlookupを使った処理

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/10 05:31

編集2021/08/10 06:46

前回の質問の続きになります。
Sheet1A列にある文字列データとSheet2B列の文字列データを比較し、
Sheet2A列に合致率を%でそれぞれ出していきます。

最も%が高い文字列データで、合致率70%以上であればSheet2C列の対応する別言語のデータをSheet1のB列に引っ張ってくるようにしたいと思います。

最初、%を出した後、Sortで降順にして、一番上にくるものに対して70%以上かを確認しようとしたのですが、処理が遅くなる、かつフリーズしてしまうので、Vlookupを使うことにしました。
しかし、存在するはずのデータをVlookupで拾うことができません。

範囲指定が間違っているのかもしれません。お力添え頂ければ幸いです。
(VlookupにもTable1やTable2を使いたかったのですが、うまく使いこなせず、Cellsで記述してます...。)

出てきたエラーは画像の通りです↓
イメージ説明
Variant型って何でも入るわけではないのでしょうか?

Sub 検索() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng1 As Range, rng2 As Range Dim Table1 As Variant, Table2 As Variant Dim Endrow As Integer, Finalrow As Integer Dim i As Long, k As Double, n As Long Dim cnt As Integer, str As String Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") With ws1 Endrow = .Cells(.Rows.Count, 1).End(xlUp).Row 'ws1最終セル Set rng1 = .Range(.Cells(2, 1), .Cells(Endrow, 1)) 'ws1のデータ範囲を配列化 Table1 = rng1.Value 'ws1のデータ範囲を配列化 End With With ws2 .Columns(1).Insert Shift:=xlShiftToRight .Columns(1).Style = "Percent" Finalrow = .Cells(.Rows.Count, 2).End(xlUp).Row Set rng2 = .Range(.Cells(3, 1), .Cells(Finalrow, 2)) Table2 = rng2.Value 'ws2のデータを配列化 End With Dim kinji As Double With Application.WorksheetFunction ws2.Cells(1, 1).Value = .Max(rng2) kinji = ws2.Cells(1, 1).Value On Error Resume Next If kinji >= 0.7 Then ws1.Cells(1, 1).Value = .VLookup(Cells(1, 1).Value, rng2, 3, False).Value End If End With '配列化したデータをシートに戻す rng1.Value = Table1 rng2.Value = Table2 End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ご回答頂いた方には大変申し訳ありませんが、ちょっと荒れそうなので、この辺で切らせて頂きます。ありがとうございました。

投稿2021/08/12 06:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

どこの行でエラーが出たのかもわからんし、
試してみるデータもないので、確認しようがありません。

よくわからんけど、こんな感じ?

ExcelVBA

1Sub test() 2 Dim vrtOld As Variant 3 Dim vrtNew As Variant 4 Dim vrtResults() As Variant 5 Dim Rng As Range 6 Dim n As Double 7 Dim ix As Long 8 9 With Worksheets("Sheet1") 10 With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) 11 vrtOld = .Value 12 vrtNew = Worksheets("Sheet2").Range(.Address) 13 End With 14 End With 15 ReDim vrtResults(1 To UBound(vrtNew, 1), 1 To 1) 16 17 For ix = LBound(vrtOld, 1) To UBound(vrtOld, 1) 18 vrtResults(ix) = 文字列の一致率計算(vrtOld(ix), vrtNew(ix)) 19 Next 20 21 With Worksheets("Sheet2").Cells(1).Resize(UBound(vrtOld, 1), 2) 22 .ClearContents 23 .Columns(1).Style = "Percent" 24 .Columns(1).Value = vrtResults 25 .Columns(2).Value = vrtNew 26 Set Rng = .Cells 27 End With 28 29 With WorksheetFunction 30 n = .Max(Rng.Columns(1)) 31 Rng(.Match(n, Rng.Columns(1), 0), 1).Select 32 End With 33 34 MsgBox n 35End Sub

無意味な変数が多すぎ^^;

投稿2021/08/12 06:03

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、3列目を使うなら3列分のデータを格納する必要があると思います。

VBA

1Set rng2 = .Range(.Cells(3, 1), .Cells(Finalrow, 3))

Vlookupは左端列がSORTされている必要があります。代わりにIndex+Matchにしてみるのはどうでしょう。

VBA

1 ws1.Cells(1, 1).Value = .Index(rng2, .Match(ws2.Cells(1, 1).Value, rng2.Columns(1), False), 3) 2

投稿2021/08/10 08:51

編集2021/08/10 09:18
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/08/10 09:07

ご回答ありがとうございます。修正しました。 配列から最大値の%の場所を探し出し、それに紐づく2つ隣の値(C列の値)を取得したいのですが、 うまくいきません...
退会済みユーザー

退会済みユーザー

2021/08/11 04:53 編集

ありがとうございます。試してみたのですが、フリーズしてしまいました...。 調べてみたところ、配列内を繰り返し検索する場合、dictionaryとして配列を扱う方法があるようです。 ちょっと勉強してみます。 追記:配列内で比較をして最大値の%を取り出す作戦にしました。 jinojiさんのおかげで、配列とセルの違いが少し分かってきました。
jinoji

2021/08/12 03:55

Dim x, r For i = 1 To UBound(table2, 1) If table2(i, 1) > x Then x = table2(i, 1) r = i End If Next If x >= 0.7 Then table1(1, 1) = table2(r, 3) とかですかね。
退会済みユーザー

退会済みユーザー

2021/08/12 06:36 編集

ありがとうございます。頂いたコードを試してみます。この度は本当に助かりました^^これからも精進します。申し訳ありませんが、今回はここまでで切らせて頂ければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問