エクセルVBA パソコン変更で動作不能

このQ&Aのポイント
  • エクセルVBAを使用してパソコンの変更に伴う動作不能の問題を解決する方法について教えてください。
  • パソコンの変更によりエクセルVBAが動作しなくなった場合、商品コードの作成を行うVBAコードを修正することで問題を解決できます。
  • VBAによる商品コードの作成がうまくいかない原因として、色コードのセル範囲の指定が正しく行われていない可能性があります。
回答を見る
  • ベストアンサー

エクセルVBA パソコン変更で動作不能に

使用するパソコンが変更になり、今まで問題なく動作していたのですが、できなくなってしまいました。 (パソコン環境) 故障によりパソコンは変わりましたが、VISTA、Excel2003という環境は同じです。 (動作内容) 個別の色コードを12個つなぎ合わせて、1つの商品コードにします。 ランダムにピックアップして、400個の商品コードを作成します。 (具体的には) 12箇所の色コードをそれぞれ4パターンの中から1つを選択して、商品コードを作成するものです。 Sheet1には、48個(12箇所×4パターン)のコードを予め用意したものがあり、VBAによって、 Sheet2に400個の商品コード(セル範囲A1~D400)を作成します。 色のコードはあらかじめセル(4種×12面で48個のセル)に入力してあります(手作業で)。 エクセルシートのA列に、たてに48個を入力  ・セル( A3~ A6)にA面の色コード  ・セル( A8~A11)にB面の色コード  ・セル(A13~A16)にC面の色コード  ・セル(A18~A21)にD面の色コード  ・セル(A23~A26)にE面の色コード  ・セル(A28~A31)にF面の色コード          ・  ・セル(A58~A61)にL面の色コード (問題点) 動作しているようなのですが、Sheet2が真っ白のままで終了していまいます。 エラー表示のウィンドウは出てきません。 これまでSheet2には商品コードが400行作成(セル範囲A1~D400)できておりました。 (お願い) 原因が分からず途方に暮れております。解決方法をお願いいたします。 (以下にコード転載します。) Sub 商品コード作成400() Dim ASide, BSide, CSide, DSide, ESide, FSide, GSide, HSide, ISide, JSide, KSide, LSide nTotal = 400 '←コード作成数 sFileName = Range("A1") '←商品の名前(Sheet1のA1セル) '12面分の色コードを配列に取り込む ASide = Range("A3:A6") BSide = Range("A8:A11") CSide = Range("A13:A16") DSide = Range("A18:A21") ESide = Range("A23:A26") FSide = Range("A28:A31") GSide = Range("A33:A36") HSide = Range("A38:A41") ISide = Range("A43:A46") JSide = Range("A48:A51") KSide = Range("A53:A56") LSide = Range("A58:A61") Application.ScreenUpdating = False With Sheets("Sheet2") .Cells.ClearContents For i = 0 To 4095 'パターン作成 4の6乗 4095個 .Cells(i + 1, 1) = sFileName aa = 1 + Int(i / 4 ^ 5) Mod 4 bb = 1 + Int(i / 4 ^ 4) Mod 4 cc = 1 + Int(i / 4 ^ 3) Mod 4 dd = 1 + Int(i / 4 ^ 2) Mod 4 ee = 1 + Int(i / 4 ^ 1) Mod 4 ff = 1 + Int(i / 4 ^ 0) Mod 4 '前半6個の組み合わせ .Cells(i + 1, 3) = ASide(aa, 1) & BSide(bb, 1) & CSide(cc, 1) & DSide(dd, 1) & ESide(ee, 1) & FSide(ff, 1) '後半6個の組み合わせ .Cells(i + 1, 4) = GSide(aa, 1) & HSide(bb, 1) & ISide(cc, 1) & JSide(dd, 1) & KSide(ee, 1) & LSide(ff, 1) .Cells(i + 1, 5) = Rnd() Next i 'ランダムに並び替え .Range("A1:E4096").Sort Key1:=.Range("E1") '不要な分を削除 400個のみ残す .Range("E1:E4096").ClearContents .Range("A401:D4096").ClearContents End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プログラムコードを見る限り、動作上の問題はないように見えます。 となると、動作しないという点はプログラム以外が原因とみる必要があります。 まず、VBマクロの実行は確実に行われている。かの確認が必要となります。 Windowsアップデートの関係でVistaにおいてVBマクロが動作不可になっている可能性があります。また、PCが変わっていることが原因として考えられるものは、VBマクロの作成場所というのも考えられます。 そのため、VBマクロ内において要素要素でブレークポイントをおいて動作確認をしてください。 ブレークポイントを置いても反応することがなく終了してしまう場合は、マクロが実行されていません。 実際、VBはコード以外にも確認をしてみないとわからないので詳細回答はできないのですが、要素を一つずつ潰しながら調べるのがいいと思います。

value100100
質問者

お礼

回答ありがとうございます。ポイントは「Windowsアップデートの関係でVistaにおいてVBマクロが動作不可になっている可能性があります。」の箇所でした。今回の不具合は、Excelの互換性の問題だったようです。 『Word/Excel/PowerPoint 用 Microsoft Office 互換機能パック』をダウンロードすることで解決できました。ありがとうございました。

その他の回答 (3)

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.4

Application.ScreenUpdating = False Application.ScreenUpdating = true 上記をコメントにして一時作動中止 next i の前にブレークポイントを挿入して結果を見れば判明するのでは? i=0でも指定セルには必ず数値が入力されるのであればその数値と数式で検証出来ますよね。変数や数式の結果は下記3つの方法で確認出来ますね。 Debug.Print ウィッチ式 変数にカーソルを合わせると結果を表示 セルに計算結果を直接入力していますが、変数に格納してデバックすると結果確認が容易になります。 sheet1を表示させてVBAを実行させないと変数及び配列データの取得が出来ないと思います。 冒頭にSheets("sheet2").Select又はactivateでsheet1をアクティブにした方が良いのではないでしょうか。 私はselect、activeは画面切り替えが発生する可能性があるので、withステートメントの方を使用することの方が多いのですが。 結果が何も出ないのであれば、変数の取得が出来ていない可能性があるのではないでしょうか。 デバック方法 http://www.excel-excel.com/vbachair/step1-7.html

value100100
質問者

お礼

回答ありがとうございます。デバッグにより調べてみました。 結果が何も出ないので、変数の取得が出来ていない可能性があると思われます。

  • kichi8000
  • ベストアンサー率41% (658/1581)
回答No.3

Sheet2の書式や文字色に何か設定はされていませんか。 見えないだけということはありませんか。

value100100
質問者

お礼

回答ありがとうございます。 Sheet2には特に書式や文字色の設定はしていません。

回答No.1

どこまでできているかステップでチェックしていけばよいのでは? ASide = Range("A3:A6") ASideに値は入っているか? Application.ScreenUpdating = Falseをやめて、 .Cells(i + 1, 3) = ASide(aa, 1) & BSide(bb, 1) & CSide(cc, 1) & DSide(dd, 1) & ESideが実行されて値が入っているか、、、

value100100
質問者

お礼

回答ありがとうございます。 ご指示どおりステップチェックしてみたところASideに値が入っていませんでした。 そうなってしまう原因を探そうと思います。

関連するQ&A

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • Excel VBAについて

    Excelで、指定したセル範囲の外枠に罫線を引き四角形を作り、B1の数字を変えていくと四角形を横に描いていくというマクロを作成したのですが、B1の数値を変えてマクロを実行すると以前に描いた四角形が残ってしまいます。これを数値を変えてマクロを実行すると、以前の四角形を消して新たに四角形を描くにはどうすればよいのでしょうか。何かいい方法があれば教えてください。宜しくお願いします。以下にコードを示しておきます。 Public Sub Main_Code() a = ThisWorkbook.Worksheets("Sheet1").Range("B1") If a = 2 Then Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("B1").Select ElseIf a > 2 Then Dim i As Integer For i = 3 To a Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("I26:K35").Select Selection.Copy Cells(26, 3 * i + 3).Select ActiveSheet.Paste Application.CutCopyMode = False Range("B1").Select  Next i  End If End Sub

  • 商品コード一覧表をエクセルVBAで作成したいのです

    「商品コード一覧表」の作成を自動でしたいのです。 商品は6面の箱状のものです。(ルービックキューブみたいなものです。) 各面の色を自由に選択できるようになっています。 色は4種から選べるのですが、各面ごとに選べる色は異なっています。 たとえば・・・ 6面をそれぞれA面、B面・・・F面として、色の選択方法は以下のようになります。 A面はA1~A4の4色から1つを選択 B面はB1~B4の4色から1つを選択 C面はC1~C4の4色から1つを選択 ・ ・ F面はF1~F4の4色から1つを選択 このようにA面からF面まで、1つずつ色を選択して商品コードを作成します。 作成する商品コードは色を6つ横に並べた形になります。 (例1) 「A1B1C1D1E1F1」 (例2) 「A1B2C1D3E4F2」 (例3) 「A4B1C3D2E1F4」 商品コードのパターンは、各面4色ずつ選べるので、 4×4×4×4×4×4=4096 となります。 全部でパターンは4096通りあるのですが、 商品として製造するのは、このうち400~500種になります。 全体からすると、約1割程度のパターンを使って製造するのですが、 抽出方法に決まりがある訳では無く、適当にランダムに選び出します。 400個の商品コードを400行のテキストデータにして、 商品コード一覧(1つのファイル)として作成し、保存する。 これまで、これらの作業をエクセルを使ってせっせと作成していました。 最近になって本屋でエクセルVBAなるものを知り、自分でやろうと頑張ってみたのですが、 どうも、思うようなものを作ることができません。 VBAを使って自動でしたい内容は以下の点です。 1)作成する「商品コード一覧」の保存ファイル名を任意に設定できるようにする。  ・エクセルシートの(A1)セルに任意に入力(手作業で) 2)色のコードはあらかじめセル(4種×6面で24個のセル)に入力しておく(手作業で)  ・エクセルシートのA列に、たてに24個を入力  ・セル( A3~ A6)にA面の色コード  ・セル( A8~A11)にB面の色コード  ・セル(A13~A16)にC面の色コード  ・セル(A18~A21)にD面の色コード  ・セル(A23~A26)にE面の色コード  ・セル(A28~A31)にF面の色コード 3)作成する商品コードの「数」を指定する  ・基本的に400ですが、任意の数値を指定できるようにする  ・作成する数を400にしても500にしても、どの色コードも平均的に使用するようにしたい 4)「商品コード一覧」をテキストデータで保存する  ※商品コードごとに改行する(400個にした場合、400行のテキストデータ) 5)テキストデータの形    保存ファイル名,商品コード1    保存ファイル名,商品コード2    保存ファイル名,商品コード3    保存ファイル名,商品コード4     ・     ・    保存ファイル名,商品コード400  ※各行の先頭には「保存ファイル名」←セル(A1)に入力したもの   ↑どの行にも同じ「保存ファイル名」を入れる  ※保存ファイル名を商品コードの間にカンマを入れる 以上、よろしくお願い申し上げます。

  • VBA 検索するSheetの位置の変更

    現在、グループの数だけユーザー名の合計数をSheet2に抽出するという 事をやっているのですが....... コードの方は下記になります Sub Sample3() Dim i As Long, j As Long, k As Long, lastRow As Long, lastCol As Long Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet1") Set wS3 = Worksheets("Sheet2") Application.ScreenUpdating = False If wS2.Range("Y1") = "" Then wS2.Range("Y1") = "ダミー" End If With Worksheets("Sheet1") If .Range("A4") = "" Then .Range("A4") = "ダミー" End If lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(5, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("B:B"), _ wS2.Cells(7, (i - 2) * 8 + 3)) If WorksheetFunction.CountIf(wS2.Columns((i - 2) * 8 + 2), wS2.Cells(k, (i - 2) * 8 + 2)) > 1 Then wS2.Cells(k, (i - 2) * 8 + 2).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("B1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole .Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole wS3.Cells.Clear .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub このコードで検索をかけるSheet1のセルBの文字をセルCに移動して検索かけたいという事なのですが、下記の用なコードでBをCに変更してみた結果エラーが発生してしまいます。 lastRow = .Cells(Rows.Count, "C").End(xlUp).Row Range(.Cells(5, "C"), .Cells(lastRow, "C")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("C:C"), _ どなたかご教授の方お願い致します。

  • エクセルVBAで範囲を変数で設定する方法?

    Dim i As Integer For i = 1 to 50 とした場合、 セルであれば Sheets("Sheet2").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2) のように変数を使えますが、範囲に使う場合にはどう書けばいいのでしょうか? 例えば、 Sheets("Sheet2").Range("A1:G1").Value = Sheets("Sheet1").Range("A1:G1") のような式で、行数を変数にする場合です。 よろしくお願いします。

  • エクセルVBAで困っています。

    Excell2003でマクロを作成したのですが、思うような結果が出なくて困っています。 どなたかお力をお貸しください。 お願いします。 【作成したマクロ】 Sub テスト()   myPath = ThisWorkbook.Path   buf = Dir(myPath & "¥データ¥" & "*.xls")   Do While buf <> ""     Target = "'" & myPath & "[" & buf & "]Sheet1'!R1C1"     i = i + 1     Cells(i, 1) = buf     Cells(i, 2) = ExecuteExcel4Macro(Target)     buf = Dir()   Loop End Sub 【設定状況】 ・デスクトップ上に "サンプル.xls" があり、ThisWorkBookに上記マクロを書きました。 ・デスクトップ上に "データ" というフォルダがあり、その中に、"Book1.xls" と "Book2.xls" があります。 ・"Book1.xls" のSheet1のRange("A1")には "あいうえお" が入力されています。 ・"Book2.xls" のSheet1のRange("A1")には "かきくけこ" が入力されています。 【マクロ実行結果】 ・Range("A1") ・・・ Book1.xls ・Range("B1") ・・・ #REF! ・Range("A2") ・・・ Book2.xls ・Range("B2") ・・・ #REF! となってしまいます。 【求めたい結果】 ・Range("A1") ・・・ Book1.xls ・Range("B1") ・・・ あいうえお ・Range("A2") ・・・ Book2.xls ・Range("B2") ・・・ かきくけこ よろしくお願いします。

  • エクセル2000VBA 情報の検索について

    いつもお世話になります。 sheet1は商品情報検索画面で、sheet2は、データのマスターです。 sheet1のセル"D4"に商品コードを入力し、マクロを起動することで、sheet2の商品コード(A列)の同じ情報を検索し、その次のセルの商品コードを表示させたいのです。(ややこしくてすみません) 自分なりに考えてコードを作ってみたのですが・・・ Dim sh2, sh3 As Worksheet Dim temp As Variant Set sh2 = Worksheets("sheet2") Set sh3 = Worksheets("sheet1") d = sh2.Range("A1").CurrentRegion.Rows.Count Set temp = sh2.Range("A2:A" & d).Find(What:=sh3.Range("D4").Value) For l = 2 To d If Not temp Is Nothing Then sh3.Range("D4").Value = sh2.Cells(l, 1).Offset(1, 0).Value ElseIf temp Is Nothing Then sh3.Range("D4").Value = sh2.Range("A2").Value End If Next l 以上だと、次々に情報が更新され、結局最終行の空白が答えになってしまいます。 以上宜しくお願い致します。

  • Excel VBA 選択した範囲の1行目に色を付けたい

    VBA初心者です。 セルB4~F15に表が作成されています。 プロシージャを実行して、セルB5~F15にブルー。表1行目のセルB4とF4のみに赤の色を付けるというコードを記述したいのです。 以下のように記述しました。 Sub セルに色()    Range("B4").Select    ActiveCell.CurrentRegion.Select    Selection.Interior.ColorIndex = 8    Selection.Range(Cells(1, 1),Cells(1,5)).Interior.ColorIndex = 3 End Sub Rangeでは連続シートになるため、Unionに変更してみましたが、 Unionはオブジェクトがサポートされていない旨のエラーが出ました。 どのように記述すればよいでしょうか? どうぞよろしくお願いいたします。