Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2531 / 13646 ツリー ←次へ | 前へ→

【67452】VBAからWorkSheet関数の利用方法について 夜勤当直者 10/12/5(日) 20:27 質問[未読]
【67453】Re:VBAからWorkSheet関数の利用方法につ... りん 10/12/5(日) 21:12 発言[未読]
【67454】Re:VBAからWorkSheet関数の利用方法につ... kanabun 10/12/5(日) 21:21 発言[未読]
【67455】Re:VBAからWorkSheet関数の利用方法につ... UO3 10/12/6(月) 7:33 発言[未読]
【67456】Re:VBAからWorkSheet関数の利用方法につ... UO3 10/12/6(月) 8:59 発言[未読]

【67452】VBAからWorkSheet関数の利用方法につ...
質問  夜勤当直者  - 10/12/5(日) 20:27 -

引用なし
パスワード
   お世話になります。

 VBAからExcelのchar関数を利用するため、以下のコードを動かしてみたら、
エラーがでました。どこに間違っているのか?わからなくて、困っています。
よろしくお願いします。

ちなみに、I=1〜26の場合は、
        kakuの値:A,B・・・Z
     I=27〜52の場合は、
        kakuの値:AA,AB・・・AZ
     I=53〜78の場合は、
        kakuの値:BA,BB・・・BZ
     の結果を求めたいです。  

Dim kaku(1 To 78) As String
Dim I, I1 As Integer
For I = 1 To 78
 Select Case I
     Case I <= 26
      For I1 = 65 To 90
        kaku(I1) = char(I1)    kakuの値:A,B・・・Z
      Next I1
     Case I > 26 And I <= 52
      For I1 = 65 To 90
        kaku(I1) = "A" & char(I1) kakuの値:AA,AB・・・AZ
      Next I1
     Case I > 52
      For I1 = 65 To 90
        kaku(I1) = "B" & char(I1) kakuの値:BA,BB・・・BZ
      Next I1
  End Select
Next I
End Sub

【67453】Re:VBAからWorkSheet関数の利用方法に...
発言  りん E-MAIL  - 10/12/5(日) 21:12 -

引用なし
パスワード
   夜勤当直者 さん、こんばんわ。
>
> VBAからExcelのchar関数を利用するため、以下のコードを動かしてみたら、
>エラーがでました。どこに間違っているのか?わからなくて、困っています。
>よろしくお願いします。
Char関数を利用しなくても、VB(A)のCHR関数で大丈夫です。

ループしている理由がよくわからないので、
Sub test1()
  Dim kaku(1 To 78) As String
  'ko,
  For I = 1 To 78
    Select Case I
      Case Is <= 26
        kaku(I) = Chr(I + 64)  '  kakuの値:A,B・・・Z
      Case Is <= 52
        kaku(I) = "A" & Chr(I - 26 + 64) 'kakuの値:AA,AB・・・AZ
      Case Else
        kaku(I) = "B" & Chr(I - 52 + 64) 'kakuの値:BA,BB・・・BZ
    End Select
    'イミディエイトウィンドウに結果を表示
    Debug.Print I, kaku(I)
  Next I
End Sub


列のアルファベットのようなので、

Sub test2()
  Dim kaku(1 To 78) As String
  '
  For I = 1 To 78
    kaku(I) = Replace(Cells(1, I).Address(False, False), "1", "")
    Debug.Print I, kaku(I)
  Next I
End Sub
こんな方法も。

【67454】Re:VBAからWorkSheet関数の利用方法に...
発言  kanabun  - 10/12/5(日) 21:21 -

引用なし
パスワード
   ▼夜勤当直者 さん:
おじゃまします

>エラーがでました。どこに間違っているのか?わからなくて、困っています。

とりあえず、構文エラーをなくすために、
ワークシート関数 CHAR() は VBAで Chr$関数にしましょう
また
>Dim I, I1 As Integer
は I のあとにも、As Integerを指定しないと、単にVariant型です。

Sub QT()
Dim kaku(1 To 78) As String
Dim I As Long, I1 As Long
For I = 1 To 78
 Select Case I
     Case Is <= 26
      For I1 = 65 To 90
        kaku(I1) = Chr$(I1)   ' kakuの値:A,B・・・Z
      Next I1
     Case 27 To 52
      For I1 = 65 To 90
        kaku(I1) = "A" & Chr$(I1) ' kakuの値:AA,AB・・・AZ
      Next I1
     Case Is > 52
      For I1 = 65 To 90
        kaku(I1) = "B" & Chr$(I1) ' kakuの値:BA,BB・・・BZ
      Next I1
  End Select
Next I
End Sub

これで、コンパイルは通ると思いますが、配列の要素数が足りなくて
実行時エラーになりますね?


>ちなみに、I=1〜26の場合は、
>        kakuの値:A,B・・・Z
>     I=27〜52の場合は、
>        kakuの値:AA,AB・・・AZ
>     I=53〜78の場合は、
>        kakuの値:BA,BB・・・BZ
>     の結果を求めたいです。

ということからすると、こうですかね?

Sub try()
 Dim kaku(1 To 78) As String
 Dim I As Long
 Dim S As String
 
 For I = 1 To 26
   S = Chr$(&H40 + I)
   kaku(I) = S      ' kakuの値:A,B・・・Z
   kaku(I + 26) = "A" & S ' kakuの値:AA,AB・・・AZ
   kaku(I + 52) = "B" & S ' kakuの値:BA,BB・・・BZ
 Next I
 
'確認
 For I = 1 To 78
   Debug.Print kaku(I),
 Next
End Sub

【67455】Re:VBAからWorkSheet関数の利用方法に...
発言  UO3  - 10/12/6(月) 7:33 -

引用なし
パスワード
   ▼夜勤当直者 さん:

おはようございます

構文も含め、ロジックについてはknabunさんからお答えが出ていますので別のことを。

1.VBAでも、ワークシート関数を利用することができますね。ただし、
 ・記述の際は、WorksheetFunction.関数 と、頭に Worksheet. をつける必要があります。
  (Application. をつけることもできますが、ややこしくなるので割愛)
 この関数はVBAの関数ではなく、ワークシートの関数だよということをVBAに教えてやるためです。
2.で、何でもかんでも使えるかというと、残念ながら、VBAで使えるワークシート関数は限定されています。
 VBE画面でヘルプの検索欄に WorkSheetFunction といれますと、
 Visual Basic でワークシート関数を利用する というものがでてみますので、ここをクリックすると
 説明があります。この説明のページの説明文の最初に
 使用できるワークシート関数の一覧を表示するには、ここをクリックしてください。
 というところがあります。ここで、利用できる関数に一覧を見ることができます。

で、残念ながら(?) CHAR は 利用できないんです。

【67456】Re:VBAからWorkSheet関数の利用方法に...
発言  UO3  - 10/12/6(月) 8:59 -

引用なし
パスワード
   追伸です。

kanabunさんからループ回数を最も少なくした効率のいいコードがアップされているわけですが
オリジナルの構文の誤りを認識いただくには、以下のSample1も参考になるのかもしれません。
また、この範囲であればSample2のような処理も。
もし、夜勤当直者さんの目的が列番号を与えて列コードを取得するということであれば
GetColName といったファンクションプロシジャを書いておいて、
文字列変数 = GetColName(125) といったように取得することもできますね。

Sub Sample1()
 Dim kaku(1 To 78) As String
 Dim I As Integer
 For I = 1 To 78
  Select Case I
   Case 1 To 26
     kaku(I) = Chr$(I + 64)      'kakuの値:A,B・・・Z
   Case 27 To 52
     kaku(I) = "A" & Chr$(I - 26 + 64) 'kakuの値:AA,AB・・・AZ
   Case Else
     kaku(I) = "B" & Chr$(I - 52 + 64) 'kakuの値:BA,BB・・・BZ
   End Select
 Next I
End Sub

Sub Sample2()
 Dim kaku(1 To 78) As String
 Dim I As Integer
 For I = 1 To 78
  kaku(I) = Split(Columns(I).Address(False, False), ":")(0)
 Next I
End Sub


Function GetColName(col As Integer) As String
 Select Case col
  Case 1 To Columns.Count
   GetColName = Split(Columns(col).Address(False, False), ":")(0)
  Case Else
   GetColName = "#N/A"
 End Select
End Function

2531 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free