2016-05-19 21 views
0

私はそれをよりよく並べ替えることができるように、私がExcelシートにコピーした情報を整理しようとしています。アウトラインのように1つのコラムで始まりますが、箇条書きはありません。メイン情報の横の列に副情報を入れたいと思っています。セル内容に基づくVBAアクション

マクロ目的:
から:


SUM関数SUM

説明

機能

説明のIF IF関数

DATE関数

DATE関数の説明

DATE関数の第二の記述

DAYS関数

DAYS関数の説明

FIND、FINDB機能

説明FIのND、FINDB

INDEX関数

INDEX関数の説明


へ:


SUM関数。 。 。 。 。 。 。 。 SUMの説明
IF関数です。 。 。 。 。 。 。 。 。 。 。 IF関数の説明
DATE関数です。 。 。 。 。 。 。 。 DATE関数の説明
。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 DATE関数の第2の説明
DAYS機能。 。 。 。 。 。 。 。 DAYS関数の説明
FIND、FINDB関数。 FIND、FINDBの説明
INDEX関数です。 。 。 。 。 。 。 INDEX関数の説明は


私は動作するはず持っているものだと思うが、私は右のサブ情報をシフトしようとしたときにエラー91または1004のいずれかを取得しておきます。

問題コード:

' Shift sub-info right 
Dim r As Integer 
Dim find As String 
find = "* function" 

Range("A1").Select 
For r = 1 To row1 
    If Range(ActiveCell).find(What:=find, Lookat:=xlWhole).Select Then 
     ActiveCell.Offset(1).Select 
    Else 
     ActiveCell.Insert (xlShiftToRight) 
     ActiveCell.Offset(1).Select 
    End If 
Next r 

私はちょうどので、私のコードは基本かもしれVBAを学ぶために始めていますが、私は私の問題は、「.find」ブール式と私ではないことであると考えていますブール値である同等の関数、またはそれを1に変換する方法を知らない。

「for、to、next」機能を使用する代わりに、すべてを一度に実行する方法があるかもしれませんが、開始方法はわかりません。

全コード:

Sub Shift_Over() 

Dim row As Integer 
row = 1 
Dim n As Integer 

'Locate last used cell 
Range("A1:A8").Select 
Do While Not IsEmpty(ActiveCell) 
    ActiveCell.Offset(8).Select 
    Range(ActiveCell, ActiveCell.Offset(7)).Select 
    row = row + 8 
Loop 

Rows(row).Select 

Do While IsEmpty(ActiveCell) 
    Rows(row - 1).Select 
    row = row - 1 
Loop 

' Remove unneded rows 
Dim row1 As Integer 
row1 = 1 

For n = 1 To row - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row - 1).Select 
     row = row - 1 
     row1 = row1 + 1 
    Else 
     Rows(row).Delete 
     Rows(row - 1).Select 
     row = row - 1 
    End If 
Next n 

' Check value of row1 
Rows(row1).Select 

' Shift sub-info right 
Dim r As Integer 
Dim find As String 
find = "* function" 

Range("A1").Select 
For r = 1 To row1 
    If Range(ActiveCell).find(What:=find, Lookat:=xlWhole).Select Then 
     ActiveCell.Offset(1).Select 
    Else 
     ActiveCell.Insert (xlShiftToRight) 
     ActiveCell.Offset(1).Select 
    End If 
Next r 

'move sub-info in line with main-info 
Range("B1").Delete (xlShiftUp) 
Dim row2 As Integer 
row2 = row1 + 5 

Rows(row2).Select 
Do While IsEmpty(ActiveCell) 
    Rows(row2 - 1).Select 
    row2 = row2 - 1 
Loop 

'remove unneeded rows 
Dim d As Integer 
Dim lines As Integer 
lines = 1 

For r = 1 To row2 - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
     lines = lines + 1 
    Else 
     Rows(row2).Delete 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
    End If 
Next r 

End Sub  

また、あなたは私のコードをより効率的にする方法についてのアイデアを持っている場合、私は(それを改善)、勉強として、またはそのごプログラミングに関するあらゆるニュアンスがある場合私が知らないの通知、私はそれを聞いてうれしいだろう。

私は自分のコードのすべてが私が思っていたことをしているわけではないことに気付きました。セレクション全体を見るのではなく、アクティブなセルだけを見ています。私は "IsEmpty(ActiveCell)"を "IsEmpty(Selection)"に置き換えようとしましたが、すべてにテキストが入っているかのように動作します。しかし、そのままでは、2つのサブ情報セットがある場合、2つ目のサブ情報は削除されます。 (例の4行目が削除されます)

'remove unneeded rows 
Dim d As Integer 
Dim lines As Integer 
lines = 1 

For r = 1 To row2 - 1 
    If Not IsEmpty(ActiveCell) Then 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
     lines = lines + 1 
    Else 
     Rows(row2).Delete 
     Rows(row2 - 1).Select 
     row2 = row2 - 1 
    End If 
Next r 
+0

機能の説明と機能の区別は何ですか?たとえば、関数名にはfunctionという単語が含まれていますか? –

+0

実際の記述が長すぎてすべてを入れることはできませんでしたが、その一例は "SUM function" - "この関数を使ってセルに値を追加する"です。彼らはすべて、すべての大文字と小文字の "ファンクション"の後に続く最初の単語を持っています。私は、 "xlParts"の代わりに "xlWhole"を使ってfind関数を制限しようとしました。 –

+0

だから、関数名は常に少なくとも3つの大文字で始まりますか?データ全体に空白行が散在していますか? –

答えて

0

これは、select文を避けることによって、はるかに簡単に行うことができます。一般に、Excelで操作するときは、選択を避けたいと思っています。処理が遅くなり、コードを保守しにくくする可能性があるからです。

次のコードは、列Aの最初の500行をループします。空の行が見つかると、その行が削除されます。この単純なケースでは、セルA + Bが両方とも空であるかどうかをテストしました。行が空でない場合は、最初の3文字が大文字になっているかどうかがチェックされます。そうでない場合、それは、記述行でなければならないので、それはあなたがfind関数を使用しようとしていたので、あなたのコードは実行できませんでした理由だった

Sub Shift_Over2() 
    Dim i As Integer 
    For i = 500 To 1 step -1 
     If Range("A" & i).Value = "" And Range("B" & i).Value = "" Then 
      Rows(i).Delete 
     ElseIf UCase(Left(Range("A" & i).Value, 3)) <> Left(Range("A" & i).Value, 3) Then 
      Range("B" & i).Value = Range("A" & i).Value 
      Range("A" & i).Value = "" 
     End If 
    Next i 
End Sub 

列Bにセルの内容を移動し(これは範囲を返します)をブール値(true/false)として返します。しかし、その問題を修正した後でさえ、関数名として "function"という単語を持つ記述を扱うため、意図したとおりに動作しません。

関連する問題