専門家に聞いた!繰り返す痔の原因は!? >>

Excel2013VBAでたまに、ユーザー定義型は定義されていません、というエラーが発生しています。
症状からは、コード自体の問題ではない気はしますが、参照設定のライブラリファイルのチェックが不足しているのか、よく分かりません。
発生しているシートに記載しているコードを上げておきます。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet
On Error Resume Next
If Intersect(Target, Range(ws.Cells(Target.Row, 2), ws.Cells(Target.Row, 3))) Is Nothing Then
Exit Sub
Else
Call ABCD
End If
End Sub

このコードはシート内のセルが変更された時に動作するイベントマクロで、エラーの発生が、ほぼ確実に起きると思われるやり方は、このコード全体を、まずコメントブロックし、次に非コメントブロックで動作可能状態に戻し、該当シートのセルに文字を入力すると、ユーザー定義型は定義されていません、というエラーが1回はほぼ必ず発生しています。エラーがでても、そのままOKを押すと、コード自体は問題なく実行処理される。次、またそのままセルに文字を入力してもエラーは発生しない。もしかすると何かのタイミングで発生するかもしれない。
その後、またコメントブロックする。そして、セルに文字を入力すると、なぜかここでも1度、同じエラーが発生する。その後は、出ない。
というよく分からない症状が出ています。
参照可能なライブラリ ファイルのチェックは、現在、

Visual Basic For Applications
Microsoft Excel 15.0 Object Library
OLE Automation
Microsoft Office 15.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft VBScript Regular Expressions 5.5

にチェックを入れています。
他、
Microsoft Active Data Objects 6.1 Library
Microsoft Scripting Runtime
上記2つをそれぞれチェックを入れましたが、変化なしです。

ちなみみに、同じシートに、下記のようなコードも記載していますがこちらは発生状況からすると除外できるのかな、と考えています。
Private Sub Worksheet_Deactivate()
On Error Resume Next
If あいう.Visible = True Then Unload あいう
End Sub

その他、標準モジュールや別のシートにも他のコードが記載されていますが、発生状況からこちらもとりあえず除外してもよいのかな、と考えています。
このような状況なのですが、何かエラーの原因になりそうな所があるでしょうか?
よろしくお願いいたします。

質問者からの補足コメント

  • これは、標準モジュールに記載しています。
    これ単独での動作に問題はありません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/01/06 04:21
  • Option Explicit
    で、宣言しないと必ずエラーが出るようにしています。
    だいたいは、普通に動作しています。
    何かのタイミングで、エラーが出るようです。
    最初に示したコードを記載していない他のシートでも、セルの値を削除したタイミングで同じエラーが発生したので、最初に示したコードは関係ないと思われました。
    もう一つのコードの影響なのかもしれません。下に示したコードは、今回エラーが出た別のシートにも記載してあったので。
    Private Sub Worksheet_Deactivate()
    On Error Resume Next
    If あいう.Visible = True Then Unload あいう
    End Sub
    ただこちらも同様に、コメントアウトしてセルに文字を入力すると同じエラーがでました。(この頁のイベントマクロは何もない状態)意味不明。他の頁記載のこのイベントが悪さ?

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/01/06 13:19
  • とりあえず、アドバイスに従い切り分けの為全てのシートのイベントをコメントブロックしました。
    そして、質問にだしたシートのPrivate Sub Worksheet_Change(ByVal Target As Excel.Range)のみ残し、On Error Resume Nextも削除した状態で試しました。
    ブックに一つだけイベントを残した状態で、その残したイベントを一旦全てコメントブロックしました。これで、このブックにイベントで動作するものは一つもない状態になりました。
    そこで、該当のシートに文字を入力すると、やはり同様のエラーが発生しました。プログラムは何も自動で実行するものはありません。これを見る限りシートは関係なさそうなので、コメントブロックすると他のシートでも同様の症状です。エラーの場所は、示されません。フォームが悪さをしている可能性も疑いこちらも全てブロックしています。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/01/06 13:38
  • そのチェックは、外部のデータアクセス機能に関するもののようなので自分のファイルには不要なものだと思います。
    一応変化しないことは確認済です。

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/01/06 14:46
  • 補足ありがとうございます。
    コードは、提示のものと差し替えてみました。動作的には、変化はありません。エラーの状況も同じです。
    コンパイルでエラーはありませんでした。
    参照設定は、外せるものは外して再設定しました。
    Visual Basic For Applications
    Microsoft Excel 15.0 Object Library
    Microsoft Forms 2.0 Object Library
    上記については、使用中のコントロールまたは参照を削除することはできません。と表示されたので、再設定できませんでした。
    Microsoft Active Data Objects 6.1 Library
    は、チェックを外して、
    Microsoft Active Data Objects 2.8 Library
    に変更しました。

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/01/07 23:13
  • 100%かどうかは確信はないですが、分かってきたのが、シートモジュールを変更した後、セルに値を入力すると、ユーザー定義型は定義されていません、というエラーが1度だけ発生するような気がします。その後エラーは、シートモジュールを変更しないと発生しない気がします。
    よってシートモジュールに記載しているコード全てにコメントブロックをかけて、動作するコードがなくなっても変更とみなしエラーが1度は発生するようです。
    そのことから、コードの内容ではなく、このExcelファイルの何かが壊れているのかな?という感じはしています。
    最悪は、新規に作り変えれば直るのかな、とも考えていますが、結構色々作りこまれており、新規ファイル移行は手間がかかる為、これを直して使えればいいとは思っています。

      補足日時:2019/01/07 23:26
  • フォームと列を非表示にするマクロを削除したらエラーがでなくなる様な気がします。
    フォームのマクロはまだ作成途中なので内容検証は難しいですが、(一応立ち上がりは問題なし、エラーもなし状態)、列非表示のマクロは何か変な所があるでしょうか?エラーは無。dicは他モジュールでも使用有。
    とりあえず文字制限で分割です。
    Public Sub 指定列非表示()
    Dim mydic As Object
    Dim ws As Worksheet
    Dim last_row As Long
    Dim c As Range
    Set mydic = Nothing
    Set mydic = CreateObject("Scripting.dictionary")
    Set ws = ThisWorkbook.ActiveSheet
    last_row = ws.Range("BM2").End(xlDown).Row

    No.6の回答に寄せられた補足コメントです。 補足日時:2019/01/13 17:07
  • 続き。
    For Each c In ws.Range(ws.Cells(2, 65), ws.Cells(last_row, 65))
    If Not mydic.Exists(c.Value) Then
    mydic.Add c.Value, Trim(c.Offset(, 1).Value)
    End If
    Next c
    For Each c In ws.Range(ws.Cells(6, 3), ws.Cells(6, 59))
    If mydic.Exists(c.Value) Then
    If mydic.Item(c.Value) = "×" Then
    c.EntireColumn.Hidden = True
    Else
    c.EntireColumn.Hidden = False
    End If
    End If
    Next c
    Set mydic = Nothing
    End Sub

      補足日時:2019/01/13 17:09
  • 内容のご確認ありがとうございます。
    結合セルも特になく、このコードの使用自体は問題はありません。動作も思い通りでエラーになるような事もありません。
    後は、フォームの方ですが、シートの構成を変更した事に始まり、フォーム全体に変更をかけた為、自分の力量では修正に結構時間がかかりそうです。一応、フォームの初期表示の修正は完成し、エラー等もなく思い通りの表示と動きになっています。
    ただ、何が影響しているのかが不明なので、全ての修正・見直しが終わってから、また、改めて今回のエラーの原因と向き合おうと思います。
    特に、普通の使用でエラーが出ることはなく、デバックの限られた状況のみです。
    補足の投稿回数も少なくなってしまった為、一旦この質問は打ち切りたいと思います。
    まだ、解決していませんが、長らくお付き合いしていただいたお礼にベストアンサーに選ばさせていただきます。
    どうも、ありがとうございました。

    No.7の回答に寄せられた補足コメントです。 補足日時:2019/01/14 01:29

A 回答 (7件)

最初に、もう確実なところはありませんので、推理して、それを実験でトライして確証を得るしかありませんが、まだ、私のネタ切れにはしばらくあります。



今、調べてみて、デバッグのコンパイルのボタンでエラーがでなくて、実際にはユーザー定義型のエラーが出てくるという例は聞いたことがないのです。

ちょっと脇道にそれますが、私自身のコードの作り方というのは、hinoki24さんのような真面目な作り方ではなく、
・Option Explicit は書いても、開発中はコメントブロックしてしまうということです。
・対応不足の予想を考えて、変数の宣言はしても、3分の1ぐらいは、Variant (つまり、 As ~ なし)にしてしまいます。

>このコード全体を、まずコメントブロックし、次に非コメントブロックで動作可能状態に戻し、該
>当シートのセルに文字を入力すると、ユーザー定義型は定義されていません、というエラーが1回
>はほぼ必ず発生しています。

Class は使っていませんか。シート1をインスタンスを作っているとか、
イベント・ドリブン型ですから、似たようなものだとは思います。他のイベントにしてみたらどうでしょうか?ダブルクリック・イベントとか。

標準モジュール側の Public 変数と、シートモジュールの 変数(Private)の、使い分けはないでしょうね。まあ、それをしてもユーザー定義型は定義されていない、というエラーはまずでないと思います。

また、私が考えたのは、オーバーヘッドの問題です。オーバーヘッドというのは、オブジェクトが設定されるまでには、多少の時間のロスがあります。だから、事前に参照設定(アーリー・バインディング)をしておけ、というわけです。だから、アーリー・バインディングか、レイト・バインディングか、という問題は、VBAテキストなどでは、前者が良いと書かれていますが、ブック全体で、それらのOLEオブジェクトを抱えていくのは無理な時があります。

それで、私は、このようにしてしまいます。
(インテリセンスが利かないとお思いでしょうが、最初は設定しておいて、後で、もとのオブジェクト型に戻すこともあります。今は、VBAのテンプレートを使うので不要で。)
Microsoft Scripting Runtime を参照設定する代わりに、 Set dic = CreateObject("Scripting.Dictionary") としてしまったり、

Microsoft VBScript Regular Expressions 5.5を参照設定する代わりに、Set Regex = CreateObject("VBScript.RegExp") で間に合わせてしまうことも多いです。

もう、同様の実験は済んでいるとは思いますが、いっそ、Sh As  Worksheet などのデータ型の宣言を、プロジェクト全体に対して、
「As」 ->「 'As」 で、置換して、どうなるでしょうか?

それでもエラーが出るとなると、一度コードを吐き出して、その中身を調べないといけないかもしれません。問題になっている Sheet1 のコードのエクスポートをさせて、テキストにして調べるのです。

他に、トラブルとして、名前登録があります。不要な名前登録は全部削除しておくと安心です。
それ以外は、アドインで、私製 comアドインなどが悪さをすることがあります。
以上、目下、思い当たる範囲です。
この回答への補足あり
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
とりあえず、補足の回数もなくなった為終了します。
今のファイルは、エラーは出ていないですが、修正途中の所もあるので、検証していくにはとりあえず、完成させてからだと思いました。
後は、おっしゃるように、色々削っていって、絞り込んでみようと思います。
とりあえず、名前等を含めシートの方には問題ないようでした。今回ある程度までは絞り込んだので、完成したら、さらに絞り込んでいこと思います。
また、今回の現象は、デバックの限られた状況でエラーが出るのみで、実使用ではエラーは出ないようなので(多分)、使おうと思えば使えるかな、と思います。でも、できれば直したいですけど。

お礼日時:2019/01/14 01:40

その補足で書かれたコードは、私のイメージどおりなのですがいかがでしょうか。


いわゆる レイト・バインディングをお使いになったわけですね。

>列非表示のマクロは何か変な所があるでしょうか?エラーは無。
行の非表示というのはありますが、列の非表示というのは、グループ化しない限りは、使ったことがありませんね。
それでも、確か、結合セルと、その結合セルより右にある列の操作とにはなにかトラブルがあった気がしますね。でも、それと今回のものとは関係があるかわかりません。
この回答への補足あり
    • good
    • 0

こんばんは。



>質問にだしたシートのPrivate Sub Worksheet_Change(ByVal Target As Excel.Range)のみ残し....

思惑とは違うかもしれませんが、前回書いたものを訂正した、以下のコードを試してみてください。

それと、実行する前に、VBAEditor のメニューのデバッグで
VBAProjectのコンパイルをクリックしてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 1 And Target.Column < 4 Then
  Call ABCD
End If
End Sub

'-----------------------------------
Microsoft Active Data Objects 6.1 Library
これは、つい、こちら側を選びたくなりますが、2.x 系のほうが新しいようです。
その差異はないとは思いますが。
-------------------------------------
それから、私の記憶では、参照設定が、うまくかみ合っていない可能性があります。その場合は、いったん、外して、再度、設定してみたらいかがでしょうか。

Visual Basic For Applications ×
Microsoft Excel 15.0 Object Library ×
OLE Automation  ?
Microsoft Office 15.0 Object Library ×
========================
Microsoft Forms 2.0 Object Library ×
========================
Microsoft VBScript Regular Expressions 5.5

Microsoft Active Data Objects 6.1 Library  (2.x系?)
Microsoft Scripting Runtime
-----------------------------
この回答への補足あり
    • good
    • 0

其のエラーを 検索したところ、


此の様な 記事を、
見つけましたが、
https://tsware.jp/tips/tips_334.htm

此は もう、
試されてますよね。
この回答への補足あり
    • good
    • 0

こんにちは。



「ユーザー定義型は定義されていません」というのは、
参照設定でサポートされていないオブジェクトなどの型名を定義した時に限ります。
(ユーザー定義型を定義する場合は除きますし、それは使わないです。)

簡単な例ですと、
Dim ws As Wokksheet  '←スペルミス
と書けば、確実に出てきます。Worksheet のスペルミスだからです。

MS(だけではないけれども)は、こういうプログラマーのために、インテリセンスをつけていますから、ws As として、スペースを入れれば、次に、その必要なものをリスト内から選べばよいわけです。それに出てこないものは、エラーとして現れます。

>ユーザー定義型は定義されていません、というエラーが1回はほぼ必ず発生しています。
>エラーがでても、そのままOKを押すと、コード自体は問題なく実行処理される。
そのまま次に進むのは、 On Error Resume Next のせいではありませんか?

単純なコードにまで On Error Resume Next を入れているのが目につきます。デバッグの段階で、On Error Resume Next では、さっぱり原因がつかめません。一番良いのは、エラーを出して、デバッグモードにさせて、その箇所を特定化させることです。

なお、私なら、こう書くかと思います。

'シートモジュール
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Column > 1 And Target.Column < 4 Then
  Call ABCD
End If
End Sub
(ただし、ABCDの中味にイベントが発生するものは、
Application.EnableEvents=False
'実行プログラム
Application.EnableEvents=True
として、短い間を挟むようにします。長い間だと、別なエラーが発生した時に復旧が効かなくなります。

>Private Sub Worksheet_Deactivate()
>On Error Resume Next
>If あいう.Visible = True Then Unload あいう
>End Sub

これは、ユーザーフォームのことだと思います。私は、こういうコードは書かないけれども、これで動く分には問題ないはずです。
この回答への補足あり
    • good
    • 0

少なくとも、


ユーザー定義方は 存在しますよ?

http://officetanaka.net/excel/vba/statement/Type …
この回答への補足あり
    • good
    • 0

ABCDはどこに?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

QSubまたはFunctionが定義されていません。

コンパイルエラー

SubまたはFunctionが定義されていません。

どこか間違いありますでしょうか?
--------------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, imax As Long
If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
imax = Cells(Rows.Count, 1).End(xlUp).Row
SolverReset
SolverOk SetCell:=Range("E3"), MaxMinVal:=3, ValueOf:=Range("C1").Value, ByChange:=Range("F3:F" & imax), _
Engine:=1, EngineDesc:="GRG Nonlinear"
For i = 4 To imax
SolverAdd CellRef:=Range("E" & i), Relation:=2, FormulaText:=Range("C1").Value
Next i
SolverSolve
End Sub

コンパイルエラー

SubまたはFunctionが定義されていません。

どこか間違いありますでしょうか?
--------------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, imax As Long
If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
imax = Cells(Rows.Count, 1).End(xlUp).Row
SolverReset
SolverOk SetCell:=Range("E3"), MaxMinVal:=3, ValueOf:=Range("C1").Value, ByChange:=Rang...続きを読む

Aベストアンサー

こんにちは。

VBEditor側から、ツール-参照設定
Solver にチェックを入れるか、呼び出し(Application.Run)にすればよいのですが、

コード全体からすると、Worksheet_Changeイベントの頻繁の命令に耐えられるほどの、Solver の性能がそんなに優秀だったかな、と不安に感じるのです。

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub

Q'Range'メソッドは失敗しました

ExcelのVBAの質問になりますが、教えてください。
下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます
どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。


Option Explicit
Public WB1 As Workbook
Public WB1SH1 As Worksheet

Public CSVWB1 As Workbook
Public CSVWB1SH1 As Worksheet

Dim MaxRow As Integer

Private Sub CommandButton1_Click()

Set WB1 = ActiveWorkbook
Set WB1SH1 = WB1.Worksheets(1)
Dim a As String

a = WB1SH1.Range("a1)

Workbooks.Open "C:\Users\User\Desktop\" & a & ".CSV"

Set CSVWB1 = ActiveWorkbook
Set CSVWB1SH1 = CSVWB1.Worksheets(1)

MaxRow = CSVWB1SH1.Cells(Rows.Count, 1).End(xlUp).Row

WB1SH1.Activate
WB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select
CSVWB1SH1.Activate
CSVWB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select  '←ここでエラーがでる

End Sub

ExcelのVBAの質問になりますが、教えてください。
下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます
どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。


Option Explicit
Public WB1 As Workbook
Public WB1SH1 As Worksheet

Public CSVWB1 As Workbook
Public CSVWB1SH1 As Worksheet

Dim MaxRow As Integer ...続きを読む

Aベストアンサー

初心者さんが必ず一度は失敗します。


>Private Sub CommandButton1_Click()

のようにシートオブジェクトに記載したマクロでは、シートを修飾しないセル(レンジ)オブジェクトは全て「マクロを記載したシート」に紐付けられています。


CSVWB1SH1.Range(CSVWB1SH1.Cells(1, 1), CSVWB1SH1.Cells(MaxRow, 3)).Select
のようにしなければいけません。

QEXCELのVBAでのSelectとActivateの違い

VBAの初心者です。
ExcelのVBAでメッセージを表示してシートを切換えるというのを作りたいのです。
見真似で作成したのが↓です。


Dim rtn As String
rtn = MsgBox("シートを切換えますか", vbYesNo, "シートの切替")
If rtn = vbYes Then
Worksheets("送付先一覧").Activate
Range("a1").Select

Else
Exit Sub
End If

動作確認はできましたが、上記の「Activate」を「Select」に変更しても特に動作異常がありません。
そこで、疑問ですが、「Activate」と「Select」ってどうやって使い分けるのでしょうか?

Aベストアンサー

こんにちは。

通常は、シートもセルも Select でよいと思います。
選択して、扱えるようにするということだと思います。

#2さんも述べておりますが、Activate って、ひとつを選ぶことですね。でも、なぜか、Activate は、ほとんど使いません。

たぶん、Select は、選択した後に、その選択したものを、そのままオブジェクトとして確保して使えるので便利だから選ばれるのかもしれません。

Select → Selection
として使えます。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング