3

私は現在、自分の仕事用に小さなストック システムを書き直しており、プログラムが非常に遅く、VBA を始めてまだ 2 週間しか経っていないため、プログラムの速度を上げようとしています。

Excel 2003 Edition。

私の問題(と思います)は、識別子を作成しています。

私は2つ持っており、それらは次のとおりです。

   Dim QuickView As String
   QuickView = ActiveWorkbook.Range("a1:c200").Copy


   Dim Stock As String
   Stock = ActiveWorkbook.Range("c1:c200").Copy

現在、ユーザーは開いているダイアログからファイル (ワークブック) を選択しており、指定された範囲のデータをインポートしています。

ただし、これらの関数を呼び出すと、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というメッセージが表示されます。

Excelで使用するVBAで関数を作成するのではなく、独自のVBA関数を作成できる場所がどこにもないため、これがUDFである必要があるかどうかはわかりません。

4

3 に答える 3

4

2つの例では、「QuickView」と「Stock」の両方が文字列ではなくバリアントである必要があります。

Dim Stock As Variant
Stock = ActiveWorkbook.Range("c1:c200").Copy

セルの値を別の場所にコピー(または切り取り)するために、変数に範囲を割り当てる必要がないことを忘れないでください。代わりに、次のように実行できます。

ActiveWorkbook.Sheets("Sheet1").Range("c1:c200").Copy
ThisWorkbook.Sheets("Sheet1").range("c1")

規則はcopy_from [SPACE] put_it_hereです。

注:上記の例Sheet1では、実行中のコードを含むブックに値がコピーされます。VBAを実行するブックは常にThisWorkbookです。

于 2012-12-04T20:37:02.550 に答える
1

@timburが言ったように、最初に割り当てずに範囲をコピーできます。代入する場合、変数は Range (または Variant) 型である必要があり、オブジェクトの代入と同様に Set を使用して代入する必要があります。

Dim stock as Range  'or Variant, but Range is better
Set stock =  ActiveWorkSheet.Range("c1:c200")
'copy, and optionally paste at once
stock.Copy Destination:=ThisWorkbook.Sheets("Sheet1").range("c1")
于 2012-12-04T20:58:07.980 に答える
1

eSolved it みんな、答えてくれてありがとう:-D

Sub Button1_Click()

Dim FileOpened As Boolean ' Holds True or False value
Dim SourceRange As Range
Dim TargetRange As Range
Dim MasterWorkbook As Workbook
Dim Row As Integer

' Remember the current workbook we are clicking the button from.
Set MasterWorkbook = ActiveWorkbook ' Use Set =  for all complex types.

' Identify file to open.
ChDrive "C:"
ChDir "c:\"

On Error Resume Next ' Temporarily ignore errors in situation when user says no to         opening the same master file a second time.
FileOpened = Application.Dialogs(xlDialogOpen).Show
On Error GoTo 0 ' Reinstates normal error reporting.

' Don't process the file if the user cancels the dialog.
If FileOpened Then

    ' The opened file automatically becomes the new active workbook and active worksheet.
Set SourceRange = ActiveSheet.Range("c1:c394")

Set TargetRange = MasterWorkbook.ActiveSheet.Range("b1:b394")

' Copy cell values one at a time from the source range to the target range.
For Row = 1 To 394
    TargetRange.Cells(Row, 1).Value = SourceRange.Cells(Row, 1).Value
Next

ActiveWorkbook.Close

' Set background colour of target range.
TargetRange.Select
With Selection.Interior
    .ColorIndex = 6
    .Pattern = xlSolid
End With


' Tell Excel to recalculate only those formulas which use the target values.
TargetRange.Dirty

End If

End Sub

このコードに興味のある方へ:

ユーザーは、指定されたディレクトリからファイルを選択し、そのファイルから指定された範囲「c1:c394」を選択して「sheet1」に貼り付けます。

クリップボードをバイパスして、追加された値の影響を受ける数式を更新します。

于 2012-12-05T10:46:43.777 に答える