0

自分でスクリプトを作成するための VBA の知識がないアルゴリズムを探しています。だから私は立ち往生しています。試してみたからといって努力が足りなかったわけではありません (さらに、このコードのビットは、より大きな VBA コードの最後の残りの部分です) 知識/経験/スキルが不足しているだけです...

基本的に、私はExcelファイルを持っています。このファイルにはシート「sheet1」があります。Sheet1 には多数のデータ行が含まれています。sheet1 に含まれる行数は、1 から n まで変化します。あるときは 50 個、あるときは 30 個などです。一貫しているのは本のレイアウトです。つまり、列 A にデータベース内の製品を識別するコードがあります。

私がやりたいことはこれです:

1.シートをスキャンして空の行を探し(ワークブックの生成方法により、空白の行がある場合があります)、それらを削除します。これらの空白行は、データのある行の間にある場合もあれば、シートの末尾にある場合もあります。

2.空白行を削除した後、最後に使用された行を見つけます。それを変数に格納します。これを行うには、このコードが役立つことがわかりました。

mylastrow = myBook.Sheets("Results").Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

3. (2) で決定された行から始めて、A(x where x = mylastrow) の製品コードを取得し、それが他に出現する場所 (列 A) を見つけます。見つかった場合は、それに対応する行全体を削除します。重要なことに、このループは逆方向に進む必要があります。たとえばmylastrow = 40、ループは A40 で開始し、次の反復で A39 (行が削除された場合は 38?) を開始する必要があります。これは、どの製品番号でも、行の対応するデータが列の下の方に多くのデータを含むためです (シートの生成方法による)。基本的に、最後の行に最も近いエントリが最新です。

うまくいけば、私はその場を適切に説明することができました. でももしそうじゃなくて、あなたが私の挑戦(私の重荷?)を喜んで引き受けてくれるなら、私はとても感謝しています。

準々決勝

4

1 に答える 1

2

その知識とスキルを開発する唯一の方法は、そこに入ってコードを書くことです! 誰かが来て、手順全体を書いてくれるかもしれませんが、それまでの間、これらのリソースは自分でそれを行うためのツールを提供するはずです.

まず、空白行を削除する方法はこちらをご覧ください。範囲の「選択」に依存しているため、シートのすべてのセルを手動で選択してからマクロを実行するか、次のように置き換えることができます。

Dim r as range
set r = Sheet1.Cells 'now use r instead of Selection

または (さらに良い) 最後に使用された行を見つけるためにコードを使用し、行 1 から "mylastrow" までの範囲を設定します。

次に、「mylastrow」から始めて、列 A の値を Dictionary オブジェクトに追加し始めます (例はこちら)。行カウンターを使用して、「mylastrow」から 1 に減らすことができます。これがどのように機能するかの例を次に示します。キーは 1 列目 ("A") にあると想定されます。

Dim dict As Object
Dim rowCount As Long
Dim strVal As String

Set dict = CreateObject("Scripting.Dictionary")

rowCount = Sheet1.Range("A1").CurrentRegion.Rows.Count

Do While rowCount > 1
  strVal = Sheet1.Cells(rowCount, 1).Value2

  If dict.exists(strVal) Then
    Sheet1.Rows(rowCount).EntireRow.Delete
  Else
    dict.Add strVal, 0
  End If

  rowCount = rowCount - 1
Loop

Set dict = Nothing

前: 前 後: 後

が 1 のときに停止して以来、1 行目は変更されていないことに注意してくださいrowCount(ヘッダーがあると仮定します)。

于 2012-04-26T17:34:34.703 に答える