1

データの列を取り、フォーマット エラーを編集する Excel マクロを作成しようとしています。バックグラウンド:

  1. LName、FName、MI の 3 つの名前列を含むスプレッドシートが会社に送信されます
  2. 会社は、通常、FName と MI を組み合わせたもの、または完全なミドル ネームを付けて返送します。
  3. 1 つの名前が正しくない場合、状態は適合をスローし、リスト全体を拒否します。たとえば、MI がフル ネームである、FName にスペースがある、MI が FName に含まれている、MI が文字ではなくゼロである、などです。 .

1 か月に 1 回、2,000 人近くの名前を手動でチェックしたくありません。痛いです。そこで、次のことを行うマクロを作成することにしました。

  1. ループできる
  2. MI が FName 列にある場合は MI を取得し、次の列に貼り付けます
  3. FName列のスペースとそれに続くテキストを「トリム」または削除します

最終的には他にもいくつか追加したいのですが、これが分かれば簡単に思えます。

問題:

サブ全体が 1 つのセルから実行されているように見え、アクティブなセルを変更しないため、実際には何も達成されません。IF ステートメントは、すべての FName 列にスペースがあると考えているようですが、これは正しくありません。私はこれがもう一つの「余分な目」の原因であることを確信していますが、私はひどく愚かだと感じており、手術後の鎮痛剤で脳が少し混乱していることを知っています. 私は仕事にいるべきではありません(うーん、今は黙っています)。

セルを選択してアクティブにしようとしても、すべての反復を通じて手動で選択したセルにとどまり、変更されることはなく、スペースがあるかどうかにかかわらず、テキストの最後の文字を次のセルに挿入するだけです. したがって、箇条書き形式の問題は次のとおりです。

  1. 正しいセルを選択/アクティブ化していません。
  2. If ステートメントは、そうでない場合でも肯定を返しています。
  3. したがって、 if ステートメントは愚かなこと全体を壊しています。

とにかく。コードは次のとおりです。HIPAA の理由でスプレッドシートを共有することはできませんが、これらは安全な仮定です。

列 F には姓があり、列 G には名が含まれている必要がありますが、多くの場合、名、スペース、およびミドル ネームのイニシャルが含まれます (たとえば、BOB ではなく BOB C)。最後に、列 H にはミドル ネームのみが含まれますが、多くの場合、完全なミドル ネームまたはゼロが含まれます。その人がミドルネームを持っていない場合 (例: C の代わりに CHARLES、または 0 のみ)。ゼロを "" に変更し、この関数または別の関数で完全なミドル ネームをイニシャルにトリミングする方法については、後で説明します。

Sub ReduceToInitial()

Dim strInit As String
Dim strName As String
Dim r As Excel.Range
Dim rCell As Excel.Range
Dim lr As Long
Dim oSht As Worksheet
Set oSht = Application.ActiveSheet
lr = Cells(Rows.Count, "G").End(xlUp).Row
Set r = oSht.Range("G2:G" & lr)
Range("G2").Select
Range("G2").Activate
On Error Resume Next
For Each rCell In r
Range(rCell).Select
Range(rCell).Activate
    If rCell.Find(" ", rCell) <> 0 Then
        strInit = Right(rCell, 1)
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Formula = strInit
        ActiveCell.Offset(0, -1).Select
        strName = rCell.Left(rCell, rCell.Find(" ", rCell) - 1)
        ActiveCell.Formula = strName
    End If
Next rCell

End Sub

私が自分自身をうまく説明できていない場合はお知らせください。もっとうまく説明できるように努めます。

4

1 に答える 1