重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

パスワードランダム生成のVBAを作成してみたのですが、生成個数が8個まではうまくいくのですが、9個以上に設定すると1004エラーになってしまいます。
どのような原因が考えられますでしょうか?
以下にExcelシートとマクロの内容を示します。
1)Excelシート
 添付画像「sheet,jpg」で作成しました。
 C3セルにパスワード生成個数を設定しますが、8までは正常に処理されますが、9以上だとエラーになります。

2)VBA内容
以下の内容で設定しました
「main.Range("B" & MaxRow + 1) = GeneratePassword(iLength, True, True, True, True, True, True, True, True)」の部分でエラーになってます。
※Office365で作成しました
------------------------------------------------------------------
Sub メイン設定()
Dim MaxRow As Integer
Dim iLength As Integer
Dim m As Long

iLength = Cells(4, 3) 'パスワードの文字数
KOSUU = Cells(3, 3) 'パスワードの発行数
For m = 1 To KOSUU

'データ入力されているB列の最終行を取得する
MaxRow = main.Cells(Rows.Count, 2).End(xlUp).Row

'最終行+1行目のB列にパスワード生成しセットする
main.Range("B" & MaxRow + 1) = GeneratePassword(iLength, True, True, True, True, True, True, True, True)

Next m

MsgBox "完了"
End Sub
Sub ボタン1_Click()

End Sub
Private Function GeneratePassword(iLength As Integer, Optional bAllowLower As Boolean = True, Optional bAllowUpper As Boolean = True, _
Optional bAllowNumber As Boolean = True, Optional bAllowSymbol As Boolean = False, Optional bRequireLower As Boolean = True, _
Optional bRequireUpper As Boolean = True, Optional bRequireNumber As Boolean = True, Optional bRequireSymbol As Boolean = False) As String
Dim sPassword As String
Dim m As Long
Dim sTotalChars As String
Dim sSymbols As String

' パスワード文字列定義(大文字・小文字・数字) 記号は上で定義
Const S_LOWER As String = "abcdefghijklmnopqrstuvwxyz"
Const S_UPPER As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const S_NUMBER As String = "0123456789"
'Const sSymbols As String = "!#$%&()=^-|@[]{}:;,."
sSymbols = main.Range("C5")

' 使用可能文字種
If bAllowLower Then
sTotalChars = sTotalChars & S_LOWER
End If
If bAllowUpper Then
sTotalChars = sTotalChars & S_UPPER
End If
If bAllowNumber Then
sTotalChars = sTotalChars & S_NUMBER
End If
If bAllowSymbol Then
sTotalChars = sTotalChars & sSymbols
End If

For i = 1 To iLength - Abs(bRequireLower + bRequireUpper + bRequireNumber + bRequireSymbol)
sPassword = sPassword & Mid(sTotalChars, Int(Len(sTotalChars) * Rnd + 1), 1)
Next i

' 必須とされる文字種の文字を1文字ずつ挿入
If bRequireLower Then
m = Int((Len(sPassword) + 1) * Rnd + 1)
sPassword = Mid$(sPassword, 1, m - 1) & Mid(S_LOWER, Int(Len(S_LOWER) * Rnd + 1), 1) & Mid$(sPassword, m)
End If
If bRequireUpper Then
m = Int((Len(sPassword) + 1) * Rnd + 1)
sPassword = Mid$(sPassword, 1, m - 1) & Mid(S_UPPER, Int(Len(S_UPPER) * Rnd + 1), 1) & Mid$(sPassword, m)
End If
If bRequireNumber Then
m = Int((Len(sPassword) + 1) * Rnd + 1)
sPassword = Mid$(sPassword, 1, m - 1) & Mid(S_NUMBER, Int(Len(S_NUMBER) * Rnd + 1), 1) & Mid$(sPassword, m)
End If
If bRequireSymbol Then
m = Int((Len(sPassword) + 1) * Rnd + 1)
sPassword = Mid$(sPassword, 1, m - 1) & Mid(sSymbols, Int(Len(sSymbols) * Rnd + 1), 1) & Mid$(sPassword, m)
End If

GeneratePassword = sPassword

End Function

「エクセルVBAで1004エラーになります」の質問画像

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

  • 早々のご回答ありがとうございます。
    言葉足らずで申し訳ありません。
    Excelのシートのオブジェクト名を「main」で設定しておりました。
    その後私の方でも検証したのですが、C3セルの個数設定とC4セルの記号の設定の仕方によってエラーが出たり出なかったりしました。
     エラーにならない 個数150 記号 '!#$&()^-
     エラーになる   個数150 記号 '!#$%&()=^-<>@[]{}:;,.?\*
    エラーになる・ならないの理由がわかればを教えて頂けますと幸いです。
    ※私の方でも引き続き確認します
    よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/04/11 08:26

A 回答 (2件)

GeneratePasswordから返されるパスワードの先頭の文字が=の時に


この現象が発生しています。
=○○
とすると、関数式の設定とexcelが誤判断しています。

main.Range("B" & MaxRow + 1) = "'" & GeneratePassword(iLength, True, True, True, True, True, True, True, True)

とすれば、この現象は回避できます。

参考までに
dim ans as string
ans = GeneratePassword(iLength, True, True, True, True, True, True, True, True)
main.Range("B" & MaxRow + 1) = ans
として実行すると、
main.Range("B" & MaxRow + 1) = ans でエラーになります。
その時の、ansの内容を参照すると、先頭に=があることがわかります。

蛇足ですが、本件とは直接関係ありませんが、
iLength = Cells(4, 3) 'パスワードの文字数
KOSUU = Cells(3, 3) 'パスワードの発行数

iLength = main.Cells(4, 3) 'パスワードの文字数
KOSUU = main.Cells(3, 3) 'パスワードの発行数
にしておいたほうが、良いかと思います。
main以外のシートを表示して実行すると、誤動作します。
    • good
    • 0
この回答へのお礼

ありがとうございます!
頂いた内容で修正したところエラーが出なくなりました。
なるほど、記号に「=」を使っていると計算式をご認識するのが原因だったのですね。見落としておりました。
またCellsでオブジェクト名を明示して指定することについても承知しました。誤作動防止で明示的に指定します。

短期間で解決できて感謝です!
また何かございましたらよろしくお願いいたします。

お礼日時:2025/04/11 09:51

こちらで、提示されたマクロをコピペして、そのまま実行しました。


Sub メイン設定()の
MaxRow = main.Cells(Rows.Count, 2).End(xlUp).Row
で、実行時エラー'424' オブジェクトが必要です。
のエラーになります。

提示されたエラーにはなりません。
mainの定義はどこで行われていますか?
又、mainに値をどのように設定されていますか?
この回答への補足あり
    • good
    • 0

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

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


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