• ベストアンサー

VBAについて教えてください。

職場のエクセルのVBAを見ていたら、下記のように書かれていました。VBAを勉強し始めたばかりで何が書かれているのか解りません。 お手数ですが教えてください。よろしくお願いします。 Function F_Crypt(Data As Long, Seed As String) As Long Dim i As Long, j As Integer, act1 As Long, act2 As Long, iSeed As String If Len(Seed) > 3 Then j = 3 Else j = Len(Seed)

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

順番が逆になりますが先にこちらから。 Dim i As Long, j As Integer, act1 As Long, act2 As Long, iSeed As String 変数の宣言が行われています。 変数とはプログラム中で、自由に値を保存しておくことができる入れ物をさします。 VBでの変数の宣言方法は、 Dim 変数名 AS 変数のタイプ したがって、 Dim i As Longはiが変数名でLongが変数のタイプとなります。 Dim i As Long, j As Integer のように,区切りで記述することもできますし、 Dim i As Long Dim j As Integer のように宣言することもできます。 変数のタイプには Integer 整数型 2byte Long 長整数型 4byte String 文字列型 格納した文字列により変動 Date 日付型 8byte Double 倍精度浮動小数点数型 8byte などなどあります。 変数の宣言の仕方にはDim以外にもPrivate,Public,Staticがあります。 変数の参照範囲を宣言時に指定しています。 宣言したプロシージャまたは関数内での参照に限定したものをDimで宣言します。 Privateはモジュール内での参照に限定され、Publicはプログラム内からの参照となります。 StaticはDimと同じ参照限定ですが、Dimがプロシージャが終了した段階で、クリアされるのに対し、Staticは値が保持されるという違いがあります。 Function F_Crypt(Data As Long, Seed As String) As Long 関数であることを宣言しています。 VBでは プロシージャ(処理)と呼ばれるSubと ファンクション(関数)と呼ばれるFunctionの大きく分けて二つに処理を記述していくことになります。 一般にプログラムは複数の処理や関数の集合体であり、相互に参照しあったり、して成り立っています。 構文として、 Function 関数名(引数) AS 戻り値のタイプ したがってF_Cryptが関数を呼び出すための関数名、Dataは長整数型の引数、Seedは文字列型の引数、F_Cryptの戻り値は長整数型ということがわかります。 つまり、F_Cryptという関数は、二つの引数を使用し、長整数型の数字を求めてくれるという意味をあらわしています。 最後に If Len(Seed) > 3 Then j = 3 Else j = Len(Seed) ここでは If 条件文 THEN 処理 End If または If 条件文 THEN 処理 の構文を使用しています。 Len関数も使用されていますね。 先にLen関数から、 Len(文字列) ※実際は文字列でなくても動きます。 文字列の長さを返してくれる関数です。 If Len(Seed) > 3 Then j = 3 Else j = Len(Seed) を処理を言葉で捕らえて見ましょう。 もし、Seedの長さが3より長いときは、jを3にします。 それ以外の場合、jをSeedの長さにします。 という理解になるでしょう。 要約すると、jにはSeedの長さを格納したいが、3を最大値とし、Seedの長さが3を超える場合は3として扱う。 となります。

makoto30
質問者

お礼

丁寧な回答ありがとうございます。 自分の不勉強さを痛感しています。 まだまだ、勉強不足です。 もっと頑張ります。 どうも、ありがとうございました。

その他の回答 (1)

  • taka37777
  • ベストアンサー率30% (166/544)
回答No.1

これだけだと何をやっているか分かりませんが。 エクセルのVBAでF_Cryptを呼び出しているところがあるはずです。ファンクションの名前から暗号化に関するものなのでしょうか? F_Cryptに2つの引数が渡されていて、Seedに入っている文字の数が3より大きいときj=3、それ以下の場合文字の数入れているという事になります。

makoto30
質問者

お礼

お礼が遅くなってすいません。 どうもありがとうございました。 まだまだ勉強不足です。もっと頑張ります。

関連するQ&A

  • エクセルVBAについて

    現在、エクセル2010を使用し文字色が黒だったら1と加算しそれ以外は0というVBAを VBA素人ながら、コピペしながら組んでいました。 以下 'ColorIndex = 1 は、黒です 3は赤 黄色は7 青は 5 '============================================ Function fcolor(a As Range, b As Integer) Dim c As Range, cu As Integer, frg As String Application.Volatile For Each c In a With c.Font If b = 1 Then If .Color = vbBlack Then cu = cu + 1 Else If .ColorIndex = b Then cu = cu + 1 End If End With Next fcolor = cu End Function という風にし、範囲を=fcolor(D3:E37,1)としていますが、 本当なら”0”と表記されるべきなのですが”66”となってしまいます。 VBAど素人なのでよろしくお願いします。

  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • VBAを使ってファイルを圧縮したい

    こんばんは。 他の方の質問ですが http://oshiete1.goo.ne.jp/qa2405614.html を参考にVBAでエクセルファイルの圧縮に挑戦しています。 しかしうまくいきません。 なのでご教授お願いします。 エクセルの標準モジュールに 下記のコードを載せました。 //////////////////////////////////////////////////////////////////////// 'Option Explicit Private Declare Function Zip Lib "Zip32j" (ByVal hWnd As Integer, ByVal szCmdLine As String, ByVal szOutPut As String, ByVal dwsize As Integer) As Integer Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub testZip() 'Zip32 による圧縮 Dim Filename As String Dim strArchiveName As String Dim strCommand As String Dim RC As Long Dim hWnd As Long Dim strOutPut As String * 512 Dim lngSize As Long 'ハンドル取得 hWnd = FindWindow("XLMANI", Application.Caption) 'ファイル名取得 Filename = myDeskTopPath & "\Book1.xls" If Filename = "False" Then Exit Sub Filename = Mid$(Filename, InStrRev(Filename, "\") + 1) strArchiveName = Mid$(Filename, InStrRev(Filename, "\") + 1, InStrRev(Filename, ".") - InStrRev(Filename, "\") - 1) & ".zip" strCommand = "-u " & strArchiveName & " " & Filename lngSize = Len(strOutPut) RC = Zip(hWnd, strCommand, strOutPut, lngSize) 'Debug.Print strOutPut End Sub Function myDeskTopPath() ' 実行時の デスクトップパス取得 Dim MyWSH As Object Set MyWSH = CreateObject("WScript.Shell") myDeskTopPath = MyWSH.SpecialFolders("Desktop") Set MyWSH = Nothing End Function //////////////////////////////////////////////////////////////////////// そして「Zip32j 」がないので http://www.vector.co.jp/soft/win95/util/se062163.html からダウンロードしました。 しかし、 「 RC = Zip(hWnd, strCommand, strOutPut, lngSize)」 の部分で、 「ファイルが見つかりません。 (Error 53)」 になります。 ダウンロードした「zip3j037」はフォルダごとデスクトップに置いています。 ただこれをダウンロードしただけではダメなのでしょうか? エラーの原因がわかりません。 よろしくお願いします。

  • VB 2008: Do Whie...Loop文について

    Function FileGetChar(ByVal f As String, ByVal p As Integer) As String   Dim i As Integer = 1   Dim j As Integer = 0   Dim l As Integer   Dim n As Integer = FreeFile()   Dim c As Char   If File.Exists(f) Then     FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)     l = FileLen(f)     Do While (i + j <= l)       FileGet(n, c, i + j)       j = j - (Math.Abs(Asc(c)) > 255)       i = i + 1       If i > p Then         Exit Do       Else         c = ""       End If     Loop     FileClose(n)   End If   Return c End Function [イミディエイトウインドウ] ? FileGetChar("D:\Temp\Test.txt",1) "1" ? FileGetChar("D:\Temp\Test.txt",2) "2" と、一応は動作しています。 l------->ファイル長 i+j----->読み込みのカレントポジション p------->読み込み指示ポジション 今、悩んでいるのはDo...Loop文中のIf Else End If の追放。 何か妙手があれば教えて頂きたい。

  • エクセルVBAの実行スピードが落ちます

    エクセルで検索を行うVBAを使用していますが、エクセル立ち上げ時はサクサク動きますが、検索を繰り返し使っていくと、実行速度が落ちてしまいます。 エクセルを再起動すれば、元どおりの速さに戻ります。 何が原因でしょうか?どうすれば防ぐことはできるでしょうか? よろしくお願い申し上げます。 実行環境 WindowsXPproSP3 Pen4 3.0Ghz メモリ1GB HDD80GB Office2003 VBAの検索部分 Function Kensaku3(Key1 As String, Range1 As String) As Long '縦方向の検索   Dim myRng As Range   Dim Job1 As String   Dim Col1 As Long   Dim Row1 As Long   Col1 = Range(Range1).Column   Row1 = Range(Range1).row   Cells(Row1, Col1).Select   Set myRng = Range(Range1).Find(what:=Key1, _     After:=ActiveCell, LookIn:=xlValues, _     LookAt:=xlPart, SearchOrder:=xlByRows, _     SearchDirection:=xlNext, MatchCase:=False)   If myRng Is Nothing Then     Kensaku3 = 0   Else     Kensaku3 = myRng.row   End If   Set myRng = Nothing End Function

  • ▲ExcelのVBA▼困っています

    何度もVBAで質問させてもらい助けてもらっています。 懲りずにまた質問ですが… 下のプログラムは"●"が跳ね返るものなのですが… ●の後を■と▲が追うようなプログラムにするには なにを追加すればいいのでしょうか…?; どなたか教えて下さい;;お願いします;; Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim maru As String, yoko As String, tate As String Sub 描画() Cells(X, Y).Value = maru End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() maru = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  • vbaで複数のパターンのファイル名を読み込みたい

    例えば、11.jpg~79.jpgの画像を読み込むとします。 これをvbaで記述すると j & i & ".jpg" となります(1の位と10の位の数字は独立していると考えてください) これを、1-1.jpg~7-9.jpg といった形式をvbaで記述すると、 j & "-"& i & ".jpg" となります。 これをvbaで記述させるときに、これをA1のセルに「ji」や、「j-i」や、「i」、「j」と入力させたときに様々なパターンに対応させたいと考えております。 (他の方法でもいいです。やりたいことは、複数パターンのファイル名に対応させたいという事です。) いちいち、写真のファイル名のパターンが違うたびにコード書き直すのも面倒ですし、プログラムわからない人には読み込ませることすらできないです。 4パターンだったら、if文で分けちゃえば?という人もいるでしょうが、それは最終手段として残しておきたいです(プログラムがえらい長くなり、後々の修正が大変だし、パターンが増えるたび追加しなければならないので) せめて、C言語のように#defineによる置き換えができれば、 #define PATARN j & "-"& i として、「一か所のみ修正すれば楽ちん」みたいなことができればいいんですけれども、 VBAで、C言語の#defineに該当するものが何かよくわかりません。 (プログラム本文にはPATARNに該当する箇所が何か所かあるので、修正が大変なんです) もし必要ならと思い、ソースの一部を書いておきます(主要なところだけ残して、後はざっくり削除しています) やってることは、写真を挿入して、規則的に並べて、JPEG変換しています (下のコードは写真の挿入のみ) Sub 写真挿入→JPEG変換() On Error Resume Next Dim flag As Integer Dim xoffset As Integer Dim yoffset As Integer Dim Ystart As Integer Dim i As Integer Dim j As Integer Dim Xstart As Integer Dim str As String Dim Er As String Xstart = 1 Dim Xend As Integer Dim Yend As Integer flag = 0 xoffset = 1 yoffset = 1 Ystart = 1 Yend = 6 Xend = 6 Application.ScreenUpdating = False For j = Xstart To Xend For i = Ystart To Yend ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _ j & i & ".jpg").Select If i = Yend Then Else If flag = 0 Then ActiveCell.Offset(yoffset, 0).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(0, xoffset).Range("A1").Select End If End If Next If flag = 0 Then ActiveCell.Offset(-(Yend - Ystart) * yoffset, xoffset).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(yoffset, -(Yend - Ystart) * xoffset).Range("A1").Select End If Next Application.ScreenUpdating = True End Sub

専門家に質問してみよう