痔になりやすい生活習慣とは?

マクロ初心者で詰まってしまっています。バージョンは2016です。

コードを利用して二種類のおなじようなマクロを実行したいです。
①1つの範囲内のセルをダブルクリックで2通→1通→ブランク
②(①とは別の)1つの範囲内のセルをダブルクリックで〇→ブランク

2つめのElseIfに対応するIfがないとのエラーが出てしまうのですが、①②をするにはどこを直せばよいのでしょうか。
なお、同様のことを③(別範囲)として行いたいです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True
If Intersect(Target, Range("D5:D50")) Is Nothing Then Exit Sub

Select Case Target.Value
Case ""
Target.Value = "2通"
Case "2通"
Target.Value = "1通"
Case "1通"
Target.Value = ""

Cancel = True

ElseIf Not Application.Intersect(Target, Range("E5:E50")) Is Nothing Then Exit Sub

Select Case Target.Value
Case ""
Target.Value = "〇"
Case "〇"
Target.Value = ""

End Select
End Sub

よろしくお願いいたします。

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

  • つらい・・・

    ありがとうございます!
    Elself をご指摘どおり、If Intersect〜に修正してみたところ、今度は最終のところでselect caseに対応するend selectがありませんとのエラーが出てしまいました…。根本的になにかちがうでしょうか。。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/01/20 16:48

A 回答 (4件)

こんばんは。



インデンティング(indenting-行下げ)をきちんとしていないから、エラーが見つからないのでしょうね。縦で揃えるようにして並べ直しますと、間違っていれば、Select --- End, Select, If ---End if が 揃わなくなります。
アドイン・ツールもあるのですが、今、サイトが開かないようです。
Smart Indenter という名前です。

なるべく、オリジナルを生かしています。
'//
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 If Intersect(Target, Range("D5:E50")) Is Nothing Then Exit Sub
 If Not Intersect(Target, Range("D5:D50")) Is Nothing Then
  Cancel = True
  Select Case Target.Value
   Case ""
    Target.Value = "2通"
   Case "2通"
    Target.Value = "1通"
   Case "1通"
    Target.Value = ""
  End Select
 ElseIf Not Intersect(Target, Range("E5:E50")) Is Nothing Then
  Cancel = True
  Select Case Target.Value
   Case ""
    Target.Value = "〇"
   Case "〇"
    Target.Value = ""
  End Select
 End If
End Sub
    • good
    • 0
この回答へのお礼

助かりました

2文目を足してくださったのですね。
確かに位置がよくわからない状況でした。
使用させて頂きました!

お礼日時:2019/01/20 22:21

最初の、2通1通ブランクを切り替えるSelectに対応するEnd Selectが抜けてますよね。

    • good
    • 0

こんにちは!



Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 If Intersect(Target, Range("D5:E50")) Is Nothing Then Exit Sub
  Cancel = True
   With Target
    If .Column = 4 Then
     Select Case .Value
      Case ""
       .Value = "2通"
      Case "2通"
       .Value = "1通"
      Case "1通"
       .Value = ""
      End Select
    Else
     If .Value = "" Then
      .Value = "○"
     Else
      .Value = ""
     End If
    End If
   End With
End Sub

こんな感じでどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

助かりました

有り難うございます。こちらでも出来そうでした!

お礼日時:2019/01/20 22:18

>2つめのElseIfに対応するIfがないとのエラーが出てしまうのですが


単に
If Not Application.Intersect(Target, Range("E5:E50")) Is Nothing Then Exit Sub
で良いはずです。
ひょっとしてやりたいことは
If Intersect(Target, Range("E5:E50")) Is Nothing Then Exit Sub
かもしれませんが。

最初の IF
If Intersect(Target, Range("D5:D50")) Is Nothing Then Exit Sub
の一行で完了していますので
ElseIf にする必要はありません。
この回答への補足あり
    • good
    • 0

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

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

QプログラミングVBAについてです。 やり方を教えて下さい。よろしくお願いいたします。

プログラミングVBAについてです。
やり方を教えて下さい。よろしくお願いいたします。

Aベストアンサー

何かの課題のようなので、ヒントのみです。

どこがわからないのかも不明で、単なる丸投げ的な質問になっちゃってますが、大きく分ければ
・設問の意味や考え方がわからない
 (プログラミング言語とは関係なくアルゴリズム等の理解の問題)
・コードを作成できない
 (プログラムのフローを考える力と、言語知識の問題)
のどちらなのでしょうね?(両方なのかも)

ひとまず、このあたりが参考になるかも?
(検索すれば他にもいろいろ見つかると思いますが)
長方形積分と台形積分の説明とコード(C言語)
https://www.vcssl.org/ja-jp/code/archive/0001/3000-integral-rectangular/
https://www.vcssl.org/ja-jp/code/archive/0001/3000-integral-rectangular/

VBAでの例
https://excelmath.atelierkobato.com/trapzoid/

おまけ(シンプソン法の例)
http://shimaphoto03.com/program/simpson-vba/

何かの課題のようなので、ヒントのみです。

どこがわからないのかも不明で、単なる丸投げ的な質問になっちゃってますが、大きく分ければ
・設問の意味や考え方がわからない
 (プログラミング言語とは関係なくアルゴリズム等の理解の問題)
・コードを作成できない
 (プログラムのフローを考える力と、言語知識の問題)
のどちらなのでしょうね?(両方なのかも)

ひとまず、このあたりが参考になるかも?
(検索すれば他にもいろいろ見つかると思いますが)
長方形積分と台形積分の説明とコード(C言語)
ht...続きを読む

Q自分のパソコンではVBAが起動しますが‥ 他のパソコンでやってみると起動せずに インデックスが有効範

自分のパソコンではVBAが起動しますが‥
他のパソコンでやってみると起動せずに
インデックスが有効範囲にありませんの
エラーが出てしまいます。

何故でしょう?

だいたい下記のようなVBAになります。

Sub SendingSheet()
 Dim wb As Variant
 Dim WkBk As Variant
 For Each wb In Workbooks
  If (wb.Name) Like "FTN*【チェックシート】*.xls?" And wb.Name <> ActiveWorkbook.Name Then
   Set WkBk = wb
   Exit For
  End If
 Next
 If IsObject(WkBk) Then
  On Error Resume Next
  With WkBk
   ActiveSheet.Copy After:=WkBk.Worksheets(.Worksheets.Count)
ActiveSheet.name= "シートA"
   Beep  'コピーしたら音がなる
  End With
  If Err.Number <> 0 Then
   MsgBox Err.Number & " :" & Err.Description
  End If
  On Error GoTo 0
 Else
  MsgBox "該当するブックは開いていません。", vbExclamation
 End If
End Sub

----------------
よろしくお願いします。

自分のパソコンではVBAが起動しますが‥
他のパソコンでやってみると起動せずに
インデックスが有効範囲にありませんの
エラーが出てしまいます。

何故でしょう?

だいたい下記のようなVBAになります。

Sub SendingSheet()
 Dim wb As Variant
 Dim WkBk As Variant
 For Each wb In Workbooks
  If (wb.Name) Like "FTN*【チェックシート】*.xls?" And wb.Name <> ActiveWorkbook.Name Then
   Set WkBk = wb
   Exit For
  End If
 Next
 If IsObject(WkBk) Then
  On Error Resume Next
 ...続きを読む

Aベストアンサー

ちょっと割り込みさせていただきます。
ほとんど、前の方のやり取りは読まずに、コードを直してみました。

"FTN*【チェックシート】*.xls? というブックがあったら、そこにシートのコピーを送るというマクロですよね。
見た目は簡単なマクロのようですが、ひじょうにややこしくしているのは、マクロを搭載しているThisWorkbookの存在です。そのBookと、"FTN*【チェックシート】*.xls?は、同一ではない、というコードになっているからです。その条件は含め、ご質問者さんのコードは活かしました。

>"FTN*【チェックシート】*.xls?"
>上記のBookにコピーしてほしいのに
>アクティブBookへ名前を付けてコピーされて
>しまいます。

やはりそうなのですね。こちらのマクロでも、なぜかコピー後に、Active化が移動していないということです。(Excel 2016) //明示的にActiveの親オブジェクト(Book)から指定しなくてはならないようです。

ファイル(ブック)を特定化するロジックが大雑把ですね。一旦、見つけたブックを、さらに、Activeかどうかを調べるのであって、同時に両方の条件を調べたら、ブックがないことになってしまいます。

なお、こちらでは、エラーを避けるために、「 "シートA-" & .Worksheets.Count 'オプショナル」というオプションを設けました。それと、エラー・ストップというのは、通常は、ステップマクロで分かるものです。


'//標準モジュール(アドインを含む)
Sub SendingMySheet()
 Dim Wb As Variant
 Dim WkBk As Workbook
 Dim acWb As Workbook
 Dim sh As Worksheet

 On Error GoTo ErrHandler

 For Each Wb In Workbooks
  If Wb.Name Like "FTN*【チェックシート】*.xls?" Then
   If Wb.Name <> ActiveWorkbook.Name Then
    Set WkBk = Wb
    Exit For
   Else
    MsgBox Wb.Name & "はアクティブではできません。", vbExclamation
    Exit Sub
   End If
  End If
 Next Wb
 If Not WkBk Is Nothing Then
  Set acWb = ActiveWorkbook
  With WkBk
   acWb.ActiveSheet.Copy After:=.Worksheets(.Worksheets.Count)
   .ActiveSheet.Name = "シートA-" & .Worksheets.Count 'オプショナル
   Beep
  End With
 Else
  MsgBox "該当するブックは開いていません。", vbExclamation
 End If
ErrHandler:
 If Err() <> 0 Then
  MsgBox Err.Number & " :" & Err.Description
 End If
End Sub

ちょっと割り込みさせていただきます。
ほとんど、前の方のやり取りは読まずに、コードを直してみました。

"FTN*【チェックシート】*.xls? というブックがあったら、そこにシートのコピーを送るというマクロですよね。
見た目は簡単なマクロのようですが、ひじょうにややこしくしているのは、マクロを搭載しているThisWorkbookの存在です。そのBookと、"FTN*【チェックシート】*.xls?は、同一ではない、というコードになっているからです。その条件は含め、ご質問者さんのコードは活かしました。

>"FTN*【チェッ...続きを読む

Q何故このようなプログラムだとエクセルに書き込めないのか教えてください。

何故このようなプログラムだとエクセルに書き込めないのか教えてください。

Aベストアンサー

私もPythonは研究を始めたばかりですが、まさかopenpyxlとかのExcel操作ライブラリがインストールされてないなんてオチはないですよね?

あとsheet1.write(str… ってなってますが、ここはセル番地の指定だからstrでは文字列になっちゃうのでまずいと思います。変数countは数値なんだから、そのまま sheet1.write(count, 0 ,str(inputvale)) でいけるのでは?

Qエクセルで♯N/Aを隠しておく 簡単な方法を教えてください!

エクセルで♯N/Aを隠しておく 簡単な方法を教えてください!

Aベストアンサー

関数の具体例を画像に示すので、真似してトライしてみてください。
VLOOKUP関数を使った処理の♯N/A回避例です。

数式は、全て半角で打って下さいね。イコールも含めて。

QエクセルVBAの書き方を教えて下さい

写真のようなリストがあります。(下の方に20人分ぐらい続きます)
マクロで以下の事をしたいのでVBEでの書き方(?)を教えて下さい。

①表の中の赤色のセル(E-AI列の8行目・12行目・16行目・・・表の中の最後(一番下)まで)の表示形式が「文字列」になっているので、全て「標準」に変える(赤色のセルのみです)

②8行目の赤色のセルのE-AIをコピーして12行目・16行目・・・表の中の最後(一番下)までに書式を張り付ける

※①が完了した後、手動で少しいじってから②を実行したいので、②は別に教えて下さい。(①と②を別に記憶させる)
※表は日によって(在籍人数によって)最終行が変わるので自動で最終行を検知し、ストップしてほしいと思います。

宜しくお願い致します。

Aベストアンサー

こんばんは!

A列で最終行を取得するようにしていますので、A列には何らかのデータが入っている!という前提です。

まず①から

Sub Sample1()
 Dim i As Long
  For i = 8 To Cells(Rows.Count, "A").End(xlUp).Row Step 4
   Range(Cells(i, "E"), Cells(i, "AI")).NumberFormatLocal = "G/標準"
  Next i
End Sub

次に②ですが、数式をコピー&ペーストしたい!というコトですが、
8行目の数式はE列の数式を右にAI列までフィル&コピーしている!という前提です。

Sub Sample2()
 Dim i As Long
  For i = 12 To Cells(Rows.Count, "A").End(xlUp).Row Step 4
   Range(Cells(i, "E"), Cells(i, "AI")).Formula = Range("E8").Formula
  Next i
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんばんは!

A列で最終行を取得するようにしていますので、A列には何らかのデータが入っている!という前提です。

まず①から

Sub Sample1()
 Dim i As Long
  For i = 8 To Cells(Rows.Count, "A").End(xlUp).Row Step 4
   Range(Cells(i, "E"), Cells(i, "AI")).NumberFormatLocal = "G/標準"
  Next i
End Sub

次に②ですが、数式をコピー&ペーストしたい!というコトですが、
8行目の数式はE列の数式を右にAI列までフィル&コピーしている!という前提です。

Sub Sample2()
 Dim i As Long
 ...続きを読む

Q離れたセルを参照して表示

C4:T28の表があり、
それぞれ数字が入っているのですが、(1-18)の間でランダムで入っています。
C4:T4には左から1から18迄の数字が昇順で並んでいます。
C5:T5、C7:T7、C9:T9、、、C27:T27をダブルクリックしてC4:T4の中に入っている数字を表示したいです。
例えば
C5:T5に左から、9、6、10 、8 、13 、7 、16 、5 、15 、14 、1 、11、12,3,4,2
が入っていて例えば8、7、6、10と順番にダブルクリックしていったら、
4番目、6番目、2番目、3番目なので、W5に4、X5に6、Y5に2、AAに3、
その下W6に8、X6に7、Y6に6、AAに10とクリックした数字を表示したいです。
同様にC7:T7、C9:T9...C27:T27も同じ様に。
マクロを教えて欲しいです、宜しくお願いします。

Aベストアンサー

こんにちは

結果の例示だけで考え方の説明が十分にないので、ルールがよくわからないため、以下の様に勝手に想定しました。
違っている場合は修正するか、捨ててください。

・ダブルクリック時の処理の対象はセル範囲C5:C27のうちの奇数行のみ
・対象セルの内容が空白の場合はなにもしない
・記録するセルは、対象セルと同じ行と次の行の2行で、W列から開始するが、
 3列記録する毎に空白列が入る。
 (W、X、Y、空白、AA、AB、AC、空白・・・となる)
・Wクリック動作が連続していなくても、Wクリックされたら常に
 既存の記録に追加してゆく形式とする。
・同じセルをWクリックした場合、同じ内容が重複して追記される。
・同じ行(のW列から)に記録される数値は、C4:T4の内容には拘わらず
 対象セルがC列から数えて何列目かの数値となる。(C列を1とカウント)


対象シートのシートモジュールに。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Dim c As Range, col As Long

 Set c = Intersect(Target, Range("C5:T27"))
 If c Is Nothing Or Target.Row Mod 2 = 0 Then Exit Sub
 If c.Value = "" Then Exit Sub

 Cancel = True
 col = Cells(c.Row, Columns.Count).End(xlToLeft).Column + 1
 If col < 23 Then col = 23
 If col Mod 4 = 2 Then col = col + 1

 Cells(c.Row, col).Value = c.Column - 2
 Cells(c.Row + 1, col).Value = c.Value
End Sub

こんにちは

結果の例示だけで考え方の説明が十分にないので、ルールがよくわからないため、以下の様に勝手に想定しました。
違っている場合は修正するか、捨ててください。

・ダブルクリック時の処理の対象はセル範囲C5:C27のうちの奇数行のみ
・対象セルの内容が空白の場合はなにもしない
・記録するセルは、対象セルと同じ行と次の行の2行で、W列から開始するが、
 3列記録する毎に空白列が入る。
 (W、X、Y、空白、AA、AB、AC、空白・・・となる)
・Wクリック動作が連続していなくても、Wクリックされた...続きを読む

Q初歩的な質問で申し訳ありません。 VBAの最終行取得についてご教授宜しくお願い致します。 ワークシー

初歩的な質問で申し訳ありません。
VBAの最終行取得についてご教授宜しくお願い致します。
ワークシートのA1には”製品コード”
の文字が入った状態です。
別のブックからデータを取得し、A2に表示させます。
A2のValueを変数cord1に
A2の上4桁を変数cord2に入れるというものなのですが、、、
Rc=cells(Rows.count,1).End(xlup).Row
cells(Rc +1,”A”).Value=8001001
Set cord1=cells(Rc,”A”)
cord2=Left(cells(Rc,”A”),4)
としました。
cord1は8001001
cord2は8001
となって欲しいのですが結果は
cord1は”製品コード”
cord2は”製品コー”
となってしまいました、、、
cells(Rc +1,”A”).Value=8001001
とした時点で、最終行はA1の”製品コード”
からA2の8001001に移っていると思ったのですが、最終行として認識してくれません。
何が問題なのでしょうか、、、
乱文失礼致しました。
どうか、よろしくお願い致します。

初歩的な質問で申し訳ありません。
VBAの最終行取得についてご教授宜しくお願い致します。
ワークシートのA1には”製品コード”
の文字が入った状態です。
別のブックからデータを取得し、A2に表示させます。
A2のValueを変数cord1に
A2の上4桁を変数cord2に入れるというものなのですが、、、
Rc=cells(Rows.count,1).End(xlup).Row
cells(Rc +1,”A”).Value=8001001
Set cord1=cells(Rc,”A”)
cord2=Left(cells(Rc,”A”),4)
としました。
cord1は8001001
cord2は8001
となって欲しいのですが結果は
cord1は”製品コ...続きを読む

Aベストアンサー

こんにちは

コードは記述内の制御に従いながら、上から順に実行されてゆきます。

>Rc=cells(Rows.count,1).End(xlup).Row
が実行された時点で、最終行(例えば200としておきます。)が変数Rcに代入されます。
この時の200はただの数値で、「最終行を示す」とか「セルの位置を表す」といった意味はありません。
これに勝手に意味を付けているのはコードの作成者であって、変数にとってみれば単なる200という数値でしかありません。
「100+100」や「1000/5」の計算結果と、なんら変わるものではないということです。

ですので、
>cells(Rc +1,”A”).Value=8001001
を実行したからといって、変数Rcの内容が変わることはありません。
(変数Rcの内容を変更もしていないのに変わってしまうようでは、困る人が続出することと思います)

Rc+1行目に値をセットした後で、再度
 Rc=cells(Rows.count,1).End(xlup).Row
を実行してみると、今度は、変数Rcには 201 の数値が代入されるはずです。


もしも、機能的に常に最終行を参照できるようなものが欲しいような時は、
 Function lastRow()
  lastRow = Cells(Rows.Count, 1).End(xlUp).Row
 End Function
のような関数を別に定義しておいて、変数を使う代わりに
 Cells(lastRow(),1).Value
といった参照方法をとることで、シートの記入状況に拘わらず、常に(その時点での)最終行の値を参照するコードになります。

こんにちは

コードは記述内の制御に従いながら、上から順に実行されてゆきます。

>Rc=cells(Rows.count,1).End(xlup).Row
が実行された時点で、最終行(例えば200としておきます。)が変数Rcに代入されます。
この時の200はただの数値で、「最終行を示す」とか「セルの位置を表す」といった意味はありません。
これに勝手に意味を付けているのはコードの作成者であって、変数にとってみれば単なる200という数値でしかありません。
「100+100」や「1000/5」の計算結果と、なんら変わるものではないということで...続きを読む

QExcelで「令和」と表示されるのは5月1日にならないとだめですか?

「日本の新元号に関する Office の更新プログラム」というページ(下記)で、
「Windows と Office の更新プログラムを適用済みの場合でも、Windows 上で実行されている Office 製品は 2019 年 5 月 1 日に新元号が開始されるまで、新元号を表示しませんのでご注意ください。」
と書かれています。
https://support.microsoft.com/ja-jp/help/4478844/office-updates-for-new-japanese-era

今月4月中に、Excelのセルに来月5月以降の年月日を入力した場合に、自動で「令和」という元号を表示させることはできないのでしょうか。

もし、できるということであれば、「2019 年 5 月 1 日に新元号が開始されるまで、新元号を表示しません」とはどのような意味なのでしょうか。

Aベストアンサー

>こちらでは、「4月17日以降にOfficeも更新されれば「令和元年」と表示されると思います」と書かれているんですが

その方は、Microsoftの方ではないですし個人の予想ですよね?公式が出ているのにそれを持ち出してどうするんですか?

5/1より前に新しい元号を表示したい場合は数式や表示形式で限定的に表示させる方法を色々な方が考え付いていますよ。
検索すればたくさん出てきます。

QExcelVBAで、ユーザー定義型は定義されていません、というエラーが発生する

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

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

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(...続きを読む

Aベストアンサー

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

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

ちょっと脇道にそれますが、私自身のコードの作り方というのは、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アドインなどが悪さをすることがあります。
以上、目下、思い当たる範囲です。

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

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

ちょっと脇道にそれますが、私自身のコードの作り方というのは、hinoki24さんのような真面目な作り方ではなく、
・Option Explicit は書いても、開発中はコメントブロックしてしまうということです。
・対応...続きを読む

Q比例配分と For-Next

以下のようなデータがあるとします
0 20 40 60 80 100 80 60 40 20 0
この11のデータを21に増やします。
0 10 20 30 40 50 60 70 80 90 100 90 80 70 60 50 40 30 20 10 0
こうなると思います(現状、手作業です)

これを 比例配分的な考えと For-Next で VBA化 したいと思っていますが、いい考えが浮かびません。

というのが、データ数は この間の 15 (可能なら 13,17とかも)さらに 25,31 なども作りたいのです。
こういったことで、お知恵拝借。

舞台裏は、上記のデータ並びは A型(山型?)ですが、それ以外にも、逆のV,とか U とか W,M、ストレートの上り、など パターンが 15ほどあります。(それが データ数でさらに増える)

それを 生データとの 相関係数をとり パターン分析をやりたい・・・・。
(エクセルの相関係数はデータ数が一致しないとNG)

よって、vbaではないが、そういう考え方は、このサイトあるよ・・・でも助かるのですが

以下のようなデータがあるとします
0 20 40 60 80 100 80 60 40 20 0
この11のデータを21に増やします。
0 10 20 30 40 50 60 70 80 90 100 90 80 70 60 50 40 30 20 10 0
こうなると思います(現状、手作業です)

これを 比例配分的な考えと For-Next で VBA化 したいと思っていますが、いい考えが浮かびません。

というのが、データ数は この間の 15 (可能なら 13,17とかも)さらに 25,31 なども作りたいのです。
こういったことで、お知恵拝借。

舞台裏は、上記のデータ...続きを読む

Aベストアンサー

×出力行(下ではB1セル)にデータを出力します。
〇出力行(下ではA2セル)にデータを出力します。


人気Q&Aランキング