計算したい内容はたとえば「atccggata」というようなATCGからなるランダムな配列があったとして、これのA,Tの数、G,Cの数をカウントして、以下のような計算をしたいです。
文字列の長さ(n)が17以上なら→4×(G+C)+2×(A+T)
文字列の長さ(n)が18以上なら→60.8+41×(G+C)/n-(500/n)
という計算です。
上記の例の場合、n=9,G+C=4,A+T=5なので、26になるはずです。
「ggcatagacatttacaggcc」ならn=20,GC=10,AT=10で56.3となる計算です。
状況としては、プライマーの配列がExcelに150個ほどあって、それに関していちいちGenetyxなどでTm値計算するのが面倒ということです。面倒くさがりといえばそうなのですが、なにかうまいやり方をご教授いただけたらと思います。ちなみに私、マクロに関しては「そういうものがある」ぐらいしか知識がありませんもので、もしマクロを使う必要があるならばコードなどを書いていただけたらありがたいです。よろしくお願いします。
A1に「atccggata」があったとして 以下で どうでしょうか?
=IF(LEN(A1)<=17,LEN(A1)*12-LEN(SUBSTITUTE(A1,"g",""))*4-LEN(SUBSTITUTE(A1,"c",""))*4-LEN(SUBSTITUTE(A1,"a",""))*2-LEN(SUBSTITUTE(A1,"t",""))*2,60.8+41*(LEN(A1)-LEN(SUBSTITUTE(A1,"g",""))+LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))/LEN(A1)-(500/LEN(A1)))
ちなみに
文字列の長さ(n)が17以上なら
文字列の長さ(n)が18以上なら
とありますが
17文字以下ならば としました。
もし 17文字以上ならば 18文字のときは どちらの計算式になるのか 不明だからです。
あと
LEN(A1)-LEN(SUBSTITUTE(A1,"a",""))
が a の文字数となります。
これを 使えば 計算式を組み立てるのは 簡単ですよね。
マクロは得意じゃないということで関数で無理やり書いてみます。
データが入ったセルをA1として
=IF(LEN(A1)>17,60.8+41*(LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(A1,"c",""),"g","")))/LEN(A1)-(500/LEN(A1)),60.8+41*(LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(A1,"c",""),"g","")))/LEN(A1)-(500/LEN(A1)))
というのがセル内の特定文字を数えるテクニックだったんですね。
やっぱり内蔵されている関数について熟知していないと無駄なマクロや関数を書くことになるんですね・・・
VBでは条件式の部分で
(num=InStr(Genetyx,"a"))<>0
というのは無理なんですかね?
(=が代入演算子ではなく比較演算子になってしまう?)
(num=InStr(Genetyx,"a"))<>0
というのは無理なんですかね?
条件のところで 代入は できないですね。
ただ、関数を 条件に使うことは 可能です。
その関数内で代入ということは できます。
takntさんと見比べると最初の等式が LEN(A1)<=17 で逆でしたね。
というか、takntさんと同じもの作ったつもりだったが、間違ってコピペしたようね。